知识

thinkphpv5漏洞

时间:2010-12-5 17:23:32  作者:探索   来源:知识  查看:  评论:0
内容摘要:ThinkPHP v5的漏洞,说穿了就是一套老框架在PHP生态快速迭代下留下的历史包袱。2018年底爆出的RCE远程代码执行)漏洞,至今还在扫描器的攻击列表里躺着,时不时有粗心的站长中招。那次漏洞的本

ThinkPHP v5的漏洞,说穿了就是一套老框架在PHP生态快速迭代下留下的历史包袱。2018年底爆出的RCE(远程代码执行)漏洞,至今还在扫描器的攻击列表里躺着,时不时有粗心的站长中招。那次漏洞的本质并不复杂——框架对控制器名的过滤不够严格,攻击者通过构造特殊的URL,直接绕过了路由解析,把恶意代码塞进了未定义的方法调用里。

具体点说,问题出在`think\App::module`的解析过程。当URL中的控制器名包含反斜杠时,框架会把它当作命名空间的一部分去加载类。如果这个类不存在,PHP的自动加载机制就会触发,攻击者只要在命名空间里加上`\think\request`这类内置类,再配合`call_user_func`函数,就能实现任意代码执行。网上流传的POC(验证代码)大多长这样:`http://target/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id`。那条URL看着平平无奇,但服务器上跑出来的`uid=www-data`却明晃晃地摆在眼前。

这种漏洞最要命的地方在于,它不需要任何认证。只要Web服务能正常解析PHP,攻击者就能直接拿到命令执行权限。当年我拿自己的测试站试过,一条命令就能读取`/etc/passwd`,再往深处走,拖库、写webshell、反弹shell,全都畅通无阻。官方后来发了补丁,在`App.php`里加了`preg_replace`对控制器名做过滤,把反斜杠和点号都拦掉了。可问题是,很多老项目早就停止维护了,开发者根本不会去更新依赖。

更坑的是,ThinkPHP v5的官方文档里还推荐过一些不安全的写法。比如在控制器里直接使用`Request::get()`方法获取参数,却不做任何过滤。配合变量覆盖漏洞,攻击者可以通过`?filter[]=system&username=whoami`这样的参数,把内置的过滤器替换成危险函数。这种设计缺陷不是靠打补丁就能根治的——它写进了框架的基因里,除非重写核心代码,否则总有边边角角的绕过姿势。

到了2020年,又有人挖出了v5.0.x的SQL注入漏洞,利用`order`参数拼接原生语句。同样是老套路,参数过滤不严,直接拼接进查询语句。这些漏洞有个共同点:它们都集中在URL路由和请求参数处理这两个入口。框架为了追求开发效率,做了太多“自动化”的解析工作,结果反而给了攻击者可乘之机。你要是现在去翻GitHub上的漏洞库,ThinkPHP v5相关的CVE编号能列出一长串,从文件包含到反序列化,几乎每个攻击面都被翻了个遍。

说句实在话,还在用ThinkPHP v5的项目,多半是历史遗留系统。维护这类老代码,别指望框架本身能给你什么安全感。最实际的做法是,在Nginx或Apache层面把`index.php`的访问权限收紧,对URL参数做白名单校验,再装上WAF(Web应用防火墙)拦截常见的攻击payload。要是条件允许,干脆重写路由层,绕开框架自带的危险解析逻辑。毕竟,漏洞这东西,发现一个修一个,永远有下一个等着你。真正的安全感,还是得靠自己一层层堆出来。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap