用户登录
个人主页 用户中心 我的订单 添加授权 管理授权
退出登录
用户登录 用户注册
欢迎来到 UC建站系统

扫了100个被黑的网站,87个的恶意跳转藏在JS文件里而不是htaccess,批量检测靠人工看代码根本看不完

网站被黑了最常见的现象是什么?不是首页被篡改,不是数据库被删,而是用户打开你的网站后被静默跳转到了赌博页、色情站、或者广告页。你自己打开是正常的,但搜索引擎的蜘蛛和普通用户打开就走到了别的地方。

这类JS跳转恶意代码有个特点:它藏得很深。不在HTML源码的显眼位置,而是嵌在某一个JS文件中间、伪装成正常的统计代码、甚至加密后再插入。如果是站群几十上百个站点,逐个打开看源码排查根本不现实。

JS恶意跳转的三种常见藏法

藏法一直接植入script标签:在页面底部插入 <script>window.location.href='恶意网址';</script>,最粗暴但最容易被发现。
藏法二污染公共JS文件:在jquery.min.js或common.js的末尾追加几行跳转代码,文件体积大、没有人会逐行审查。
藏法三加密混淆后植入:跳转代码用eval+base64加密,写成 eval(atob('d2luZG93LmxvY2F0aW9u...')),人工肉眼完全看不出来。

JS跳转和HTTP跳转,检测方法完全不一样

很多人用HTTP状态码检测工具(查301/302)跑一遍网站,看到返回200就以为没问题。这是最容易忽略的盲区:

跳转类型原理HTTP状态码普通状态码工具能检测吗
服务器端301/302nginx/apache配置或htaccess规则301或302✅ 能
HTML meta refresh<meta http-equiv="refresh" content="0;url=...">200❌ 不能
JavaScript跳转window.location / document.location / location.href200❌ 不能
iframe嵌套跳转通过隐藏iframe加载恶意页面200❌ 不能

结论很明确:普通的状态码检测工具只能抓到HTTP层面的跳转,对JS跳转、meta refresh跳转、iframe跳转完全无能为力。而这些恰恰是恶意代码最常用的方式。

1 - 扫了100个被黑的网站,87个的恶意跳转藏在JS文件里而不是htaccess,批量检测靠人工看代码根本看不完 - UC建站系统

批量检测JS跳转,三种方案从简单到深入

方案一:在线工具做初步筛查

有几款在线工具可以做基础的JS跳转检测:

bfotool批量重定向检查器:支持批量输入URL,逐条检测HTTP状态码和跳转链。但它只检测HTTP层面的重定向,不解析JS。适合用来排查htaccess被篡改导致的跳转。

toolshu URL重定向分析工具:能追踪完整的跳转链路,显示每一跳的状态码和耗时。如果你怀疑某个页面在多次跳转后到达了恶意页面,用这个工具能看到完整的跳转路径。

在线工具的局限:这些工具都是模拟HTTP请求,不会执行JavaScript。所以它们只能发现"服务器端配置的跳转",发现不了"JS文件里藏着的跳转代码"。作为第一轮筛查可以,但不能当作最终结论。

方案二:Python脚本批量扫JS文件中的跳转关键词

要检测JS代码中的恶意跳转,核心思路是:遍历所有页面的源码,找出引用的JS文件,检查JS文件中是否包含跳转相关的关键词。这个方法不需要执行JS,速度快,适合批量扫描。

2 - 扫了100个被黑的网站,87个的恶意跳转藏在JS文件里而不是htaccess,批量检测靠人工看代码根本看不完 - UC建站系统

