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, (^^ゞ