thinkphp 5.x日志泄露漏洞本质是调试模式未关闭且日志目录可直接访问,导致攻击者批量下载含数据库密码、sql语句等明文日志;修复需立即关闭debug、清空日志、封禁runtime目录访问。

ThinkPHP 5.x 日志泄露漏洞本质是调试模式未关闭 + 日志目录可直接访问,导致攻击者能批量下载包含数据库密码、SQL语句、管理员操作痕迹的明文日志文件。修复不靠“打补丁”,而在于立即切断信息输出和访问通道。
为什么日志会变成攻击入口
TP5 默认在 APP_DEBUG = true 时,把所有请求参数、SQL执行过程、错误堆栈、临时变量都写进 runtime/log/年/月/日.log 文件。这些文件按固定格式命名(如 202608/17.log),路径可预测;只要 Web 服务器没禁用目录浏览或文件下载,攻击者用浏览器访问 /runtime/log/202608/17.log 就能直接看到:
- 数据库连接配置(含账号密码)
- SELECT * FROM user WHERE username = 'admin' AND password = '123456'
- 完整 PHP 错误堆栈(暴露控制器路径、方法名、服务器绝对路径)
- 后台登录成功的 session_id 和 cookie 内容
三步快速确认是否已暴露
不用翻代码,打开浏览器直接验证:
- 访问任意页面后加 /?s=/index/index/&debug=1,若返回大量 SQL 或路径信息,说明 APP_DEBUG 仍为 true
- 直接访问 /runtime/log/,若列出年份目录或显示 .log 文件列表,证明日志目录完全裸奔
- 访问 /runtime/log/202608/17.log(替换成当天日期),若返回 200 并显示文本内容,说明日志已被公开读取
必须立刻执行的修复动作
顺序不能错,否则删完两小时又写满:
- 关闭调试:修改 app.php 中
'debug' => true为'debug' => false;若存在 extra/debug.php,直接删除该文件 - 清空日志:进入 runtime/log/ 目录,递归删除所有子目录及其中全部
.log文件(不是只删空目录) - 封死路径:在 Nginx 配置中加入并重载:
location ~ ^/runtime/.*\.(log|php)$ { deny all; }
防复发的关键配置
光改一次不够,得让系统“记性变差”:
- 检查 public/index.php 入口文件,确认没有
define('APP_DEBUG', true)这类硬编码;如有,改为 false 或彻底删除 - 给 runtime/ 目录设权限:Linux 下执行
chmod 750 runtime,禁止 Web 用户写入以外的操作 - 在日志配置中禁用敏感字段记录:修改 app.php 的
'log' => ['record' => false],或自定义日志驱动过滤 SQL 和 POST 数据