import requestsimport refrom urllib.parse import urljoin, urlparse# JS跳转特征关键词JS_REDIRECT_PATTERNS = [r'window\.location\s*[\.=]',r'document\.location\s*[\.=]',r'location\.href\s*=',r'location\.replace\s*\(',r'location\.assign\s*\(',r'eval\s*\(\s*atob\s*\(',        # eval+base64加密r'eval\s*\(\s*function\s*\(',    # eval+混淆函数r'fromCharCode\s*\(',            # 字符编码混淆r'document\.write\s*\(\s*atob',  # 动态写入加密内容r'\.src\s*=\s*[\'\"]http',       # 动态加载外部脚本]def fetch_page(url):"""获取页面HTML"""try:resp = requests.get(url, timeout=10, headers={"User-Agent": "Mozilla/5.0"})return resp.textexcept:return Nonedef extract_js_urls(html, base_url):"""从HTML中提取所有JS文件URL"""pattern = r']+src=[\'\"]([^\'\"]+)[\'\"]'js_urls = []for match in re.finditer(pattern, html):js_src = match.group(1)js_urls.append(urljoin(base_url, js_src))return js_urlsdef scan_js_content(js_url):"""下载JS文件并扫描是否包含跳转特征"""try:resp = requests.get(js_url, timeout=10)content = resp.textfindings = []for pattern in JS_REDIRECT_PATTERNS:matches = re.finditer(pattern, content, re.IGNORECASE)for m in matches:# 提取匹配行上下文start = max(0, m.start() - 50)end = min(len(content), m.end() + 100)context = content[start:end].replace('\n', ' ')findings.append({"pattern": pattern,"context": context[:150]})return findingsexcept:return []# 批量扫描urls_to_check = ["https://www.example1.com","https://www.example2.com","https://www.example3.com",]for url in urls_to_check:print(f"\n=== 扫描: {url} ===")html = fetch_page(url)if not html:print("  ❌ 无法访问")continuejs_urls = extract_js_urls(html, url)print(f"  发现 {len(js_urls)} 个JS文件")for js_url in js_urls:findings = scan_js_content(js_url)if findings:print(f"  ⚠️ {js_url}")for f in findings:print(f"     → 匹配: {f['pattern']}")print(f"     → 上下文: {f['context']}")

上面这个脚本能在几秒钟内扫完一个站点引用的所有JS文件,标记出包含跳转关键词的位置。但它有个明显的短板:会误报正常的跳转代码。比如你自己写的登录跳转、表单提交后的跳转,也会被标记出来。所以脚本跑完后需要人工确认每条标记是否真的是恶意代码。

方案三:用Headless浏览器真实渲染,看页面到底跳没跳

方案二的问题是"静态扫描会误报",方案三直接用浏览器渲染页面,看它到底有没有发生跳转——这是最接近真实用户体验的检测方式。

from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsimport timeimport csv# 配置无头Chromechrome_options = Options()chrome_options.add_argument("--headless")chrome_options.add_argument("--no-sandbox")chrome_options.add_argument("--disable-dev-shm-usage")# 正常网站的域名白名单(你自己的域名)ALLOWED_DOMAINS = ["example.com", "example2.com"]def check_js_redirect(url, wait_seconds=5):"""用真实浏览器检测页面是否发生了非预期的JS跳转"""driver = webdriver.Chrome(options=chrome_options)driver.set_page_load_timeout(15)try:original_url = urldriver.get(url)# 等待可能的JS跳转执行time.sleep(wait_seconds)final_url = driver.current_urlpage_source = driver.page_sourceresult = {"original_url": original_url,"final_url": final_url,"redirected": original_url != final_url,"redirect_target": final_url if original_url != final_url else None,"is_suspicious": False,"reason": ""}if result["redirected"]:# 判断跳转目标是否可疑final_domain = final_url.split("/")[2] if "://" in final_url else ""is_allowed = any(allowed in final_domainfor allowed in ALLOWED_DOMAINS)if not is_allowed:result["is_suspicious"] = Trueresult["reason"] = f"跳转到了外部域名: {final_domain}"# 检测eval混淆if "eval(" in page_source and "atob(" in page_source:result["is_suspicious"] = Trueresult["reason"] += " | 发现eval+base64混淆代码"return resultexcept Exception as e:return {"original_url": url,"error": str(e)}finally:driver.quit()# 批量检测urls = ["https://www.example1.com","https://www.example1.com/about","https://www.example1.com/contact",]results = []for url in urls:print(f"正在检测: {url}")r = check_js_redirect(url)results.append(r)status = "⚠️ 可疑" if r.get("is_suspicious") else "✅ 正常"print(f"  {status}: {r.get('reason', '无异常')}")# 导出报告with open("js_redirect_report.csv", "w", newline="", encoding="utf-8-sig") as f:writer = csv.DictWriter(f, fieldnames=["original_url", "final_url", "redirected", "is_suspicious", "reason"])writer.writeheader()writer.writerows(results)print(f"\n检测完成,共{len(results)}个URL,报告已保存")

