一 、前言
Thinkphp是为了简化企业级应用开发和敏捷WEB应用开发而诞生的轻量级PHP开发框架,具有免费开源、快速、简单且面向对象等特点 。
在ThinkPHP的5.*版本中存在安全隐患,由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,可能出现getshell漏洞 。受影响的版本包括5.0和5.1 。
本期安仔课堂,ISEC实验室的黄老师将为大家介绍ThinkPHP5的相关知识点,欢迎感兴趣的朋友一起交流学习 。
二、漏洞分析
该漏洞源于ThinkPHP5框架底层对控制器名过滤不严,允许黑客通过url调用Thinkphp框架内部的敏感函数,出现getshell漏洞 。具体代码实现如下:
文章插图
图1
2.1
thinkphp/library/think/App.php
首先看到routecheck代码,由于没有在配置文件上定义任何路由,所以默认按照图一的方式进行解析调度 。如果开启强制路由模式,会直接抛出错误,这时通过Route::import命令加载路由,继续跟进路由 。
文章插图
图2
2.2
thinkphp/library/think/Route.php
可以看到tp5在解析URL的时候只是将URL按分割符分割,并没有进行安全检测 。继续分析:
文章插图
图3
其中,渗透测试人员最为关心的是Exchange对外提供的访问接口,以及使用的加密验证类型 。
2.3
thinkphp/library/think/App.php
可以看到:由于程序并未对控制器进行有效的安全过滤和检查,因此测试人员可以通过引用“”来调用任意方法 。
文章插图
图4
2.4
跟进到module方法
文章插图
图5
在测试时注意使用一个已存在的module,否则会抛出异常,无法继续运行 。此处直接从之前的解析结果中获取控制器名称以及操作名,无任何安全检查 。
文章插图
【ThinkPHP5任意代码执行分析全记录】图6
2.5
跟进到实例化Loader 控制器方法
文章插图
图7
可以看到如果控制器名中有“”,就直接返回 。回到“thinkphp/library/think/App.php”的module方法,正常情况下应该获取到对应控制器类的实例化对象,而我们现在得到了一个“thinkApp”的实例化对象,通过url调用其任意的public方法,同时解析url中的额外参数,当作方法的参数传入 。我们可以调用invokeFunction这个方法,构造payload为:
文章插图
图8
三、漏洞利用
所有基于tp5.0框架建设的网站都受此漏洞的影响 。
3.1
测试该漏洞点是否被修复
文章插图
图9
网址后面直接拼接以上代码,执行之后发现出现phpinfo页面,说明漏洞存在 。
文章插图
图10
3.2
在public目录下创建insfo.php
文章插图
图11
修改漏洞利用代码,直接在public目录下创建一个名为insfo.php的一句话木马 。
文章插图
图12
3.3
删除insfo.php文件
文章插图
图13
四、解决方案
直接添加补丁,升级ThinkPHP版本,开启强制路由,在ThinkPHP5.0版本的thinkphp/library/think/App.php , Module类的获取控制名处添加如下代码,正则过滤:
文章插图
图14
推荐阅读
- Swoole简介
- 佳能喷墨打印机报错不能用?看到这些代码这样做立马解决
- php之"EXCEL导出"代码生成器的实现思路
- 运行 JavaScript 代码片段的 20 种工具
- 博士|复旦博士写了130行代码:2分钟搞定繁琐的核酸筛查
- 十五个常见的WordPresswp-config.php设置代码
- 如何优雅的在头条插入代码,介绍几款在线源代码转图片工具
- 暴雪|魔兽正式服:玩家复原暴雪代码,10.0增加新职业,兼顾3个职责?
- Java|剖析类内的五类成员:属性、方法、构造器、代码块、内部类
- win10激活提示错误代码的解决办法