thinkphp6.0特定情况getshell之poc还原【通过】

前言

最近出了一个thinkphp6.0的漏洞,暂时没有什么漏洞细节出来,据说可以在特定条件下getshell,让我这只小菜鸡先看看。

漏洞原理

先看官方补丁,只有一处代码更改了

那就回过头康康这行代码。问题出在setid()函数里,修复判断了id是否为数字和字母的组合,那么肯定是设置id时,id可控。

根据奇安信cert的通告,任意文件创建,由于tp传输session时会存储为文件,然后官方改的还是设置session的地方,那么可以联想到是保存session文件时存在漏洞。

然后再翻一下保存session的代码,同样位于tp6\vendor\topthink\framework\src\think\session\Store.php

image

之后的write调用的函数到最后会保存文件,所以,差不多就是这了,为了还原poc,再翻一下怎么设置session,\tp6\vendor\topthink\framework\src\think\middleware\SessionInit.php中session初始化的handle里:

利用setId设置的\$sessionId是根据\$cookieName从cookie中获取的,而\$cookieName是PHPSESSID:

image

所以,利用点就在cookie中的PHPSESSID里~

漏洞利用

如果想进行getshell,那么首先需要开启session(这一条很多真实环境都会开启),然后写入session文件的值可控。我们可以写个demo复现一下(因为默认框架里是没有保存session这一步的)。

根据官方手册的描述:

开启session

更改一下index.php里的代码,设置一下session,记得上面引入session类。

由之前的setid函数可知,这里phpsessid必须为32个字节,构造一下poc,让session存储在public下的omg123456.php里:

访问shell文件,哦吼,成功

补充

一直看没有大厂商发利用方式,想到网络安全法,我也不敢发出来。今天看启明和360发出来了,那我看看能不能搞个账号噻。如果觉得太菜请轻喷噻。

  • 通过
  • 未通过

0 投票者