ctfshow-web257 PHP 反序列化漏洞分析与 Payload 构造
本文旨在详细解析 ctfshow-web257 题目的 PHP 反序列化漏洞原理,涵盖私有属性序列化规则、POP 链构造方法及 Payload 生成技巧。
一、前置知识
1. 三种修饰符
| 修饰符 | 类内部 | 子类 | 类外 |
|---|---|---|---|
public | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ❌ |
private | ✅ | ❌ | ❌ |
打勾代表能访问。在 PHP 中,不同权限的属性在序列化时的名称格式不同:
| 属性定义 | 序列化里的名字 |
|---|---|
public $a | a |
protected $a | \0*\0a |
private $a | \0 类名\0a |
例如,对于 public 属性的类,序列化字符串直接包含属性名;而对于 private 属性,则需要加上类名前缀(包含空字节)。
2. 普通方法名与魔术方法
'普通方法名'是程序员自定义的函数名,如 abc、getInfo 等,不会自动执行。PHP 的魔术方法是固定的,如 __construct、__destruct、__wakeup、__toString,它们会在特定生命周期或操作时自动调用。
3. POP 链 (Property-Oriented Programming)
POP 链是通过控制对象属性,利用已有类的魔术方法,在反序列化过程中自动执行危险代码的技术。其基本结构通常分为三段:
[入口] → [传递] → [危险点]
class A {
public $b;
function __destruct() { $this->b->run(); }
}
class B {
public $c;
function run() { eval($this->c); }
}
构造的 payload 示例如下:
O:1:::{ s::; O::::{ s::; s::; } }

