【Web】CTFSHOW元旦水友赛漏洞解析:从PHP反序列化到RCE实战
1. PHP反序列化漏洞基础认知
第一次接触PHP反序列化漏洞时,我盯着那一串O:6:"Logger":3:{...}格式的字符串发了半小时呆。这玩意儿就像快递站的条形码,看似杂乱无章,实际上藏着完整的物品信息。简单来说,PHP反序列化就是把这种特殊格式的字符串,重新转换成内存中的对象实例。
举个例子,假设有个用户登录类:
class User { public $username = 'guest'; public $is_admin = false; public function checkPermission() { if($this->is_admin) { return '最高权限'; } return '普通权限'; } } 当这个类被序列化后,会变成:
O:4:"User":2:{s:8:"username";s:5:"guest";s:8:"is_admin";b:0;} 危险就藏在对象属性可控时。如果攻击者篡改序列化数据,把is_admin改为true:
O:4:"User":2:{s:8:"username";s:5:"admin";s:8:"is_admin";b:1;} 当程序反序列化这段数据时,就会创建一个权限异常的用户对象。我在某次渗透测试中,就曾通过修改购物车对象的商品价格属性,成功以1分钱买到了最新款手机(当然最后如实告知了厂商)。
2. CTFSHOW easy_web题目深度拆解
这次元旦赛的easy_web题堪称PHP反序列化的花式教学。题目环境模拟了一个文件写入功能,我们需要通过精心构造的POP链(Property-Oriented Programming)实现RCE。先看核心类结构: