ThinkPHP被入侵后需三步处置:一、清除webroot异常文件、篡改核心文件、日志伪装后门及数据库隐藏代码;二、回溯CVE-2018-20062等漏洞、修复SQL拼接与模板输出风险;三、重置凭证、关闭危险配置、扫描加固并升级至TP6.3+及PHP8.2.35+。

ThinkPHP被入侵后,清理后门和修复不能只删几个文件就完事——重点是找到所有隐蔽入口、清除持久化痕迹、堵住原始漏洞链。以下分三步实操处理:
一、快速定位并清除常见后门类型
ThinkPHP环境里后门往往藏在这些位置,需逐项检查:
-
webroot下的异常PHP文件:如
1.php、shell.php、xxx.jpg.php(注意双扩展名或空格绕过),尤其检查上传目录、静态资源目录、public/和runtime/子目录 -
框架核心文件被篡改:比对
thinkphp/library/think/Request.php、App.php、Loader.php是否被注入 eval、assert、system 等危险函数调用;重点看input()、method()、filter()相关逻辑是否被覆盖 -
日志文件伪装后门:攻击者常将一句话写入
runtime/log/或runtime/cache/中的 .php 文件(如20261027.php),用 base64_decode + gzinflate 组合加密,需用脚本批量解码扫描 -
数据库中隐藏后门:检查配置表(如
config、setting)或内容表字段(如article.content)是否存有 PHP 代码,特别是含<?php @eval($_POST[x])?>类型字符串
二、回溯入侵路径,关闭原始漏洞入口
不堵住源头,清理完几小时又沦陷。当前高危点优先排查:
-
ThinkPHP 5.0.x RCE(CVE-2018-20062):若版本为 5.0.22 或更早,确认是否仍存在
_method=__construct&filter[]=system&server[REQUEST_METHOD]=id类请求记录;该漏洞无需登录,直接远程执行命令 -
未过滤的 input() 直接拼 SQL:检查控制器中是否有类似
Db::query("SELECT * FROM user WHERE id = ".$_GET['id'])的写法,必须替换为参数绑定形式:Db::name('user')->where('id', input('id'))->find() -
模板输出未转义:查看
{\$content}是否出现在模板中且未加|htmlspecialchars过滤;应统一改为{:htmlspecialchars(\$content, ENT_QUOTES, 'UTF-8')}或启用模板自动转义 -
第三方插件/模块带后门:如 FastAdmin、MacCMS 衍生系统曾曝出后台上传组件硬编码后门,检查
application/command/、extend/下非官方来源的类库
三、加固与验证动作不能省
清理不是终点,得让系统真正“脱敏”:
立即学习“PHP免费学习笔记(深入)”;
- 重置全部凭证:包括数据库账号、FTP、后台管理员密码、Redis/Memcached 密码;禁用或删除可疑账号(如新增的 admin123、guest)
-
关闭危险配置:确认
php.ini中allow_url_include=Off、disable_functions=exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec已生效;Web服务器层(Nginx/Apache)禁止解析非标准后缀(如 .jpg.php) -
上线前强制扫描:用
sqlmap -u "http://site.com/index.php?s=/home/article/view&id=1" --batch --level=5测试SQL注入;用dirsearch扫描备份文件(.bak/.swp/.git)和调试接口(/route、/debug) -
部署运行时防护:在入口文件
public/index.php开头加入简单白名单校验,例如拦截含eval|assert|file_put_contents|base64_decode的 GET/POST 参数(临时兜底,非替代补丁)
补丁永远比应急快一步。ThinkPHP 官方已停止维护 5.0.x 版本,建议尽快升级至 6.3+ LTS 版本,并启用内置的中间件安全策略。PHP 解释器本身也刚曝出两个高危 RCE(CNVD-2026-41674/41675),务必同步升级到 8.2.35 / 8.3.36 及以上。



















