凌晨三点,网站手机响了。被挂客户说网站打不开,马解百度搜出来的网站标题被改成了“澳门线上赌场”。我打开电脑一看,被挂首页源码里多了一段加密的马解JS,藏在</body>前面,网站肉眼几乎看不出来。被挂这就是马解典型的挂马。
很多人以为网站被挂马只是网站首页被改,其实远不止。被挂常见的马解有三种:一是暗链,页面里塞满隐藏的网站<a>标签,指向博彩站;二是被挂跳转,用window.location把移动端用户导到色情App下载页;三是马解挂马下载,利用<iframe>加载远程恶意脚本,专门偷Cookie或挖矿。第一种最容易被发现,后两种能潜伏几个月。
发现挂马后,第一件事不是删代码。先备份,把整站文件和数据库打包下载到本地。为什么?因为你要对比,要找入口。我见过有人直接删了恶意代码,结果第二天又被注入,因为漏洞还在。备份完,用grep -r "eval(" /www/wwwroot/这类命令扫一遍,或者直接搜base64_decode、document.write。恶意代码通常经过混淆,但特征跑不掉。
找到恶意代码只是第一步。真正要命的是入口。八成以上的挂马来自三个地方:CMS漏洞、弱口令后台、过期的插件。去年一个客户用的是某老牌CMS,后台密码是admin123,攻击者直接登录,在模板里插了马。另一个案例是WordPress的wp-file-manager插件漏洞,没升级,被上传了.php后门。所以,别只盯着首页,去查access.log,看有没有POST /admin.php后面跟着奇怪的参数,或者GET /?x=../../etc/passwd这种。
清理的时候,别只删首页那段JS。后门可能藏在uploads目录里,文件名伪装成cache.php或1.jpg.php。用find /www -name "*.php" -mtime -7列出最近修改的文件,挨个看。我习惯用diff对比官方源码,差异部分就是问题。数据库也别放过,wp_options表里可能被插了<script>,或者wp_posts里多了几条垃圾文章。搜索<script>和<iframe>,手动清。
清理完,立刻改密码。后台、数据库、FTP、SSH,全换。别用admin、root、123456。然后打补丁,CMS升级到最新版,插件删掉不用的。服务器层面,open_basedir限制一下,disable_functions里禁掉eval、system、exec。如果用的是Nginx,加一条location ~* \.(php|asp|jsp)$ { deny all; }到上传目录,防止直接执行。
最后,别以为清完就没事了。挂马往往伴随SEO劫持,百度快照和搜索结果里可能还留着恶意标题。去百度搜索资源平台提交死链,或者用site:命令查一下,有异常页面就申请删除。同时,装个WAF,云锁或安全狗都行,至少能挡掉一批自动化扫描。我自己的服务器还加了fail2ban,SSH尝试五次就封IP。
说个真实教训。有个客户被挂马后,我帮他清干净了,结果两周后又中招。查了半天,发现是同一台服务器上另一个站有漏洞,攻击者通过crossdomain.xml跨站提权。所以,一台服务器上多个站,一个都不能漏。挂马不是单点问题,是整条链路的事。
如果你现在正对着被挂马的网站发愁,别慌。先断网,再备份,然后按日志找入口。实在搞不定,找专业的人,别自己乱删。数据无价,手快容易出事。