做站时间长了,几乎每个站长都会遇到或者听说过网站被挂马的事。前一天网站还好好的,第二天打开首页自动跳转到博彩网站;或者搜索引擎里搜到自己的域名,标题却变成了卖假药的广告;更严重的是整站文件被删、数据库被清空、被勒索要求付费恢复。遇到这种情况,最忌讳的是慌,更忌讳的是"把文件重新上传一遍"就以为完事了——后门不清理,重装一百遍也会再被入侵。这篇文章把网站被挂马后的应急响应流程完整梳理一遍,从发现症状到清理后门再到堵住漏洞,一步步来。
一、先判断:你的网站是不是真的被入侵了
网站异常的常见症状包括:首页或部分页面被插入跳转代码,访问时自动跳转到别的网站;页面底部、文章中间出现不明广告代码;百度收录的标题和描述被篡改,出现博彩、药品等关键词;网站文件被修改或删除,后台账号多出陌生管理员;数据库被删或被加密勒索;服务器 CPU 异常飙升,可能有挖矿程序在运行。
出现上述任何一种情况,先不要急着"修复",第一步是保护现场。如果可以,立刻在云控制台给服务器打一个快照,或者至少把网站目录和数据库导出备份一份。现场保住了,后续分析才有依据,万一清理过程中操作失误,也有退路。
然后断开网站对外的"伤害":如果是首页跳转这类正在影响访客的问题,可以先用维护页顶上,或者临时把站点目录指到一个空白页,减少被搜索引擎判定为垃圾站的时间窗口。注意不要直接关机或拔网线,那样会丢掉正在运行的进程线索,影响后面的分析。
二、第二步:找出后门文件
后门文件是攻击者留在服务器上的"钥匙",不找出来删掉,一切修复都是白做。找后门有几个高效的手段。
手段一:按修改时间找最近被动的文件。攻击者写入的后门文件,修改时间通常在入侵时间点附近。找出最近几天被修改的 PHP 文件:
# 找出最近 3 天修改的文件,排除日志和缓存目录 find /home/wwwroot -name "*.php" -mtime -3 -type f -ls # 找出所有目录下的可疑文件,按时间排序 find /home/wwwroot -type f -mtime -3 -newer /tmp/marker 2>/dev/null
如果不知道入侵时间,可以用网站开始异常的时间作为参考,往前推几天。
手段二:搜索恶意代码特征。Webshell 常用的函数和特征字符串很固定,直接全站搜:
# 常见的执行函数和加密特征 grep -rn "eval(\$_POST" /home/wwwroot --include="*.php" grep -rn "assert(\$_POST" /home/wwwroot --include="*.php" grep -rn "base64_decode" /home/wwwroot --include="*.php" -l grep -rn "system(\$_REQUEST" /home/wwwroot --include="*.php" grep -rn "shell_exec" /home/wwwroot --include="*.php" grep -rn "create_function" /home/wwwroot --include="*.php"
搜索出来的文件逐个检查,正常的程序代码里很少出现这些组合。特别注意 eval、assert、system、shell_exec 配合 $_POST、$_GET、$_REQUEST 的组合,这是 Webshell 的经典写法。base64_decode 也要留意,很多后门把恶意代码 base64 加密后写在文件里,解码执行。
手段三:检查图片文件里藏的木马。攻击者经常把恶意代码附加在图片文件末尾,再配合一个 .php 文件去 include 它。检查最近被修改的图片文件:
# 找出近 3 天修改的非 PHP 文件 find /home/wwwroot -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \) -mtime -3 -ls # 用 file 命令检查图片是不是真的图片 file 可疑图片.jpg
如果 file 输出里出现 PHP 字样,说明图片里被塞了代码。还要检查上传目录,这是后门的高发区。
手段四:检查被改成 .php 后缀的图片和备份文件。攻击者会把一个图片内容改名成 .php 上传,或者利用解析漏洞让图片以 PHP 方式执行。检查上传目录里扩展名和内容不符的文件:
# 在 upload 目录里找出文件头不是图片的文件 find /home/wwwroot/upload -type f -name "*.php" -ls
手段五:检查定时任务和启动项。高级一点的攻击者会写 crontab 定时任务,让后门定期复活:
# 查看当前用户的定时任务 crontab -l # 查看所有用户的定时任务 cat /etc/crontab ls /etc/cron.d/ ls /etc/cron.hourly/ /etc/cron.daily/ # 查看系统服务里有没有可疑项 systemctl list-units --type=service | grep -iE "php|shell|miner|xmr"
发现可疑的定时任务,先看它执行的脚本内容,确认是后门再删除。
三、第三步:清理后门与修复文件
后门找出来之后,清理要讲究顺序,防止"边清理边被重新写入"。
第一步,先断掉后门的"源头":如果发现可疑的定时任务、常驻进程,先停掉。查看当前运行的异常进程:
# 查看占用 CPU 高的进程 top -c # 查看所有进程,找可疑的 ps aux --sort=-%cpu | head -20
挖矿程序的特征非常明显:CPU 占用接近 100%,进程名是随机字母或者伪装成系统进程名,命令行里带有矿池地址。发现后记录进程 PID 和父进程,先 kill 掉,再根据 /proc/PID/exe 找到程序文件删除。
第二步,删除确认的后门文件。删除前先备份到 /tmp 或者打包留档,万一误删了正常文件还能恢复,也方便事后取证。
第三步,修复被篡改的正常文件。如果程序文件被插入恶意代码,比如 index.php 被加了跳转代码,最佳方案是从官方渠道重新下载原版文件覆盖,而不是手工删掉那几行——攻击者可能改了多处,你只删了看到的那一处。WordPress、Typecho、Discuz 这些开源程序都可以从官网下载对应版本,对比替换被改过的核心文件。
第四步,清理数据库里的恶意内容。有些攻击往数据库里灌数据,比如往文章表插入垃圾内容、往用户表插入管理员账号。检查方式:
# 登录 MySQL,查看用户表有没有陌生账号 mysql -u root -p SELECT user, host, authentication_string FROM mysql.user;
再看网站自己的用户表有没有多出来的管理员,网站设置里有没有被修改的选项,比如被替换的首页模板、被添加的恶意脚本。
第五步,全面修改密码。服务器 root 密码、SSH 密钥(重新生成)、数据库密码、网站后台管理员密码、FTP 密码、云厂商账号密码,全部改一遍。特别是云厂商账号,如果攻击者是通过控制台进去的,改密码的同时还要检查有没有被添加陌生的 API 密钥、子账号。
四、第四步:堵住入侵的入口
清理干净只是治标,找到并堵住入侵途径才是治本。个人站长网站被入侵,最常见的原因就这几类,对照排查。
原因一:弱密码。网站后台密码、SSH 密码、数据库密码太简单,或者多个地方用同一个密码。攻击者拿到一个密码,横扫所有服务。对策:所有密码换成强密码并各不相同,后台开启二次验证。
原因二:程序漏洞未修补。开源程序(WordPress、Typecho 等)和插件、主题存在已知漏洞,长期不更新被扫描利用。对策:保持程序和插件更新到最新版本,删除不用的插件和主题。老版本的 Typecho 有个著名的反序列化漏洞,很多老站就是被这个打穿的。
原因三:文件上传漏洞。上传功能过滤不严,允许上传 PHP 文件,或者上传目录可以执行 PHP。对策:上传目录禁止执行脚本,Nginx 里配置:
location ~* /(upload|uploads|attachments)/.*\.(php|php5|phtml)$ {
deny all;
}
原因四:目录权限过松。网站目录权限设置成 777,任何人都能写文件。对策:目录权限设置为 755,文件 644,属主设为运行用户,只给必要的目录写权限(比如缓存、上传目录)。
原因五:备份文件泄露。网站根目录放着 backup.zip、wwwroot.sql 这类备份文件,被扫描到直接下载,等于把源码和数据库拱手送人。对策:备份文件放到网站根目录之外,或者用随机文件名并设置访问权限。
原因六:服务器其他服务失守。比如 Redis 未授权访问、phpMyAdmin 弱口令、FTP 弱口令、面板管理端口暴露。对策:所有管理服务关闭公网访问或限制来源 IP,Redis 设置密码并绑定内网地址。
五、第五步:事后复盘与长期防御
网站恢复访问之后,还有几件事要做,否则下次还会栽同样的跟头。
第一,分析入侵途径。翻看服务器日志,找到攻击者是怎么进来的。重点看 SSH 登录日志、网站访问日志里对上传接口和管理后台的请求:
# 找 SSH 成功登录记录,确认有没有陌生 IP 登进来过 sudo grep "Accepted" /var/log/auth.log # 找网站日志里访问后台和上传接口的记录 grep -E "wp-login|login.php|upload" /home/wwwlogs/access.log | head -50
第二,部署监控。安装 fail2ban 防爆破,给磁盘、CPU、内存加监控告警(很多云厂商自带免费的监控告警),网站文件加完整性校验——可以用简单的脚本每天比对文件哈希,发现异常立即通知。
第三,备份策略复盘。这次能恢复,靠的是不是备份?备份是否完整、是否在异地?没有异地备份的赶紧补上,这次是网站被入侵,下次可能是磁盘故障,备份永远是最可靠的兜底。
第四,向搜索引擎申诉。如果网站被挂马期间被搜索引擎收录了垃圾页面、标题被篡改,清理完成后要到百度搜索资源平台提交申诉,说明网站已被修复,请求恢复快照。同时给网站加上 HTTPS,减少中间人篡改的可能。
六、常见问题 FAQ
问:后门删了又出现,反复复活怎么办? 说明入侵入口没堵上,或者还有没发现的后门(比如藏在定时任务、系统目录、内存里的)。先彻底检查 crontab、开机启动项、系统服务,再确认所有密码都已更换、程序已更新。如果反复复活,最彻底的办法是重装系统、只恢复数据,重新部署程序。
问:重装系统能解决挂马吗? 能解决服务器层面的后门,但前提是只恢复干净的数据备份,不要把原网站目录原样拷回去——那里面可能还藏着后门。重装后立刻做安全加固,再恢复数据。
问:被勒索了,要不要付费? 个人站长遇到数据库被加密勒索,建议先评估:如果有备份,直接恢复,不付费;如果没有备份,可以尝试用数据恢复工具抢救,但成功率不高。付费不保证能拿回数据,还可能被二次勒索。平时做好备份才是根本。
问:怎么防止再次被挂马? 记住这五条:强密码不重复、程序勤更新、上传目录禁执行、备份放站外、日志有监控。五条都做到,被挂马的概率会大幅下降。
问:被挂马期间流失的收录和流量还能回来吗? 能。清理干净、申诉通过后,搜索引擎会重新抓取。保持稳定更新,恢复期一般一到三个月。重点是确保网站真的干净了再申诉,否则二次被抓到问题会更难恢复。
网站被挂马不可怕,可怕的是处理不当导致反复被入侵。记住应急响应的主线:保护现场、找出后门、清理修复、堵住入口、复盘加固。把这篇文章存下来,希望你的网站永远用不上,但真遇到事的时候,照着流程走能少走很多弯路。