thinkphp5.0.24漏洞需立即封堵调试模式、日志泄露、反序列化入口及http方法伪造:关闭app_debug、屏蔽runtime目录、删除windows.php、校验请求方法、强制路由并过滤危险参数。

ThinkPHP5.0.24漏洞怎么快速定位和清除——必须在攻击者利用日志路径或反序列化入口写入WebShell前完成动作,否则服务器可能已被植入持久化后门,所有修补都失去意义。
先确认是否正在被利用
打开网站任意页面,在URL末尾追加 /?s=/index/index/&debug=1,如果返回大量数据库连接信息、SQL语句或文件路径(如 runtime/log/202608/06.log),说明 APP_DEBUG=true 仍开启且日志可直接访问,已暴露核心风险面。
用浏览器访问 /runtime/log/ 或 /Runtime/Logs/ 路径,若能列出年月目录或看到 .log 文件,证明日志目录未屏蔽,攻击者可直接下载分析敏感字段。
检查入口文件 public/index.php 或根目录 index.php,搜索 define('APP_DEBUG', true) 或 APP_DEBUG = true,只要存在且未被注释,就等于给黑客开了调试后门。
立刻阻断日志泄露通道
第一步:将 app.php(TP5.0.24)中 'debug' => true 改为 'debug' => false;若使用单独的 extra/debug.php,直接删除该文件。
第二步:清空 runtime/log/ 下全部内容,包括子目录和所有 .log 文件;注意不要只删空目录,要进每一层把 .log 文件全选中删除。
第三步:在 Nginx 配置中加入以下规则并重载:location ~ ^/runtime/.*\.(log|php)$ { deny all; }。【不加这条,删完日志两小时后又被自动写满】
封死反序列化入口点
方法一:修改 thinkphp/library/think/process/pipes/Windows.php
在 class Windows 开头插入两个魔术方法:
public function __sleep() { throw new Exception('Cannot serialize '.__CLASS__); }<br>public function __wakeup() { throw new Exception('Cannot unserialize '.__CLASS__); }
方法二:更彻底——直接删除 Windows.php 文件(TP5.0.24 在非 Windows 环境下本就不调用该类,删掉不影响功能,还能杜绝所有基于它的 POP 链利用)。
注意:不要只改 removeFiles() 方法内部逻辑,因为攻击链起点是 __destruct,只要对象销毁就会触发,绕过方式太多。
堵住 HTTP 方法伪造漏洞
打开 thinkphp/library/think/Request.php,定位到 method() 函数;找到 if (isset($_POST[Config::get('var_method')])) 分支。
在该分支内,将原始赋值语句:$this->method = strtoupper($_POST[Config::get('var_method')]);
替换为:
$method = strtoupper($_POST[Config::get('var_method')]);<br>if (in_array($method, ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])) {<br> $this->method = $method;<br>} else {<br> $this->method = 'POST';<br>}
这一步必须做,否则攻击者发一个 POST ?_method=PUT 并携带恶意 payload,就能绕过路由直接执行控制器方法。
强制启用路由并禁用动态调用
第一步:在 route.php 中设置 'url_route_on' => true,确保所有请求必须匹配预定义路由规则。
第二步:删除所有形如 ?s=/module/controller/action 的通用路由入口,尤其检查是否存在未授权开放的 Index 或 Common 控制器。
第三步:在全局中间件或入口文件中过滤所有含 debug、showsql、test 的 GET/POST 参数,直接 unset 或 die。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











