PHP后门通常不长期驻留进程,而是通过Web请求动态执行,高CPU/内存的PHP进程不等于正在运行后门;需结合进程树、打开文件、环境变量等定位真实入口及后门文件位置。

确认异常进程是否由PHP后门触发
PHP后门通常不长期驻留进程,而是通过Web请求动态执行(比如被上传的shell.php),所以「高CPU/内存的PHP进程」不等于「正在运行后门」——更可能是被恶意脚本反复调用、或后门启用了持久化手段(如写入cron、fork子进程、或利用pcntl_fork逃逸)。先别急着杀进程,得看它从哪来。
实操建议:
- 用
ps aux --forest | grep php查进程树,重点看父进程是不是apache2、php-fpm或nginx——如果是,说明是Web服务器正常派生的,问题大概率出在被请求的PHP文件上 - 用
lsof -p [pid] | grep -E '\.php|\.log|\/tmp|\/dev/shm'看该进程打开了哪些文件,尤其留意非常规路径下的.php或匿名临时文件(如/tmp/phpXXXXXX) - 对可疑进程执行
cat /proc/[pid]/environ | tr '\0' '\n' | grep -E '(HTTP_|REQUEST_|QUERY_STRING)',能还原出原始HTTP上下文,常暴露被调用的恶意URL路径
定位PHP后门文件的4个关键位置
后门不总在网站根目录。攻击者会藏进日志、缓存、甚至合法CMS插件里。别只扫wwwroot,优先查这些地方:
-
/var/log/apache2/access.log和/var/log/nginx/access.log:用awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -20找高频访问的陌生.php路径(如/wp-includes/js/tinymce/plugins/compat3x/css.php) -
/tmp和/dev/shm:PHP后门常通过file_put_contents('/tmp/xxx.php', base64_decode(...))落地,用find /tmp -name "*.php" -mmin -60查1小时内新建的PHP文件 -
php-fpm.conf中的php_admin_value[open_basedir]设置范围外的目录(如/home/*/public_html下未被限制的子站) - WordPress等CMS的
wp-content/plugins/和wp-content/themes/里,检查最近修改时间异常的.php文件,特别是名字像index_old.php、cache.php、update.php这种
删后门不能只删文件:必须同步清理3类残留
删掉一个shell.php就以为安全了?大概率白干。后门往往已建立多层控制链:
立即学习“PHP免费学习笔记(深入)”;
- Web层后门可能只是入口,真正的C2通信藏在
curl_exec或file_get_contents调用中,检查error_log里是否有大量Failed to open stream: Connection refused指向境外IP - 检查
crontab -l和/etc/cron.d/下是否有伪装成系统任务的PHP调用,例如:* * * * * /usr/bin/php /tmp/.cache/run.php - MySQL里可能存有WebShell配置,连库执行:
SELECT * FROM information_schema.columns WHERE column_name LIKE '%pass%' OR column_name LIKE '%key%';,再查对应表内容——有些后门把密钥写进wp_options的theme_mods_*字段
验证是否还有隐蔽PHP后门的2个硬核方法
静态扫描容易漏,得靠运行时行为捕获。两个低成本但有效的办法:
- 临时启用PHP的
auto_prepend_file,在php.ini里加一行:auto_prepend_file = "/path/to/log_calls.php",然后在log_calls.php里写:file_put_contents('/tmp/php_calls.log', date('Y-m-d H:i:s') . " " . $_SERVER['SCRIPT_FILENAME'] . "\n", FILE_APPEND);。重启PHP服务后跑几小时,再查/tmp/php_calls.log里有没有非预期路径 - 用
strace盯住一个疑似正常的PHP-CGI进程:strace -p [pid] -e trace=openat,connect,sendto 2>&1 | grep -E '\.php|\.so|:[0-9]{4,}',直接看到它打开了什么文件、连了哪些IP、发了什么数据
后门清理最麻烦的不是找文件,而是它可能已改写PHP扩展、替换libphp.so、或在opcache里缓存了恶意opcode——如果反复出现同类行为,别犹豫,重装PHP并关闭allow_url_include和enable_dl。











