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,否则会抛出非常,无法连续运行。此处直接从之前的解析结果中获取掌握器名称以及操作名,无任何安全检讨。
图6
2.5
跟进到实例化Loader 掌握器方法
图7
可以看到如果掌握器名中有“\”,就直接返回。回到“thinkphp/library/think/App.php”的module方法,正常情形下该当获取到对应掌握器类的实例化工具,而我们现在得到了一个“\think\App”的实例化工具,通过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