PHP不死马为何几分钟就死掉了?
字数 959 2025-08-22 22:47:30
PHP不死马进程终止问题分析与解决方案
1. 问题现象描述
在AWD比赛中,PHP不死马是维持权限的有效手段。但在本地测试环境中(Ubuntu 22.04 + 宝塔面板 + PHP8),发现以下异常现象:
- 通过蚁剑等webshell管理工具上传不死马脚本
- 上传成功后删除不死马文件
- 初始阶段无法删除(正常现象)
- 几分钟后,不死马进程自动消失,文件可被删除
2. 不死马基本原理
PHP不死马的工作原理:
- 脚本运行后删除自身文件
- 通过死循环保持进程驻留在内存中
- 从而实现持久化后门
3. 问题排查过程
3.1 进程监控
使用命令监控PHP进程:
top -c -p $(pgrep -d',' php)
观察发现不死马对应的PHP进程(如1247)在几分钟后自动消失。
3.2 日志分析
检查PHP-FPM日志文件(路径可能因环境而异):
/www/server/php/80/var/log/php-fpm.log
发现关键错误信息:
WARNING: [pool www] child 1247, script '/www/wwwroot/192.168.156.149/aa.php' (request: "GET /aa.php") execution timed out (107.644002 sec), terminating
这表明脚本执行时间超过了服务器设置的最大执行时间限制。
4. 根本原因分析
PHP-FPM配置参数request_terminate_timeout控制着PHP请求的最大执行时间:
- 当脚本执行时间超过此值时,PHP-FPM会强制终止该请求
- 在宝塔面板的默认配置中,此值被设置为100秒
- 不死马脚本的死循环执行时间超过100秒后被自动终止
5. 解决方案
5.1 修改PHP-FPM配置
-
定位PHP-FPM配置文件(路径可能因环境而异):
/www/server/php/80/etc/php-fpm.conf或
/www/server/php/80/etc/php-fpm.d/www.conf -
找到并修改
request_terminate_timeout参数:request_terminate_timeout = 1000将值调整为更大的数值(如1000秒)
-
重启PHP-FPM服务使配置生效
5.2 其他可能的解决方案
- 在脚本中添加
set_time_limit(0)取消执行时间限制 - 修改不死马代码,使其定期"自我唤醒"(在超时前重新启动)
- 使用其他持久化技术替代纯PHP死循环
6. 验证方法
- 上传修改后的不死马脚本
- 监控PHP进程是否持续存在
ps aux | grep php - 检查文件是否保持不可删除状态
- 观察PHP-FPM日志是否有超时警告
7. 安全注意事项
- 此解决方案仅用于安全研究和测试环境
- 在生产环境中,应加强安全防护,防止不死马攻击:
- 定期检查异常PHP进程
- 监控文件系统异常
- 限制PHP脚本执行权限
- 使用入侵检测系统
通过以上分析和解决方案,可以解决在本地测试环境中PHP不死马进程自动终止的问题,为安全研究提供稳定的测试环境。