网站恶意跳转和挂马常常绑在一起,但处理思路要分开:跳转只是“症状”,背后可能是后门、是配置被改、也可能是第三方 JS 被篡改。网站恶意跳转怎么解决,核心是先定位它在哪一层,再按层清除,最后验证不再复发。乱删文件只会越修越乱。
一、先分清是哪一层在跳
跳转发生在不同层,查法完全不同。服务端跳转:响应头里直接有 301/302 和 Location,来自 .htaccess、Nginx/Apache 配置、或程序里的 header 函数。前端 JS 跳转:curl 正常、浏览器里跳,来自页脚脚本、公共头部或第三方 JS。数据库跳转:配置表被写入跳转地址,后台改完刷新又跳回来。本机或运营商劫持:换设备换网络就不跳,问题不在站。分清层是第一步,否则你在程序里找半天,实际是 .htaccess 在作怪。
二、逐层定位来源
服务端层,先看 .htaccess(或 web.config),有没有 RewriteRule 把请求重定向到陌生域名;再看 Nginx 的 conf 里有没有被人加的 return 302。程序入口层,看 index.php、公共头部文件顶部有没有被插 header 跳转。数据库层,搜配置表里有没有陌生域名。前端资源层,检查页脚 footer、第三方统计/JS 文件是否被篡改插入了 window.location。还有一个常被忽略的入口:访问日志。翻出跳转型访问的请求特征,看 Referer 和 UA,往往能反推出后门脚本的位置。下面这段把配置和模板里的跳转规则集中抽出来,一眼看清被改了哪些。
# 抽出站点配置和模板里的跳转规则,集中看一眼被改了哪些
import os, re
ROOT = "/www/example.com" # 改成你的站点根目录
TARGET = (".htaccess", "web.config", ".user.ini")
RULE = re.compile(
rb"(Redirect\s+\d+|RewriteRule[^\n]*Redirect|"
rb"header\s*\(\s*['\"]location|"
rb"window\.location|document\.location|"
rb"http-equiv\s*=\s*['\"]?refresh)",
re.I,
)
for root, _, files in os.walk(ROOT):
for f in files:
fp = os.path.join(root, f)
if f not in TARGET and not f.endswith((".php", ".phtml", ".inc")):
continue
try:
data = open(fp, "rb").read()
except OSError:
continue
if RULE.search(data):
print("命中跳转规则:", fp)
跑出来的清单,按“配置→入口→模板”的顺序逐个打开看,基本能锁定源头。注意数据库里的跳转要单独用后台或命令行检索配置表,脚本扫不到数据库内的值。
三、清除步骤
定位到后,清除分四步。第一,删掉或还原被篡改的部分:.htaccess 用干净版本覆盖、程序入口被插的行删掉、模板还原、数据库里异常记录清掉。第二,恢复一份确认干净的备份做兜底,清错了能回滚。第三,改掉所有相关密码:服务器、数据库、后台、FTP,任何一处没换,攻击者都能再写回去。第四,升级程序和依赖,因为跳转往往是利用已知漏洞进来的,不补洞清完还会再中。
四、验证与防复发
清完用三件事验证:curl -I 看响应头不再有陌生 Location;换无痕窗口访问确认不跳;site: 看快照恢复正常。防复发要在入口收口:上传目录禁执行、关危险函数、后台加两步验证、加 WAF 规则拦注入。再把“定期扫跳转代码”纳入运维例行,下次一有苗头就报警。恶意跳转处置的要点就一句:先定位层、再清根、最后把口子堵上。
相关阅读:
A5创业网 版权所有