半夜接到站长夺命连环Call,说网站没宕机,但百度搜出来全是博彩广告,或者手机打开直接跳“澳门新葡京”,电脑端看着却正常。
新手遇到这事,第一反应往往是:赶紧把 index.html 删了,或者把首页代码里的跳转链接抠掉,然后重启 Nginx。
结果呢?第二天早上又跳了。
说句掏心窝子的话:只清代码不查根因,等于给黑客当免费保洁。 今天这篇复盘,纯一线排障视角,不扯虚头巴脑的理论,直接上命令,手把手教你把网站劫持连根拔起。
一、 先做劫持类型判定(核心难点)
遇到劫持,别急着登服务器,先搞清楚是哪种劫持。类型判错了,后面全白干。
1. DNS域名劫持
现象:不管你是电脑、手机,还是换个浏览器,只要访问这个域名,全跳恶意网站。甚至有时候连 ping 域名出来的 IP 都不是你服务器的 IP。
特征:全网通杀,或者特定运营商(比如只有联通用户跳,电信正常)。
2. 网站代码后门劫持
现象:电脑端访问正常,手机端跳;或者正常用户访问正常,百度蜘蛛(Baiduspider)访问就跳。
特征:服务器本地 curl localhost 看着正常,外网访问就触发跳转。黑客在代码里写了 UA(User-Agent)判断。
3. Nginx/Apache配置劫持
现象:全站跳,或者特定目录(比如 /news/)跳。清一下浏览器缓存,或者换个无痕模式,表现又不一样。
特征:代码里干干净净,但 Web 服务器配置文件(如 .htaccess、nginx.conf)里被加了 rewrite 或 return 301。
二、 第一时间应急止损(千万别乱动)
发现被劫持,禁止随意批量删文件!禁止直接重启服务! 你一动,现场就破坏了,黑客留下的痕迹全没了。
正确姿势:
三、 Linux服务器全套排查命令
直接上服务器,按下面这套命令挨个过。
1. 定位最近被篡改的文件
黑客改过文件,必定会留下修改时间。查最近 3 天内被修改过的文件:
# 查找网站目录下最近3天修改过的文件,按时间倒序
find /var/www/html -type f -mtime -3 -exec ls -lt {} + | head -n 50
2. 筛查恶意跳转代码(核心)
黑客最喜欢用 eval、base64_decode、document.write 和 <iframe>。直接全盘搜:
# 忽略二进制文件,搜索常见后门和跳转特征
grep -rnI -E 'eval\\(|base64_decode|document\\.write|<iframe|window\\.location|navigator\\.userAgent' /var/www/html
注:如果搜出来一堆正常的 JS 库,可以加个 -v 排除掉,或者重点看那些文件名是一串随机字母的数字组合的文件。
3. 核查首页及隐藏文件篡改
有时候黑客不改 index.php,改的是 header.php 或者 footer.php,甚至藏在隐藏文件里。
# 查找所有隐藏文件(黑客最爱把后门放在 .xxx.php)
find /var/www/html -name ".*" -type f
# 检查首页及公共头部文件是否被加了跳转
head -n 20 /var/www/html/index.php
head -n 20 /var/www/html/header.php
4. 排查 .htaccess 伪静态劫持
如果是 Apache 或者 Nginx 开启了伪静态支持,.htaccess 是重灾区。
# 找出所有 .htaccess 文件并查看内容
find /var/www/html -name ".htaccess" | xargs cat
看到 RewriteRule .* http://恶意域名 [R=301,L] 这种,直接实锤。
5. 排查 Nginx 恶意 Lua 脚本或配置
有时候代码里没后门,是 Nginx 配置被改了。
# 搜索 Nginx 配置目录里的恶意跳转和 Lua 脚本
grep -rnI -E 'rewrite.*http|return 301|content_by_lua|access_by_lua' /etc/nginx/
6. 网站日志溯源
查日志,看黑客是怎么进来的,或者看哪些 IP 在疯狂访问。
# 统计访问最多的前 20 个 IP,看有没有异常扫描 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20
# 搜索特定恶意 UA 或者 POST 上传请求
grep -i "POST.*upload" /var/log/nginx/access.log | tail -n 50
7. 排查异常外联 IP
看看服务器有没有被植入挖矿木马或者反弹 Shell,在往外连。
# 查看当前所有 ESTABLISHED 状态的网络连接
ss -antp | grep ESTABLISHED
如果发现服务器在连一些奇怪的境外 IP,赶紧 kill 掉进程,并顺藤摸瓜找木马文件。
四、 本地客户端排查(排除假劫持)
有时候服务器根本没被黑,是你本地网络或者 DNS 被污染了。
打开 CMD,执行:ipconfig /flushdns
把电脑连上手机热点,或者换个浏览器无痕模式访问。如果手机热点访问正常,WiFi 访问就跳,那就是你路由器被黑了,或者运营商 DNS 被劫持了。去路由器后台把 DNS 改成 223.5.5.5 或 119.29.29.29。
五、 溯源分析:黑客到底从哪进来的?
找到后门只是第一步,不知道入口,明天还会被挂。重点排查以下几个入口:
六、 分级修复方案
1. 临时紧急恢复
如果业务不能停,先做临时止血:
- 在 Nginx 配置里,把恶意跳转的 rewrite 注释掉。
- 把被篡改的首页文件,从备份里覆盖回去。
- 重启 Nginx:nginx -t && systemctl reload nginx。
2. 彻底清理后门
- 把排查出来的恶意文件、.htaccess 里的恶意规则、Nginx 里的恶意配置,全部删掉或还原。
- 如果后门太多删不干净,最稳妥的办法是:只保留图片/附件等静态资源,把 PHP/Java 代码全部用官方原版覆盖,然后重新导入数据库。
3. 配置加固(防二次劫持)
- 锁死目录权限:网站目录所有者改为 www,权限设为 755。chown -R www:www /var/www/html
chmod -R 755 /var/www/html - 上传目录禁执行:在 Nginx 里配置,禁止附件目录执行 PHP。location ~* /wp-content/uploads/.*\\.php$ {
deny all;
} - 改密码:改掉服务器 SSH 密码、数据库密码、CMS 后台管理员密码。
4. 域名解析锁死
去域名解析控制台,开启 “域名解析锁定” 或 “修改需手机/邮箱二次验证”,防止黑客再次篡改 DNS。
七、 总结:90%站长踩坑点
最后盘点一下,处理了上百起劫持事件,发现大家最容易犯这几个致命错误:
网站劫持排查,拼的就是细心和耐心。按这套流程走一遍,基本能把 99% 的劫持问题揪出来。
干运维和安全,就是个不断填坑的过程。如果你也遇到过奇葩的劫持案例,或者在排查时卡壳了,欢迎在评论区留言交流。
觉得这篇实战复盘有用的兄弟,麻烦点个赞、收藏一下,防走丢!你的支持是我继续输出硬核干货的最大动力,咱们下篇见!