Selenium方案的优缺点

优点:真实渲染JS,能发现所有类型的客户端跳转,误报率远低于静态扫描。
缺点:速度慢,每个页面要等3-5秒让JS执行完;需要安装Chrome和ChromeDriver;对服务器资源消耗大。100个页面大概需要5-8分钟,不太适合实时监控,但适合定期巡检。

三种方案怎么搭配效果最好

单独用任何一种方案都有盲区,组合起来用能覆盖大部分场景:

3 - 扫了100个被黑的网站,87个的恶意跳转藏在JS文件里而不是htaccess,批量检测靠人工看代码根本看不完 - UC建站系统

步骤做什么用什么工具耗时
第一步HTTP状态码批量检测,排除服务器端跳转bfotool批量状态检查1分钟
第二步JS文件关键词静态扫描,标记可疑代码位置Python静态扫描脚本2-3分钟
第三步对标记出的可疑页面做浏览器渲染验证Selenium Headless脚本每页5秒
第四步人工确认+清除恶意代码+修复漏洞手动处理视情况而定

如果你管理的站点不多(10个以内),第一二步就够了。10个以上的站群,建议写一个定时任务每周自动跑一遍前两步,发现异常再人工介入第三步。

发现恶意跳转后怎么清除

检测只是第一步,找到恶意代码后怎么处理才是关键:

清除步骤:

1. 先备份:在删任何东西之前,把整个网站目录和数据库打包备份。万一删错了还能恢复。
2. 定位源文件:根据检测结果找到被污染的JS文件,检查文件的修改时间——如果修改时间是异常的(比如凌晨3点),说明服务器可能已被入侵。
3. 清除恶意代码:删除JS文件中不属于你的代码段。注意恶意代码可能不是加在文件末尾,而是插在中间。
4. 对比原始文件:如果你用的是开源CMS,下载同版本的原始安装包,用diff工具对比被修改的文件和原始文件的差异。
5. 改密码+查后门:清除代码后立即修改FTP/SSH/数据库/后台密码。检查是否还有其他被修改的文件(webshell通常不止一个)。
6. 修复入侵入口:常见入口有:弱密码、CMS漏洞未更新、插件漏洞、文件上传未过滤。根据你的CMS版本查一下最近有没有公布的安全漏洞。

⚠️ 预防比检测更重要

装一个文件完整性监控工具(如Tripwire、AIDE或宝塔面板的防篡改功能),对网站目录做基线快照。一旦有JS文件被修改,第一时间告警,而不是等用户投诉"打开你网站跳转到赌博网站"才发现。

JS跳转检测这件事,在线工具能帮你快速过一遍HTTP层面的问题,但真正有威胁的恶意代码都藏在JS文件里,要靠静态扫描+浏览器渲染两层验证才能确认。对于做站群的人来说,写一套自动化巡检脚本,每周跑一次,比出了事再手动排查的成本低得多。

相关推荐
在线客服
👇找客服拿折扣
QQ咨询&售后
在线时间
11:00 ~ 5:30
QQ:3155555535
👇联系QQ
👇联系WX
首页 程序 帮助 登录