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 分钱买到了最新款手机(当然最后如实告知了厂商)。

