ThinkPHP 6.0任意文件操作漏洞分析复现

破绽简介

2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不平安的SessionId招致的恣意文件操作破绽。该破绽允许攻击者在目的环境启用session的条件下创立恣意文件以及删除恣意文件,在特定状况下还能够getshell。

攻击者可应用此破绽结构歹意的数据报文,向效劳器写入恣意内容的文件,从而可以到达远程代码执行.
 


 

影响范围

ThinkPHP6.0.0
ThinkPHP6.0.1
 


 

破绽剖析

依据官方github的commit揣测,可能是在存储session时招致的文件写入。然后,跟踪:vendor/topthink/framework/src/think/session/Store.php

public function save(): void

图片[1]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

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

图片[2]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

调用writeFile函数,跟入:

图片[3]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

写入文件的操作。

继续看一下文件名能否可控,该文件名来自于最开端的getId()得到的$sessionId的值。看一下函数内容:

图片[4]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

在 session 初始化时,程序会将 PHPSESSID 对应的值赋值给 thinksessionStore:id 。这里假如 PHPSESSID 对应值长度等于32,则无任何过滤直接赋值,看一下调用setId的中央:vendor/topthink/framework/src/think/middleware/SessionInit.php:46。

图片[5]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

然后在程序结构响应数据返回给用户时,会先将 session 写入文件,而这个文件的文件名则由之前的 PHPSESSID 拼接而成。由于没有任何的过滤,这也就形成了恣意文件创立、掩盖。在session 数据可控的状况下,能够到达 getshell 的目的

图片[6]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

 


 

环境搭建

运用ThinkPHP6.0.0版本搭建,应用中间件phpstudy运转搭建的网站

图片[7]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

图片[8]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

图片[9]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

 


 

破绽复现

应用条件:
在目的环境为Windows且开启session的状况下,容易遭受恣意文件删除攻击。
在目的环境开启session且写入的session可控的状况下,容易遭受恣意文件写入攻击。
修正/app/controller/Index.php 文件
增加下面这段代码:

图片[10]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

修正 /app/middleware.php 文件如下

图片[11]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

运用burp结构数据报文如下:

图片[12]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

默许在目的/ runtime/session文件夹下生成如下文件

图片[13]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

写入的文件内容

图片[14]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

拼接URL地址:

图片[15]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

交换payload获取webshell

图片[16]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区

获取webshell

图片[17]-ThinkPHP 6.0任意文件操作漏洞分析复现-孤勇者社区
 


 

破绽修复

目前官网曾经更新了thinkphp6.0.2版本,修复了该破绽,倡议尽快晋级最新版本。
 

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片