旗下导航:搜·么
当前位置:网站首页 > PHP框架 > ThinkPHP > 正文

ThinkPHP6 任意文件操作漏洞分析_ThinkPHP教程,ThinkPHP6

作者:搜搜PHP网发布时间:2020-01-21分类:ThinkPHP浏览:198


导读:thinkphp6任意文件创建漏洞复现_ThinkPHP教程近日奇安信发布了ThinkPHP6.0“任意”文件创建漏洞安全风险通告,对此,DYSRC第一时间对该漏洞进行了分...

thinkphp6 任意文件创建漏洞复现_ThinkPHP教程

近日奇安信发布了 ThinkPHP 6.0 “任意”文件创建漏洞安全风险通告,对此,DYSRC第一时间对该漏洞进行了分析,并成功复现该漏洞。

漏洞介绍

2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文件操作漏洞。该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下还可以getshell。

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

漏洞复现

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

漏洞分析

根据官方github的commit:

https://github.com/topthink/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函数,跟入:

果然是写入文件的操作。

使用thinkphp5对excel文件进行导出_ThinkPHP教程

有些人觉得excel导出很复杂,但其实很简单,两步操作即可完成想要的数据导出。第一步,将excel配置到thinkphp5框架的惯例配置common中;第二步,编写控制器代码。

继续反向看一下文件名是否可控,该文件名来自于最开始的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版本,以免遭受攻击。

ki4网,大量的免费thinkphp入门教程,欢迎在线学习!

以上就是ThinkPHP6 任意文件操作漏洞分析的详细内容,更多请关注ki4网其它相关文章!

今日新课推荐:《Thinkphp6.0正式版视频教程》_ThinkPHP教程

php中文网在2020年再次重新Thinkphp6.0录制课程,帮助同学们快速入门!欢迎学习!

标签:ThinkPHP6