首页 / PHP / ThinkPHP5.1.x代码执行漏洞
ThinkPHP5.1.x代码执行漏洞
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ThinkPHP5.1.x代码执行漏洞,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3059字,纯文字阅读大概需要5分钟。
内容图文
![ThinkPHP5.1.x代码执行漏洞](/upload/InfoBanner/zyjiaocheng/635/2786a20343df4d4c975df33cdae07e6b.jpg)
前言
出题好几天没审计代码了,今天趁体育课来审一下ThinkPHP5.1.x代码执行漏洞。
一开始想做一个大总结来着,看了网上的文章已经有总结的很好的了,我就不再搬砖了。
这个文章仅仅是用来锻炼,哪怕是ThinkPHP5.1.x,他们因为版本的不同,debug是否开启导致payload也会不同。而且现在RCE基本不存在了,找找思路就行了。。
0x01
这里随便写写小总结,只是提一下。
先来明确一下
rce有两个大版本的分别
ThinkPHP 5.0-5.0.24
ThinkPHP 5.1.0-5.1.30
继续根据payload细分:
一种是因为Request类的method和__construct方法造成的,另一种是因为Request类在兼容模式下获取的控制器没有进行合法校验:
继续细分:
1:thinkphp5 method任意调用方法导致rce
上个文章就是分析的这个:
$this->method可控导致可以调用__contruct()覆盖Request类的filter字段,然后App::run()执行判断debug来决定是否执行$request->param(),并且还有$dispatch['type'] 等于controller或者 method 时也会执行$request->param(),而$request->param()会进入到input()方法,在这个方法中将被覆盖的filter回调call_user_func(),造成rce。
2:method __contruct导致的rce
思路基本一致,但是细节不同。此外1和2必须开启debug才能RCE。有captcha路由时无需debug=true。
3:未开启强制路由导致rce
版本和DEBUG选项的关系
有时候你会发现即使版本一样依旧无法RCE
5.0.13版本之后需要开启debug才能rce
但是呢
在thinkphp5完整版中官网揉进去了一个验证码的路由,可以通过这个路由触发rce
在上个文章中也已经验证过了
详细payload总结:
https://y4er.com/post/thinkphp5-rce/
0x02
今天我们要分析的主题就是未开启强制路由导致rce
环境:
"require": {
"php": ">=5.6.0",
"topthink/framework": "5.1.29"
},
漏洞成因:
thinkphp默认没有开启强制路由
说明我们可以使用路由兼容模式 s 参数,而框架对控制器名没有进行足够的检测,说明可能可以调用任意的控制器任意方法来执行,
eg: http://site/?s=模块/控制器/方法
访问:
看payload分析:
首先我们要知道
所有用户参数都会经过 Request 类的 input 方法处理,该方法会调用 filterValue 方法,而 filterValue 方法中使用了 call_user_func。这个在前面文章分析也提过了。
找request方法
跟进到thinkphp/library/think/App.php:402
跟进
routeCheck()
就在这个页面中。这个方法最后
return $dispatch
通过打断点
我们看到这个方法把我们的/替换成了|
继续回去看init()
进入Url.php
进入parseUrl
进入
进入parseUrlPath()
这里从URL处获取了
[模块/控制器/操作],导致parseUrl()返回的route为
index think\Request input
为什么呢?我们回到parseUrl()找route
导致thinkphp/library/think/App.php:406的$dispatch为
直接调用了input()函数,然后会执行到 App 类的 run 方法
这里也显示了
进而调用 Dispatch 类的 run 方法
该方法会调用关键数 exec thinkphp/library/think/route/dispatch/Module.php:84,进而调用反射类
我们跟进
在 exec 函数中,程序利用反射机制,调用类的方法。这里的类、方法、参数均是我们可以控制的。而且整个过程,并没有看到程序对控制器名的合法性进行检测,这也是导致 远程代码执行漏洞 的直接原因
所有参数可控,我们让他调用input方法
input方法已经说过很多次了
进入input()之后继续进入$this->filterValue()
实现rce
漏洞修复
官方的修复方法是:增加正则表达式 [1](\w)*$ ,对控制器名进行合法性检测。
// 获取控制器名
$controller = strip_tags($result[1] ?: $config['default_controller']);
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
最后用七月火师傅的一张图
A-Za-z ??
内容总结
以上是互联网集市为您收集整理的ThinkPHP5.1.x代码执行漏洞全部内容,希望文章能够帮你解决ThinkPHP5.1.x代码执行漏洞所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。