php后门无法仅靠删文件清除,因其常通过持久化权限、webshell、逻辑篡改或隐藏账户实现深度寄生;需先验证运行状态、定位漏洞插件、安全复原四步(停服务→清权限→换密钥→重部署),重建完整信任链。

PHP后门不是靠“删文件”就能解决的,尤其是框架插件漏洞引入的后门,往往已获得持久化权限、植入隐蔽Webshell、篡改核心逻辑或创建隐藏管理员账户。直接删掉一眼可见的.php文件大概率无效,甚至会掩盖攻击痕迹、干扰溯源。
确认后门是否还在运行:查进程、网络连接和Web访问日志
很多后门会通过eval、assert、system等函数动态加载代码,不依赖独立文件。先别急着删,得验证它是否活着:
- 执行
ps aux | grep -i "php.*-r"或ps aux | grep -E "(eval|base64_decode|file_get_contents)",看是否有异常PHP命令行进程 - 用
netstat -tulnp | grep :80(或对应Web端口)检查是否有非nginx/apache进程在监听 - 翻
access.log,重点搜POST /.*.php、GET /.*eval.*=、base64_、gzinflate|str_rot13等特征请求,确认活跃入口 - 临时在
php.ini中开启log_errors = On+error_log = /var/log/php-backdoor.log,再触发可疑请求,看是否记录了恶意include或require路径
定位漏洞插件与后门落点:从更新记录和文件哈希入手
框架插件漏洞(如thinkphp历史RCE、wordpress插件SQLi、laravel未授权反序列化)通常导致攻击者上传文件或写入cache/、uploads/、vendor/子目录。不能只盯shell.php:
- 查版本控制记录:
git log --oneline -n 20,看近期是否有人提交了可疑插件或修改了config.php、routes.php - 对比干净环境的文件哈希:
find ./ -name "*.php" -type f -exec md5sum {} ; | sort > hash-before.txt,再跟线上跑一遍比对,突兀变更的文件优先排查 - 检查插件目录下的高危位置:
wp-content/plugins/*/includes/(WordPress)、application/common.php(ThinkPHP)、resources/views/*.blade.php(Laravel)——后门常藏在“合法模板”里,用@php ... @endphp包裹恶意逻辑 - 用
grep -r "base64_decode|eval|assert|create_function|preg_replace.*/e" ./ --include="*.php"扫描,但注意绕过手法:变量拼接($a='bas'.'e64'.'_decode'; $a($b))或十六进制编码字符串需手动解
安全复原四步动作:停服务→清权限→换密钥→重部署
删后门只是最后一步,前面三步没做,删完半小时又回来:
立即学习“PHP免费学习笔记(深入)”;
- 立即停掉Web服务(
systemctl stop nginx php-fpm),防止攻击者实时响应;不要只停PHP-FPM而留着Nginx,有些后门走CGI或FastCGI直连 - 重置所有可写目录权限:比如
chmod -R 755 storage/ bootstrap/cache/(Laravel)、chmod 644 wp-config.php(WordPress),确保www-data用户无权写入核心代码目录 - 轮换全部密钥和凭证:数据库密码、API密钥、JWT密钥、
APP_KEY(Laravel)、SECURE_AUTH_KEY(WP),旧密钥可能已被窃取用于横向移动 - 从可信源重部署:不是
git pull,而是删掉整个vendor/重composer install,或从官方包解压覆盖;插件必须升级到修复漏洞的版本,而非简单删除——漏洞仍在,新后门分分钟再生
为什么“删文件”常常失败?因为后门已深度寄生
真实攻防中,后门常以这几种方式规避删除:
- 写入
.user.ini或php.ini,用auto_prepend_file自动包含恶意脚本,删shell.php没用 - 注入到
mysql.user表的plugin字段,利用MySQL UDF提权后驻留 - 替换
php-cgi二进制文件本身(尤其在共享主机上),每次PHP执行都加载后门 - 利用框架事件监听器(如Laravel的
Event::listen)在每次http请求时动态载入远程恶意代码
真正有效的处置,是把“删后门”变成“重建信任链”:验证每行代码来源、每个进程合法性、每个配置项完整性。否则,你删的是文件,它活在内存、数据库、内核模块或运维习惯里。