网络安全从入门到精通(第九章-4) unserialize反序列化漏洞

本文内容:

  • 什么是发序列化
  • 小技巧函数
  • 魔术方法和反序列化利用

 

1,什么是反序列化:

  1.什么是序列化:

    是将对象的转台信息转换为可以存储或传输的形式的过程[将状态信息转换为字符串]。

  2.什么是反序列化:

    反序列化就是再将这个状态信息拿出来使用[将字符串转换为状态信息]。

  3.状态信息:

    对象、类、数组、变量、自定函数等。

  4.反序列化漏洞:

    可以任意控制反序列化处理的字符串,就是反序列化漏洞。

2,小技巧函数:

  1.__FILE__:获取当前文件路径。

  2.show_source():显示文件源码。

  3.print_r():可以输出非字符串,如对象,数组等。

  4.serialize:序列化,将对象状态信息转化为字符串。

  5.unserialize:反序列化,将字符串转化为对象的状态信息。

  举例:

    show_source(__FILE__) :查看当前文件的内容[源码]

    show_source("x.php") :查看x.php文件的内容[源码]

    serialize():将对象转变成字符串:   

      <?php
      show_source(__FILE__);
      class aa {
      var $b = '123';
      }
      $class1 = new aa; 新建对象
      $class1_ser=serialize($class1);  序列化
      var_dump($class1_ser);
      ?>

      运行结果:O:2:"aa":1:{s:1:"b";s:3:"123":}

      解释:

        O表示object对象。

        2表示对象的名称有2个字符。

        aa对象名称,1表示只有一个值

        s表示字符串1表示变量名字长度

        s表示字符串3表示变量值的长度

    unserialize():可以从序列化后的结果中恢复对象[object]。    

      <?php
      show_source(__FILE__);
      class aa {
      var $b = '123';
      }
      $class2 = 'O:2:"aa":1:{s:1:"b";s:3:"124";}' ;
      $class2_ser=unserialize($class2);  反序列化
      var_dump($class2_ser);
      ?>

      运行结果:aa Object([b] => 124)

3,魔术方法和反序列化利用:

  1.__construct():当对床创建[new]时会自动调用,但是在unserialize()时是不会调用的。

  2.__destruct():当对象被销毁时会自动调用。

  3.__wankeup():如前所提:unserialize()时自动调用。

注意:

本质上serialize()和unserialize()在php内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。 

当unserialize()的参数可控时,那么用户就可以注入精心构造的payload,当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。

 

posted @ 2020-04-24 10:49  TheHIde  阅读(349)  评论(0编辑  收藏  举报