专栏首页Khan安全团队【漏洞通报】ThinkPHP3.2.x RCE漏洞通报

【漏洞通报】ThinkPHP3.2.x RCE漏洞通报

漏洞概述

近日,默安玄甲实验室发现网络上出现针对ThinkPHP3.2的远程代码执行漏洞。该漏洞是在受影响的版本中,业务代码中如果模板赋值方法assign的第一个参数可控,则可导致模板文件路径变量被覆盖为携带攻击代码的文件路径,造成任意文件包含,执行任意代码。

ThinkPHP是一个开源免费的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。Thinkphp在国内拥有庞大的用户群体,其中不乏关键基础设施用户。

危害等级

严重

分布情况

fofa分布情况:

目前FOFA系统最新数据(一年内数据)显示中国最多,国外的基本是云主机部署。中国范围内共有139809个使用thinkphp框架的服务。其中部署于云主机的服务最多,共有96172个。山东第二,共有4,638个,广东第三,共有4,560个,上海第四,共有2,853个,江苏第五,共有1,585台。

gitee分布情况:

github分布情况:

目前Github最新数据显示全部仓库内共有331个,相关代码行数244,863个。

原理分析

0x01 攻击方式:

标题:ThinkPHP3.2.x_assign方法第一个变量可控=>变量覆盖=>任意文件包含=>RCE 作者:北门-王境泽@玄甲实验室 审稿:梦想小镇-晨星@玄甲实验室 攻击方式:远程 漏洞危害:严重 攻击url: http://x.x.x.x/index.php?m=Home&c=Index&a=index&value[_filename]=.\Application\Runtime\Logs\Home\21_06_30.log 标签:ThinkPHP3.2.3 RCE 变量覆盖 文件包含 代码执行

0x02 利用条件:

在ThinkPHP3.2.3框架的程序中,如果要在模板中输出变量,需要在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,本漏洞的利用条件为assign方法的第一个变量可控。

下面是漏洞的demo代码:

demo代码说明:

如果需要测试请把demo代码放入对应位置,代码位置:\Application\Home\Controller\IndexController.class.php

因为程序要进入模板渲染方法方法中,所以需要创建对应的模板文件,内容随意,模板文件位置:

\Application\Home\View\Index\index.html

这里需要说明,模板渲染方法(display,fetch,show)都可以;这里fetch会有一些区别,因为fetch程序逻辑中会使用ob_start()打开缓冲区,使得PHP代码的数据块和echo()输出都会进入缓冲区而不会立刻输出,所以构造fetch方法对应的攻击代码想要输出的话,需要在攻击代码末尾带上exit()或die();

漏洞攻击:

测试环境:

ThinkPHP3.2.3完整版 Phpstudy2016 PHP-5.6.27 Apache Windows10

debug模式开启或不开启有一点区别,但是都可以。

1.debug模式关闭:

写入攻击代码到日志中。错误请求系统报错:

请求数据包:

日志文件路径(这里是默认配置的log文件路径,ThinkPHP的日志路径和日期相关):

\Application\Runtime\Logs\Common\21_06_30.log

日志文件内容:

构造攻击请求: http://127.0.0.1/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/Common/21_06_30.log

2.debug模式开启:

请求数据包:

日志文件路径(这里是默认配置的log文件路径):

\Application\Runtime\Logs\Home\21_06_30.log

构造攻击请求:http://127.0.0.1/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/Home/21_06_30.log

3.寻找程序上传入口,上传文件

这种方式最可靠,上传具有恶意代码的任何文件到服务器上,直接包含其文件相对或绝对路径即可。

http://127.0.0.1/index.php?m=Home&c=Index&a=index&value[_filename]=./test.txt

0x03 代码分析

程序执行流程:

1.功能代码中的assign方法中第一个变量为可控变量:

代码位置:\Application\Home\Controller\IndexController.class.php

2.可控变量进入assign方法赋值给$this→tVar变量:

代码位置:\ThinkPHP\Library\Think\View.class.php

3.赋值结束后进入display方法中,display方法开始解析并获取模板文件内容,此时模板文件路径和内容为空:

代码位置:\ThinkPHP\Library\Think\View.class.php

4.程序进入fetch方法中,传入的参数为空,程序会去根据配置获取默认的模板文件位置(./Application/Home/View/Index/index.html)。之后,系统配置的默认模板引擎为think,所以程序进入else分支,获取this→tVar变量值赋值给params,之后进入Hook::listen方法中。

代码位置:\ThinkPHP\Library\Think\View.class.php

5.listen方法处理后,进入exec方法中:

代码位置:\ThinkPHP\Library\Think\Hook.class.php

6.进入exec方法中,处理后调用Behavior\ParseTemplateBehavior类中的run方法处理$params这个带有日志文件路径的值。

代码位置:\ThinkPHP\Library\Think\Hook.class.php

7.程序进入run方法中,一系列判断后,进入else分支,调用Think\Template类中的fetch方法对变量$_data(为带有日志文件路径的变量值)进行处理。

代码位置:\ThinkPHP\Library\Behavior\ParseTemplateBehavior.class.php

8.进入Think\Template类中的fetch方法,获取缓存文件路径后,进入Storage的load方法中。

代码位置:\ThinkPHP\Library\Think\Template.class.php

9.跟进到Storage的load方法中,_filename为之前获取的缓存文件路径,var则为之前带有_filename=日志文件路径的数组,

代码位置:\ThinkPHP\Library\Think\Storage\Driver\File.class.php

覆写后:

最终导致:

include .\Application\Runtime\Logs\Home\21_06_30.log

0x05 ThinkPHP3.2.*各版本之间的差异:

