请帮我构造一下这段代码的pop链,这是一道试题 <?php highlight_file(FILE); class Demo{ private $a; public function __destruct(){ $this->a->c; } } class Test{ private $b; public function __get($name) { eval($this->b); } } unserialize($_GET['ser']); ?>
时间: 2023-06-12 21:06:09 浏览: 109
假设攻击者控制了 `$this->a` 和 `$_GET['ser']` 的值,可以构造以下 pop 链:
```
Test::$b -> __get() -> $this->b -> eval() -> unserialize() -> Demo::$a -> $this->a -> __destruct() -> $this->a->c
```
解释一下:
1. `Test::$b` 是私有属性,无法直接访问,需要通过 `__get()` 方法获取。
2. `__get()` 方法中使用了 `$this->b` 变量,攻击者可以通过 `$_GET['ser']` 的反序列化来控制 `$this->b` 的值。
3. `$this->b` 中存储了恶意代码,使用 `eval()` 执行。
4. 恶意代码中使用了 `unserialize()` 反序列化攻击者控制的数据。
5. `Demo::$a` 是私有属性,无法直接访问,需要通过反序列化得到 `$this->a` 的值。
6. `$this->a` 中存储了一个 `Demo` 类的实例,可以通过调用 `__destruct()` 方法来触发攻击者控制的代码。
7. `__destruct()` 方法中调用了 `$this->a->c`,攻击者可以控制 `$this->a` 的值,从而实现任意代码执行。
阅读全文