当前位置:首页 >> 网站维护

服务器PHP后门清除后又被二次感染怎么办?排查与修复思路

发布时间:2026-10-16 作者:吉安市云尚网络
简介 从清除后被二次感染的踩坑出发,讲清PHP网页后门残留、计划任务与不死马的定位方法,给出可落地的排查命令与加固顺序。

清完第二天又中招,问题多半不在你删的那几个文件

PHP站被挂后门,很多人第一步是找到那几个eval开头的php删掉,改密码,重启服务,觉得完事。结果第二天日志又冒出POST到陌生php的200记录。这不是没清干净,而是攻击者在你清之前就埋了触发条件——计划任务、开机脚本、另一个隐藏后门、被改过的正常文件,删掉的那几个只是表象。

下面按"攻击链残留在哪里"来讲,不谈概念,只讲怎么找、怎么确认。

先看入口是怎么进来的,定位才能收口

如果日志里能看到这类请求,基本可以确定入口:

  • URI含 ?s=index/ hinkpp/invokefunction,对应 CVE-2018-20062,ThinkPHP 5.0.23及以下、5.1.31及以下,invokefunction未过滤,POST body直接调system,无需登录。
  • URI为 /_ignition/execute-solution,对应 CVE-2021-3129,Laravel Ignition 8.4.2及以下在debug开启时phar反序列化。debug模式生产环境没关,等于门开着。
  • URI为 /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php,对应 CVE-2017-9841,PHPUnit 4.8.28前/5.6.3前,这个文件本不该出现在生产环境,一旦暴露可直接POST php://input执行代码。

看到以上任一条返回200,别只删后门,先把对应组件升级或删除,否则清多少次都会被重新写入。

残留点之一:时间线对不上的php文件

后门的mtime通常和access.log里第一次POST的时间只差几秒,这是最可靠的线索。按时间筛:

find /www/wwwroot -name "*.php" -type f -mtime -3 -exec ls -la {} ;

把所有近3天改动过的php列出来,重点看uploads、cache、runtime、data这类本该只放数据的目录里出现的php。更直接的一条:

find /www/wwwroot -name "*.php" -newermt "2024-01-01" -type f

正常业务的php不会频繁改mtime,凡是这个列表里出现在非代码目录的,逐个打开确认。

残留点之二:混淆后门的通用特征

攻击者会把后门塞进正常文件末尾,或用一个看起来像缓存的文件名。用关键字扫比肉眼翻快得多:

grep -rEn "eval(|assert(|base64_decode(|gzinflate(|create_function(" /www/wwwroot --include=*.php

重点不是所有命中都要删——有些框架本身会用到eval,要看上下文。真正可疑的是:一行超长、变量名随机、配合gzinflate或base64_decode嵌套、文件顶部注释写着"cache"或"license"。再叠加一句话参数名搜索:

grep -rEn "$_(POST|GET|REQUEST)[['"](z0|cmd|pass|c|shell)['"]]" /www/wwwroot --include=*.php

参数名是攻击者习惯,z0、cmd、pass、c这几个命中率最高。命中的文件直接隔离,不要在原目录删,先移出站点根目录再分析。

残留点之三:删不掉的不死马

你删了文件,刷新又回来,通常是三种情况:

  • 计划任务里有下载脚本,crontab -l 看当前用户,再检查 /etc/cron.d、/var/spool/cron 下所有用户。
  • 正常php文件被插入了include,指向另一个后门,删掉被引用的没用,要找到引用方。
  • 后门进程常驻,用 ps aux | grep -v grep | grep -E "php|sh" 看有没有可疑的常驻php或sh,尤其是指向/tmp、/dev/shm的。

把这三处清完,再删后门文件,才不会再长出来。

日志特征:怎么判断是不是已经被打进来了

看access.log两个信号:一是短时间大量POST到*.php,响应200但返回体积只有20到50字节,UA是Mozilla/4.0或空,这是后门在回显命令结果;二是上面提到的三个CVE路径出现且返回200,说明入口已经被利用。后门的mtime通常紧贴这些POST的首条时间,把两者对齐看,能反推出攻击者落地了哪些文件。

修复顺序:先断入口,再清残留,最后改口令

顺序错了就是白干:先升级或删除存在漏洞的组件(ThinkPHP、Ignition、PHPUnit),关闭debug,再按上面的命令清残留,然后改数据库、SSH、面板口令,最后检查出网连接,看有没有反向shell。改密码放在清残留之后,否则攻击者用旧后门照样能再进来。

这类问题排查思路大致如上。如果拿不准自己的站有没有中招,可以联系:电话 18316973247,微信 yswl898,先做个免费检测看看结果。