前言
最近出了一个thinkphp6.0的漏洞,暂时没有什么漏洞细节出来,据说可以在特定条件下getshell,让我这只小菜鸡先看看。
漏洞原理
先看官方补丁,只有一处代码更改了
那就回过头康康这行代码。问题出在setid()函数里,修复判断了id是否为数字和字母的组合,那么肯定是设置id时,id可控。
根据奇安信cert的通告,任意文件创建,由于tp传输session时会存储为文件,然后官方改的还是设置session的地方,那么可以联想到是保存session文件时存在漏洞。
然后再翻一下保存session的代码,同样位于tp6\vendor\topthink\framework\src\think\session\Store.php
:
之后的write调用的函数到最后会保存文件,所以,差不多就是这了,为了还原poc,再翻一下怎么设置session,\tp6\vendor\topthink\framework\src\think\middleware\SessionInit.php
中session初始化的handle里:
利用setId设置的\$sessionId
是根据\$cookieName
从cookie中获取的,而\$cookieName
是PHPSESSID:
所以,利用点就在cookie中的PHPSESSID里~
漏洞利用
如果想进行getshell,那么首先需要开启session(这一条很多真实环境都会开启),然后写入session文件的值可控。我们可以写个demo复现一下(因为默认框架里是没有保存session这一步的)。
根据官方手册的描述:
开启session
更改一下index.php里的代码,设置一下session,记得上面引入session类。
由之前的setid函数可知,这里phpsessid必须为32个字节,构造一下poc,让session存储在public下的omg123456.php
里:
访问shell文件,哦吼,成功
补充
一直看没有大厂商发利用方式,想到网络安全法,我也不敢发出来。今天看启明和360发出来了,那我看看能不能搞个账号噻。如果觉得太菜请轻喷噻。