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就以为安全了?大概率白干。后门往往已建立多层控制链: