PHP不死马为何几分钟就死掉了?
字数 959 2025-08-22 22:47:30

PHP不死马进程终止问题分析与解决方案

1. 问题现象描述

在AWD比赛中,PHP不死马是维持权限的有效手段。但在本地测试环境中(Ubuntu 22.04 + 宝塔面板 + PHP8),发现以下异常现象:

  1. 通过蚁剑等webshell管理工具上传不死马脚本
  2. 上传成功后删除不死马文件
  3. 初始阶段无法删除(正常现象)
  4. 几分钟后,不死马进程自动消失,文件可被删除

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配置

  1. 定位PHP-FPM配置文件(路径可能因环境而异):

    /www/server/php/80/etc/php-fpm.conf
    

    /www/server/php/80/etc/php-fpm.d/www.conf
    
  2. 找到并修改request_terminate_timeout参数:

    request_terminate_timeout = 1000
    

    将值调整为更大的数值(如1000秒)

  3. 重启PHP-FPM服务使配置生效

5.2 其他可能的解决方案

  1. 在脚本中添加set_time_limit(0)取消执行时间限制
  2. 修改不死马代码,使其定期"自我唤醒"(在超时前重新启动)
  3. 使用其他持久化技术替代纯PHP死循环

6. 验证方法

  1. 上传修改后的不死马脚本
  2. 监控PHP进程是否持续存在
    ps aux | grep php
    
  3. 检查文件是否保持不可删除状态
  4. 观察PHP-FPM日志是否有超时警告

7. 安全注意事项

  1. 此解决方案仅用于安全研究和测试环境
  2. 在生产环境中,应加强安全防护,防止不死马攻击:
    • 定期检查异常PHP进程
    • 监控文件系统异常
    • 限制PHP脚本执行权限
    • 使用入侵检测系统

通过以上分析和解决方案,可以解决在本地测试环境中PHP不死马进程自动终止的问题,为安全研究提供稳定的测试环境。

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