我以为是入口,其实是陷阱,我把这种“伪装成视频播放”的链路追完了:你以为关掉就完事,其实还没结束

那天晚上,我像平常一样在某论坛里翻视频链接。页面上的大图、播放按钮、时间戳——一切看起来像是普通的视频入口。我点下去,结果不是播放,而是一连串奇怪的跳转:先是新标签,接着一个看起来像广告的页面又自动打开,一个弹窗提示允许通知,关闭后页面又尝试植入某些东西。我关掉了标签,以为结束了。第二天手机一整天疯狂收到推送广告,电脑也被一堆垃圾页面劫持。那一刻我决定把这条链路彻底追完:从“伪装成视频播放”的页面开始,到所有可能的持久化手段、推送订阅和广告网络,逐一拆解。
下面把我的调查过程、技术细节和清理/防护方法写出来,方便你遇到类似情况能快速判断和处理。
一、常见伪装手法:看似视频,实为诱导与持久化入口
- 假播放按钮(fake play button):大图加“播放”图标,点击会触发脚本,而不是加载视频。这类脚本常用来触发重定向或打开隐藏的 iframe。
- 隐藏 iframe 或新窗口(hidden iframe/new tab):点击后页面插入一个 1x1 的 iframe 或直接用 window.open 打开目标域名,用户无感知。
- 多段跳转(redirect chain):中间经过数个跟踪/联盟/广告域,通过HTTP重定向或 meta-refresh、JavaScript location 替换,目的是混淆源头并获利。
- 弹窗 + 误导性按钮(modal with deceptive buttons):页面模仿系统提示,诱导点击“允许”浏览器通知、下载或安装。
- 请求权限或注册 Service Worker:一旦用户点击允许,脚本会尝试注册 Service Worker、订阅 Push 或在 localStorage/IndexedDB 写入标识,从而实现关标签后仍能推送或重定向。
- 利用浏览器 API 阻止离开(beforeunload/history manipulation):弹出确认框、篡改历史,增加关闭成本。
二、我追踪链路的实战步骤(你也可以照着做) 1) 重现场景并打开开发者工具
- 在浏览器里重现一次点击(建议在隔离环境或虚拟机里),打开 DevTools(F12)。
- Network 面板开启 Preserve log(保留日志),过滤类型为 “Document / XHR / Script / WebSocket”。
2) 观察重定向和请求
- 记录第一跳的 URL 和随后所有 3xx 重定向目标。很多广告/联盟会在 URL 上带参数(aff、sub、clickid),这些能帮你追溯链条上的第三方。
- 注意请求的域名是否频繁变换、是否有来自可疑 CDN 或短域名服务的调用。
3) 检查页面脚本与嵌入内容
- Sources 面板或 Elements 面板查看注入的 script 标签、iframe。恶意链路通常把可疑脚本通过动态插入执行。
- 搜索关键字:serviceWorker.register、Notification.requestPermission、pushManager.subscribe、window.open、location.replace、postMessage。
4) 查看持久化入口
- Application(或 Storage)面板:
- Service Workers:是否有注册项?是否采取了 skipWaiting 或 background sync?
- Push Subscriptions / Notifications:是否有订阅端点?
- LocalStorage / IndexedDB / Cookies:是否写入奇怪的 token、uuid、tracking_id?
- 如果发现注册过 Service Worker 或 Push 订阅,单单关掉页面并不能撤销这些持久化手段。
5) 追踪服务器端回链
- 在 Network 中点开可疑请求,查看请求/返回头(Request/Response headers),寻找 set-cookie、Set-CSP、Location(重定向目标)等。
- 通过 whois 或域名历史查询可查到广告网络的上下游。
三、为什么“关掉页面”很多时候不够
- 推送通知(Web Push)由浏览器与服务端通信,授权一次之后,服务器可以向浏览器发送推送,即使没有打开该页面。
- Service Worker 在注册后会在浏览器范围内持续存在,能在后台接收推送、执行 fetch、显示通知,关闭 Tab 无法撤销它的工作。
- 本地存储(localStorage/IndexedDB)和 cookie 会保存识别信息,若配合第三方广告网络,重新访问其他页面时会被再次识别并触发。
- 恶意扩展或外部程序也可能在用户点击后被诱导安装,从而独立于浏览器页面继续运行。
四、如何彻底清理(按优先级) 1) 立即操作(快速止损)
- 关闭相关标签页,断开设备网络(可选,防止继续与服务器通信)。
- 在浏览器设置中撤销对该站点的“通知”权限:设置 -> 网站设置 -> 通知 -> 找到可疑域名并删除/禁止。 2) 清理持久化条目
- 打开 DevTools -> Application(或 Storage):
- Service Workers:如果有可疑项,点击 Unregister(解除注册)。
- Clear storage:选择相关站点,点击 Clear site data(清除站点数据)。
- Push Subscriptions:在 Service Worker 面板或Push相关项里,执行 unsubscribe(如果有按钮),或者通过浏览器设置回收权限。
- 浏览器设置 -> 隐私与安全 -> 清除浏览数据:选择包括 Cookies、Cached images and files、Site settings(站点设置)一起清除。 3) 检查并移除可疑扩展
- 扩展可能是后门。逐个禁用最近安装的扩展并观察问题是否消失,必要时彻底移除。 4) 重置浏览器或新建配置文件
- 若不确定问题范围,重置浏览器或创建新用户配置文件通常能立即恢复干净环境。 5) 设备层面检查
- 在 Windows / macOS 上运行可信的反恶意软件扫描。对于安卓设备,检查是否有新装的应用获得了“显示在其他应用上方”或“获取通知”权限。 6) 若怀疑已被进一步入侵
- 更换重要账号密码,启用两步验证;监控异常登录和交易。
五、防护与预防(给普通用户和站长的建议)
- 普通用户的防护清单
- 浏览器装广告拦截器(uBlock Origin)、反指纹/反追踪插件(Privacy Badger),并开启脚本控制(像 uMatrix/ScriptSafe)能明显降低被植入的风险。
- 没把握就不要点击“允许通知”、不要下载来源不明的软件、不要安装陌生扩展。
- 定期检查浏览器的站点权限、扩展和 Service Worker。
- 网站/站长的自我保护
- 检查站点上第三方脚本来源,把不必要的广告网络移除或替代;对外部脚本采用 Subresource Integrity (SRI) 和严格的 Content Security Policy(CSP)。
- 对用户交互元素(例如视频封面)不要直接嵌入外链脚本,采用可靠的播放器或把外链隔离在 sandbox iframe 内。
- 监控第三方资源的变更:CDN 上的脚本被替换可能瞬间把恶意代码推送给所有站点访问者。
六、常见误区拆解
- “我没有点允许,怎么还会收到推送?” 有些链路会先用社会工程学诱导点击,或者把“允许”放在误导性的按钮里;还有的是通过注册 Service Worker 然后显示本地窗口伪装成系统通知。
- “清缓存就行了” 清除缓存不等于撤销 Service Worker、撤消推送订阅或删除本地存储。清缓存只是去掉静态文件副本。
- “只有安卓/手机才会被推送” 桌面浏览器也支持 Web Push,Chrome/Edge/Firefox 都会在桌面显示通知。

