Shikata Ga Nai

Private? There is no such things.

1000$ for Open redirect via unknown techniqueを訳してみた

Hello there, ('ω')ノ

 

未知の手法によるオープン リダイレクトに 1000 ドルを。

 

脆弱性:

 オープンリダイレクト

 

記事:

 https://ruvlol.medium.com/1000-for-open-redirect-via-unknown-technique-675f5815e38a

 

1.オープンリダイレクトとは

オープンリダイレクトが何であるかはすでに知っているはずで。

そうでない人にとっては、リモートの攻撃者がリダイレクト先として

任意の値を設定できる場合で。

たとえば、次のような「正当な」リダイレクト チェーンを考えてみて。

 

 https://example.com/login?redirectUrl=https://app.example.com

 

最終的には app.example.com につながり。

しかし、誰かがこの URL を次のように改ざんしたらどうなるか。

 

 https://example.com/login?redirectUrl=https://evil.com

 

最終宛先を app.example.com から evil.com に変更したことに注目して。

Web アプリが URL の変更を許可しており、最終的に

https://evil.com にリダイレクトされる場合、それは未解決のリダイレクト脆弱性で。

この動作は、フィッシング攻撃の実行、認証フローからのアクセス トークンの窃取、

または SSRF などの他の脆弱性と組み合わせて使用される可能性があり。

多くのことが潜在的に可能になり。

 

2.トップレベルのナビゲーション経由でリダイレクトを開く

未知の オープン リダイレクト トリックは iframe に基づいていて。

iframe を使用したことがある場合は、同じオリジン ポリシーが

適用されていることをご存知かと。

つまり、他のオリジンを指す iframe をロードすると、

JavaScript を使用してその値を読み取ることができず。

Web サイト上の次の HTML ページを検討してみて。

 

<iframe src="https://example.com" id="child"></iframe>
<script>
var a = document.getElementById("child").contentWindow.document;
console.log(a.body.innerHTML);
</script>

 

コンソールには iframe コンテンツの代わりに空の文字列が表示され。

これが SOP の目的で。

JavaScript は、クロスオリジン コンテキストでのオブジェクトの

読み取り/操作に制限されなければならず。

もちろん、postMessages や CORS などの合法的な SOP バイパスは

たくさんありますが、それは現在の問題とはあまり関係なく。

 

つまり、オープン リダイレクトが何であるか、

iframe が何であるかはすでに知っていて。

どこにバグがあるのかと疑問に思うかもしれず。

デフォルトでは、SOP はトップレベルのナビゲーションを許可しますが、

これは仕様によりオープンリダイレクトにつながり。

次の親ウィンドウ

HTML ページ (http://avtohanter.ru/poc.html でホストされている) を検討してみて。

 

<iframe src="http://ruvlolmail.temp.swtest.ru/toplevel.html">

 

SOP により、親ページは子ページにアクセスできず、その逆も同様で。

ただし、子ページ (http://ruvlolmail.temp.swtest.ru/toplevel.html) に

次のスクリプトが含まれている場合だと。

 

<html>
<head>
</head>
<body>
<script>
top.window.location = "https://www.google.com"
</script>
</body>
</html>

 

子ウィンドウは、top.window.location プロパティにアクセスでき、

その値を操作できて。

これにより、avtohanter.ru/poc.html にアクセスすると、

すぐに www.google.com にリダイレクトされるケースが発生して。

「allow-top-navigation」ディレクティブを使用せずに

iframe にサンドボックス属性を追加すると、この動作が修正され。

たとえば、次のように使用できて。

 

<iframe Sandbox="allow-scriptsallow-same-origin" src="http://ruvlolmail.temp.swtest.ru/toplevel.html">

 

そして、そのようなリダイレクトは当てはまらず。

 

3.GitLab の 1000$ のバグ

ここで、11.8.0 で修正された、GitLab での実際の iframe を

利用したオープン リダイレクトの問題をデモしたいと思い。

オリジナルの開示レポートへのリンクは次のとおりで。

 

 https://hackerone.com/reports/437142

 

この問題は、開発者が Javascript コードを記述して iframe に

プレビューできる WEB IDE で発生していて。

これは XSS 攻撃を防ぐために必要で。

問題は、プレビュー Iframe にサンドボックス属性が含まれていないため、

悪意のある JavaScript がトップレベルのリダイレクトを実行できるということで。

その様子は次のとおりで。

 

 

 

 

4.自分で見つける方法

もちろん、この問題を報告したプログラムは Gitlab だけではなく。

そして、それを自分で見つけて試してみることもできるかと。

注意すべきことは次のとおりで。

 

・iframe 内で (XSS を防ぐためのサンドボックスとして) JavaScript を

 実行する可能性がある場合は、トップレベルのナビゲーションが

 許可されているかどうかを確認して。


・任意の URL 値を持つ iframe を挿入できる場合 (フォーラムなど)、

 サンドボックス属性があり、トップレベルのナビゲーションが

 許可されているかどうかを確認して。


・期限切れのドメインを指している iframe がある場合は、

 それを取得してスクリプトを配置してみることができて。

 

Best regards, (^^ゞ