反序列化基础知识:
https://www.cnblogs.com/wangtanzhi/p/12252993.html
https://www.cnblogs.com/wangtanzhi/p/12637819.html
compose安装tp框架
先记录一下看了一晚上的pop利用链,明天继续审
整个漏洞起点:
\thinkphp\library\think\process\pipes\windows.php的__destruct魔法函数。
public function __destruct()
{
$this->close();
$this->removeFiles();
}
在此页面搜索removeFiles()
private function removeFiles()
{
foreach ($this->files as $filename) {
if (file_exists($filename)) {
@unlink($filename);
}
}
$this->files = [];
}
可以看到有一个unlink函数,如果我们能够控制$filename,就可以达到任意文件删除。
自然而然,我们开始看file_exists这个函数,
$filename会被作为字符串处理。
而__toString?当一个对象在反序列化后被当做字符串使用时会被触发,我们通过传入一个对象来触发__toString?方法。搜索__toString方法。因为前面我们传入的是一个Pivot对象,所以此时便会触发__toString方法。
全局搜索__toString
这里有很多地方用到,我们跟进\thinkphp\library\think\model\concern\Conversion.php的Conversion类的__toString()方法,这里调用了一个toJson()方法。然后跟进toJson()方法。
这里调用了toArray()方法,然后转换为json字符串,继续跟进toArray()。
\thinkphp\library\think\model\concern\Conversion.php中
分析一下前面三个遍历基本上不会干扰到我们整个利用链
我们直接看对$this->append的遍历:
// 追加属性(必须定义获取器)
if (!empty($this->append)) {
foreach ($this->append as $key => $name) {
if (is_array($name)) {
// 追加关联对象属性
$relation = $this->getRelation($key);
if (!$relation) {
$relation = $this->getAttr($key);
if ($relation) {
$relation->visible($name);
}
}
我们需要在toArray()函数中寻找一个满足$可控变量->方法(参数可控)的点
这里的$this->append是我们可控的
这个方法中的值怎么来的?分析代码继续跟进。
原文:https://www.cnblogs.com/wangtanzhi/p/12639659.html