A-A+

ThinkPHP6.0 任意文件操作漏洞之带POC的靠谱分析

2020年01月17日 12:17 学习笔记 暂无评论 共2194字 (阅读5,501 views次)

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】

漏洞介绍

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

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

总结(建议先看结果有兴趣再看过程)

ThinkPHP在2019/10/24 发布了最新版本6.0,虽然说新版出现了一个安全隐患,但是官方及时的进行了修补。如连接:https://github.com/top-think/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2   发布时间与修复时间仅间隔了2个月多,那试问,有多少个人愿意当小白鼠会发布新版就立刻用新版做自己的网站?想必用新版的用户不会很多。然后再反观漏洞如下的利用条件:

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

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

 

上面的两个条件就已经相对来说非常苛刻了,如果再加上小白鼠少,再加上还需要找到能写入session或者说操作session的地方(不过一般可能会出现在注册、登陆、退出等地方)。所以这个漏洞能找到网站从而利用的可能性是非常低的,个人觉得以后极有可能会出现在某CTF比赛中。。。拭目以待。

 

测试POC(先给结果以免浪费你时间)

绿色线条部分是我这边自己构建的,实战中需要你自己找,红色部分是写入文件测试的POC。

测试所用POC

 

结果如下图:

成功访问所写文件

 

删除文件的POC跟上面的是一样的,但是,,,需要你清除session,没有上上图POC中绿色线条的部分即可。

 

漏洞分析

根据官方github的commit:

https://github.com/topthink/framework/commit/1bbe75019ce6c8e0101a6ef73706217e406439f2

注意,你要本地搭环境复测,首先。修改 /var/www/html/tp60/app/controller/Index.php 文件如下图修改(这里跟我上图测试的POC并不一致,其实只需要把GET请求改成:index.php?a=c&b=123123<?php+phpinfo();+?>  即可):

文件修改创造可利用环境

 

修改 /var/www/html/tp60/app/middleware.php 文件如下

<?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
     \think\middleware\SessionInit::class
];

 
然后,跟踪: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中:

通过分析验证,我们发现漏洞(如上图)还能导致任意文件删除。

文章参考:https://paper.seebug.org/1114/

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言