php后门需多维度检测:静态扫描(yara规则)、运行时行为(strace)、数据库/配置项、系统痕迹;单纯删文件或关键词搜索易漏检。

PHP后门不能靠“删文件”就完事——它可能藏在正常文件里、伪装成图片、嵌在日志或缓存中,甚至通过数据库触发。单纯找 eval、system、base64_decode 这类关键词会漏掉大量变形后门(比如用 str_rot13 绕过、拆分字符串拼接、或利用 preg_replace 的 /e 修饰符)。
识别可疑 PHP 文件:别只盯 webroot
后门常不在显眼路径,而藏在上传目录、备份压缩包、旧版本 CMS 插件、甚至被忽略的 .git 或 .svn 目录里。
- 先检查所有可写目录:
find /var/www -type d -perm -2 -o -perm -20 | grep -E "(upload|cache|tmp|backup)" - 扫描隐藏文件和压缩包:
find /var/www -name ".*" -o -name "*.zip" -o -name "*.tar*" -o -name "*.7z",解压后递归查 PHP 内容 - 重点盯这些文件名:
shell.php、1.php、wp-cache.php、license.txt(有些后门故意放 txt 后缀但内容是 PHP) - 注意图片文件:用
file image.jpg看真实类型,再用strings image.jpg | grep -i "php|eval|assert"提取可读文本
静态扫描要绕过混淆:用 yara + 自定义规则
正则匹配容易失效,yara 规则能处理多层编码、变量重命名、函数别名等场景。官方 PHP 后门规则集(如 FLARE-YARA)覆盖常见变种,但需配合自定义逻辑。
- 安装 yara:
apt install yara(debian/ubuntu)或brew install yara(macos) - 下载基础规则:
git clone https://github.com/InQuest/yara-rules,启用php-webshell.yar和obfuscation.yar - 关键自定义点:加一条匹配“字符串拼接后执行”的规则,例如:
$a = "as"; $b = "sert"; $c = $a.$b; $c($_POST['x']);→ yara 中用正则/$[a-z_]+s*=s*["']as["'].*$[a-z_]+s*=s*["']sert["'].*$w+.$w+s*;s*$w+s*($_/s - 扫描命令:
yara -r -f -C ./yara-rules/php/ /var/www(-C显示匹配上下文)
运行时行为检测:用 strace 捕获异常系统调用
很多后门不改文件但会调用 exec、proc_open、shell_exec,strace 能抓到真实动作,比静态分析更准。
立即学习“PHP免费学习笔记(深入)”;
- 定位疑似进程:先用
ps aux | grep php-fpm | grep -v "master|pool"找 worker 进程 PID - 挂载 strace:
strace -p <pid> -e trace=execve,openat,connect -s 256 -o /tmp/trace.log 2>&1</pid> - 触发可疑请求(比如访问某个上传的 PHP 文件),观察日志中是否出现:
execve("/bin/sh", ["sh", "-c", "..."]或连接外网 IP 的connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("185.199.108.153")}, 16) - 注意:strace 开销大,仅用于短时排查;生产环境建议用 eBPF 工具(如 bcc 的
execsnoop)替代
数据库和配置项也是后门温床
wordpress 的 wp_options 表、Discuz 的 common_setting、甚至 nginx 的 fastcgi_param 都可能被注入恶意代码,这类后门不落地文件,重启服务即复活。
- 查 WordPress 主题/插件选项:
select option_name, option_value FROM wp_options WHERE option_value LIKE "%eval%" OR option_value LIKE "%base64_decode%"; - 检查 Nginx 配置中是否滥用
fastcgi_param SCRIPT_FILENAME,比如硬编码为/var/www/html/shell.php - 导出数据库全文搜索:
mysqldump --skip-extended-insert your_db | grep -E "(eval|assert|system|passthru)s*(" - CMS 缓存目录(如 Drupal 的
public://php/twig)也要扫:Twig 模板编译后可能含恶意 PHP 字节码
最麻烦的不是找到后门,而是确认它有没有被用于横向移动——比如是否新建了管理员账号、是否修改了 cron、是否在 /etc/passwd 里加了新用户。清理完 PHP 文件,务必检查系统层痕迹。