打开一个被挂马的网站,首页源码里多出一段陌生JS,点进栏目页、文章页却干干净净,这种情况在应急处理里很常见。不是你看漏了,也不是内页一定安全,而是攻击者往往只动了首页这一层。服务器被挂马,不等于整站每个文件都被改;黑产讲究成本和收益,首页是流量入口、权重最高、被抓取最频繁,改一个首页文件就能把恶意脚本铺给最多访客,没必要把几百个内页全改一遍。
最常见的原因是首页文件被直接插入代码。很多站点首页是独立的index.php、index.html、default.asp,内页由列表页、内容页模板生成,攻击者拿到webshell后只往首页文件里塞一段script,或者只改首页引用的header.php、footer.php。如果内页模板和首页模板不是同一套,内页自然看不到。有些程序首页单独调用一个统计代码、广告位、推荐位,恶意JS就藏在这些小片段里,首页加载,内页不加载。
还有一种情况是服务器配置或伪静态规则被动手脚。Apache的.htaccess、Nginx的配置文件里可以写规则,只对根路径“/”或首页文件返回一段注入内容,访问内页时规则不匹配,页面就正常。这种挂马在文件里搜不到恶意代码,查源码却能看见,容易让人误判。排查时要看站点根目录的配置文件,也要看是否有异常的重写规则、反向代理规则。
缓存和CDN也会制造“只有首页有”的假象。首页访问量大,容易被CDN、浏览器、页面缓存插件缓存住旧版本;攻击者注入后,首页缓存里留着恶意JS,内页缓存早已更新或没被缓存。清理时只删文件不刷缓存,过一会儿首页又出现,就是这个原因。处理时要同时清CDN边缘缓存、程序缓存、浏览器缓存,再复测。
更隐蔽的是条件挂马。恶意代码不直接写死,而是判断User-Agent、Referer、IP、Cookie、访问时间,甚至只对搜索引擎蜘蛛或从搜索结果进来的访客输出。你直接访问内页可能不触发,用curl模拟百度蜘蛛抓首页却能抓到。这种挂马常见于SEO劫持,首页权重高,黑产更愿意把赌博、色情、医疗类的跳转脚本放在首页。排查时别只用浏览器看,换几个UA、带不同Referer、用手机和桌面各访问一次,再对比源码。

数据库被改也不能忽略。WordPress、织梦、帝国这类程序,首页可能调用数据库里的站点设置、统计代码、公告内容。攻击者不进文件,只在数据库options表或配置表里插入一段JS,首页调用就中招,内页不调用就没事。查文件查不到,得进数据库搜script、eval、atob、document.write、iframe和陌生域名。
发现首页多出这段JS,先别急着删。把首页源码、内页源码、原始备份各存一份,搜可疑外链域名和加密函数,定位是文件、配置、数据库还是缓存。再看服务器日志,找最近被写的文件、异常POST、陌生IP登录。清理时先隔离备份,替换被改文件,改掉后台、数据库、FTP、SSH密码,查webshell、计划任务、异常账号,升级程序和插件,最后上WAF或文件监控。首页有马内页没有,不代表内页安全,只说明攻击者把入口选在了首页。