搜索
当前位置:首页 > 时尚 > thinkphp v5漏洞

thinkphp v5漏洞

发表于 2026-10-17 06:06:07 来源:烟消火灭网

2018年底,ThinkPHP v5.0.x 和 v5.1.x 被爆出一个远程命令执行漏洞,编号 CVE-2018-20062。这个漏洞跟之前那个著名的“5.0.23 远程代码执行”不是一回事,但杀伤力一点不小。核心问题出在 Request 类的 method() 方法上——具体点说,是 var_method 这个参数可以被外部伪造,导致框架在解析请求方法时把恶意数据带进了 call_user_func 的调用链。

我拿一个真实环境复现过。当时访问的 URL 大概长这样:

http://target/index.php?s=captcha POST: _method=__construct&filter[]=system&method=get&get[]=whoami 

结果服务器直接返回了 www-data。整个过程不需要登录,不需要任何认证。只要目标站用的是受影响的 ThinkPHP 版本,并且开启了 debug 模式或者某些默认配置,攻击者就能直接执行系统命令。这个漏洞在野利用的规模不小,当时很多站群、小程序后端、甚至一些企业内网系统都中招了。

为什么 _method 能搞出这么大动静?ThinkPHP v5 在处理请求时,会检查 $_POST['_method'] 来覆盖实际的 HTTP 方法。这个设计本身是为了兼容一些不支持 PUT/DELETE 的客户端。但问题在于,框架没有对 _method 的值做严格过滤,而是直接把它传给了 Request::method()。更糟的是,Request 类的构造函数支持通过参数覆盖内部属性,包括 filter 和 get。攻击者构造 _method=__construct,就相当于让框架重新实例化 Request 对象,并把 filter 设成 system,再把 get 设成要执行的命令。最终 param() 方法在取值时触发了 filterValue,命令就被执行了。

这个漏洞影响范围明确:ThinkPHP 5.0.0 到 5.0.23,以及 5.1.0 到 5.1.30。官方在 5.0.24 和 5.1.31 里修复了。修复方式也很直接——在 Request::method() 里加了一行判断,如果 _method 不是合法的 HTTP 方法,就忽略它。同时 __construct 也不再允许通过外部参数覆盖关键属性。补丁很小,但堵住了整条利用链。

如果你现在还在跑老版本,别犹豫,赶紧升级。如果因为历史原因升不了,至少把 _method 参数从请求里过滤掉,或者用 WAF 规则拦住 _method=__construct 这种特征。我见过一些运维图省事,只改了入口文件里的 define('APP_DEBUG', false),以为关了 debug 就没事。实际上这个漏洞跟 debug 模式没有直接关系,关 debug 只能挡住一部分报错信息泄露,挡不住命令执行。

另外说个细节:这个漏洞和 ThinkPHP 的“兼容模式”也有点关系。如果你的 URL 里用了 s= 参数来路由,某些版本下会更容易触发。我当时测试时,直接访问 /index.php?s=captcha 就能打,不需要额外找路由。这也解释了为什么当时批量扫描器一抓一个准。

最后提一句,ThinkPHP v5 的漏洞史挺长的。从 5.0.23 的 invokeFunction 到 5.1.30 的 _method,核心问题都是框架对用户输入过于信任,把本应内部使用的参数暴露给了外部。写框架的人图方便,用的人就得买单。现在 ThinkPHP 6 和 8 已经重构了不少,但老项目里 v5 的存量依然很大。去 GitHub 上搜一下 thinkphp 5.0.23,还能看到一堆没升级的仓库。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by thinkphp v5漏洞,烟消火灭网   sitemap

回顶部