1.ThinkPHP_3.2和ThinkPHP_3.2.1

代码位置:\ThinkPHP\Library\Think\Storage\Driver\File.class.php 第68-79行

http://x.x.x.x/index.php?m=Home&c=Index&a=index&value[filename]=.\

2.ThinkPHP_3.2.2和ThinkPHP_3.2.3

代码位置:\ThinkPHP\Library\Think\Storage\Driver\File.class.php

http://127.0.0.1/index.php?m=Home&c=Index&a=index&value[_filename]=.\

3.限定条件下参数的收集

很多利用Thinkphp二开的cms,value的值不确定,以下列出常见的:

最终payload例如:http://127.0.0.1/index.php?m=Home&c=Index&a=index&info[_filename]=.\

参考:http://www.thinkphp.cn/

默安玄甲实验室已经协同监管单位向使用该框架的关键基础设施推进检测方式和代码安全解决方案,点击原文了解默安SDL解决方案。

文章分享自微信公众号:
Khan安全团队

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

原始发表时间:2021-07-12
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 通报:Confluence远程代码执行漏洞(CVE-2021-26084)被黑产大规模利用

    8月26日,Atlassian官方发布公告,披露了一个Atlassian Confluence 远程代码执行漏洞(CVE-2021-26084),攻击者利用漏洞...

    腾讯安全
  • Nuxeo RCE漏洞分析

    链接地址:https://v.qq.com/x/page/k3242hhatge.html

    小生观察室
  • zimbra RCE 漏洞利用

    近期在测试一个目标的时候发现对方好几个zimbra的服务器,按照网上提供的利用方法测试了之后发现利用不成功!接着自己搭建了zimbra在自己进行测试之后成功利用...

    辞令
  • 【漏洞通告】SaltStack RCE等高危漏洞通告

    CVE-2020-16846:未经身份验证的攻击者通过构造恶意请求,利用Shell注入(shell injection)获取SSH连接,从而在Salt-API上...

    绿盟科技安全情报
  • 思科路由器和交换机被爆有重大漏洞:可被控制或导致瘫痪

    1.客户只能下载直接从思科或通过思科授权的经销商或合作伙伴购买的具有有效许可证的软件升级。免费的安全软件更新不会使客户获得新的软件许可,其他软件功能集或主要版本...

    数据猿
  • Atlassian Crowd RCE漏洞分析

    最近,当我正在进行侦察时,我遇到了一个Atlassian Crowd应用程序。如果您不熟悉Crowd,它是一个集中的身份管理应用程序,允许公司“从多个目...

    洛米唯熊
  • Jenkins RCE漏洞分析汇总

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和...

    安恒网络空间安全讲武堂
  • Discuz! ML RCE漏洞 getshell 复现

    Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台, 用于构建像“社交网络”这样的互联网社区,漏洞版本如下:

    Timeline Sec
  • 【原创】基础篇 -- RCE漏洞总结

    本篇文章为星球团队成员原创文章,已申请原创权限,如其他公众号有需要转文,请联系信安旅程运营人员。

    7089bAt@PowerLi
  • 干货 | 漏洞挖掘中RCE漏洞常用的Payload总结

    RCE:远程代码执行 (RCE) 使攻击者能够通过注入攻击执行恶意代码。代码注入攻击不同于命令注入攻击。攻击者的能力取决于服务器端解释器的限制。在某些情况下,攻...

    HACK学习
  • Joomla 3.4.6-RCE漏洞复现

    Joomla是一套全球有名的CMS系统,基于PHP语言加上MySQL数据库所开发出来的WEB软件系统,目前最新版本是3.9.12。可以在多种不同的平台上部署并且...

    墙角睡大觉
  • Moeditor 0.2.0 - XSS to RCE漏洞复现

    该软件允许您在自己的编辑器中存储有效负载,以及上传(.md)文件。一旦输入恶意代码,有效负载将立即执行。

    洛米唯熊
  • 关于CVE-2019-1367 IE浏览器远程代码执行高危漏洞安全加固的紧急通报

    9月23日微软紧急发布安全更新,修复了一个影响IE浏览器的远程代码执行漏洞。由谷歌威胁分析小组发现此漏洞,据称该漏洞已遭在野利用。

    墙角睡大觉
  • ThinkPHP 5.0.0~5.0.23 RCE 漏洞复现

    2019 年 1 月 11 日,360CERT 发现某安全社区出现关于 ThinkPHP5 RCE 漏洞的威胁情报,不久之后 ThinkPHP5 官方与 Git...

    墙角睡大觉
  • Joomla 3.4.6-RCE漏洞复现

    2、Joomla基于PHP语言加上MySQL数据库所开发出来的WEB软件系统,目前最新版本是3.9.12。

    HACK学习
  • Apache Solr最新RCE漏洞分析

    Apache Solr爆出RCE 0day漏洞(漏洞编号未给出),这里简单的复现了对象,对整个RCE的流程做了一下分析,供各位看官参考。

    FB客服
  • 禅道全版本rce漏洞分析

    禅道项目管理软件是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小...

    C4rpeDime
  • 技术分享 | Fastjson-RCE漏洞复现

    Fastjson提供autotype功能,允许用户在反序列化数据中通过 @type 指定反序列化的类型,其次Fastjson自定义的反序列化会调用指定类中的se...

    C4rpeDime
  • 工具分享 | shiro漏洞检测RCE工具

    最近在做shiro反序列化漏洞复现,从网上也找了一堆复现文章和工具,但是这些工具用着都不太舒服,于是参考网上大佬们的工具,自己进行了一些简单的改良。

    TeamsSix

扫码关注腾讯云开发者

领取腾讯云代金券