考点: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
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)被序列化
Soap原生类被以 php_serialize
形式处理 写入 $_SESSION['name']
再次刷新 以 默认序列化形式反序列化 session_start()
触发session反序化漏洞
可以明确看到 value 被还原为 SoapClient
类
现在想办法触发 SoapClient
类 不存在的方法 从而触发 call()
实现请求
而 call_user_func
可以传入一个数组 array(类名,方法)
实现类的方法调用
a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
可以用extract
变量覆盖掉 $b
为call_user_func
触发Soapclient
方法
接着携带session对应的cookie 即可回显flag