反序列化-学习笔记

漏洞简介·魔法函数

  • php中有一类特殊的方法叫“Magic function”,就是我们常说的”魔术方法” 这里我们着重关注一下几个:
  • __construct():构造函数,当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。
  • __destruct():析构函数,类似于C++。会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,当对象被销
    毁时会自动调用。
  • __wakeup():如前所提,unserialize()时会检查是否存在 __wakeup(),如果存在,则会优先调用 __wakeup()方法。
  • __toString():用于处理一个类被当成字符串时应怎样回应,因此当一个对象被当作一个字符串时就会调用。
  • __sleep():用于提交未提交的数据,或类似的清理操作,因此当一个对象被序列化的时候被调用。

漏洞场景

从运行结果来看,我们可以看出unserialize函数是优先调用__wakeup()再进行的反序列化字符串。同时,对于其
他方法的调用顺序也一目了然了。(注意:这里我将sleep注释掉了,因为sleep会在序列化的时候调用,因此执行sleep方
法就不会再执行序列以及之后的操作了。)
由前可以看到,unserialize()后会导致wakeup()destruct()的直接调用,中间无需其他过程。因此最理想的情况就是
一些漏洞/危害代码在wakeup()destruct()中,从而当我们控制序列化字符串时可以去直接触发它们。


    class 

你可能感兴趣的:(安全实践)