ThinkPHP6肆意文件操作缝隙分析

颁布功夫 2020-01-14


2020年1月10日,ThinkPHP团队颁布一个补丁更新,建复了一处由不安全的SessionId导致的肆意文件操作缝隙。该缝隙允许攻击者在指标环境启用session的前提下创建肆意文件以及删除肆意文件,在特定情况下还能够getshell。

具体受影响版本为ThinkPHP6.0.0-6.0.1。


缝隙复现


本地环境选取ThinkPHP 6.0.1+PHP7.1.20+Apache进行复现。在特定情况下执行测试验证法式即可写入一个webshell,如下图:


宝运莱·(中国区)最新官方网站


宝运莱·(中国区)最新官方网站


缝隙分析


凭据官方github的commit:https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2。


宝运莱·(中国区)最新官方网站


因而揣摩,可能是在存储session时导致的文件写入。而后,跟踪:vendor/topthink/framework/src/think/session/Store.php:254。


宝运莱·(中国区)最新官方网站


这里挪用了一个write函数,跟进一下:vendor/topthink/framework/src/think/session/driver/File.php:210。


宝运莱·(中国区)最新官方网站


挪用writeFile函数,跟入:


宝运莱·(中国区)最新官方网站


居然是写入文件的操作。

持续反向看一下文件名是否可控,该文件名来自于最起头的getId()得到的$sessionId的值。既然有getId,就会有setId,看一下函数内容:


宝运莱·(中国区)最新官方网站


当传入的参数$id满足32位的长度时,就将该值设为$this->id。挪用setId的处所为:vendor/topthink/framework/src/think/middleware/SessionInit.php:46。


宝运莱·(中国区)最新官方网站


这里的$cookieName的值是PHPSESSID。


宝运莱·(中国区)最新官方网站


而$sessionId是cookie中名为PHPSESSID的值,因而是攻击者可控的,从而导致写入的文件名可控。

写入的文件名可控,那么写入的内容是否可控呢?分析发现,写入的内容就是创建session使用的内容。但是session的创建是由现实的后端业务逻辑来决定的,而默认环境下并没有创建session。因而,默认环境下无法做到肆意文件写入。


在对该缝隙的深刻分析过程中,我们发现该缝隙还能够实现肆意文件删除,且文件删除对后端业务逻辑依赖较低。

还是在 vendor/topthink/framework/src/think/session/Store.php:254中:


宝运莱·(中国区)最新官方网站


通过度析验证,我们发现缝隙(如上图)还能导致肆意文件删除。


总 结


在指标环境为Windows且开启session的情况下,容易遭逢肆意文件删除攻击。

在指标环境开启session且写入的session可控的情况下,容易遭逢肆意文件写入攻击。

建议有关用户实时升级到ThinkPHP6.0.2版本,以免遭逢攻击。


宝运莱官方网站积极防御尝试室(ADLab)


ADLab成立于1999年,是中国安全行业最早成立的攻防技术钻研尝试室之一,微软MAPP打算主题成员,“黑雀攻击”概想首推者。截止目前,ADLab已通过CVE累计颁布安全缝隙1000余个,通过 CNVD/CNNVD累计颁布安全缝隙600余个,持续维持国际网络安全领域一流水准。尝试室钻研方向涵盖操作系统与利用系统安全钻延注移动智能终端安全钻延注物联网智能设备安全钻延注Web安全钻延注工控系统安全钻延注云安全钻研。钻研成就利用于产品主题技术钻延注国度沉点科技项目攻关、专业安全服务等。