Hello there, ('ω')ノ
1 回目のバグ報奨金の報告 — ログイン ページのオープン リダイレクトの脆弱性を。
脆弱性:
オープンリダイレクト
記事:
シンプルなものである Open Redirect から。
注:
オープンリダイレクトを探している場合は、まず、このタイプの脆弱性を
受け入れるかどうかをポリシーで確認して。
ほとんどのプログラムは、アクセス トークンの窃取などにつながる場合にのみ、
オープンリダイレクト を受け入れて。
これはプライベート プログラム Web アプリケーションで発見したバグなので、
redacted.com と呼ぶことに。
フロントエンドには、2020 年の Web アプリケーションで非常に人気のある
Vue.js が使用されていて。
JavaScript フレームワークを使用する場合の問題は、ソース ファイルが
一般に公開されるため、フロントエンド側で何を処理または計算するかに
注意する必要があることで。
ログイン ページを調査していたところ、ログイン成功後のユーザの送信先を
決定するために使用される **next** という名前の GET パラメータが
あることがわかり。
これは、いわゆるオープンリダイレクトの脆弱性をテストするための
一般的なサイトで。
知っていたいくつかの一般的なペイロードを試してみましたが失敗したため、
コードを詳しく調べることにし、最終的に検証機能を見つけて。
これがその関数のコードで。
export function redirectAllowed(): string | null {
let next = router.currentRoute.query.next
if (hasSessionStorage()) {
next = next || window.sessionStorage.getItem('next') || ''
window.sessionStorage.removeItem('next')
}
if (next) {
let sanitized = new URL(sanitized(decodeURIComponent(next.toString())))
if (config.RedirectWhiteList.filter((e: string) => sanitized.origin.indexOf(e) === 0).length > 0) {
return sanitized.toString()
} else {
return null
}
} else {
return null
}
}
次のパラメータ、この行の検証に注目してみると。
if (config.RedirectWhiteList.filter((e: string) => sanitized.origin.indexOf(e) === 0).length > 0) {
簡単にするために、この関数は次の URL の発信元がホワイトリストの URL と
一致するかどうかをチェックして。
問題は、このコードがマッチングに .indexOf === 0 を使用していることで。
これを人間の言葉で言うと、URL が許可されたオリジンで始まるかどうかを
チェックして。
サブドメインの仕組みにより、このロジックには欠陥があり。
これらのペイロードを検討して。
許可されたオリジンが redacted.com であると仮定して。
redacted.com ⇦ パス
redacted.com.attacher.com ⇦ パス
2番目のペイロードは、redacted.com ではなく、attacher.com を指す URL で。
したがって、被害者が 2番目のペイロードを持つ次のパラメータを使用して
ログインすると、被害者は代わりに attacher.com にリダイレクトされ。
したがって、このログイン ページは オープンリダイレクト 攻撃に対して脆弱で。
Best regards, (^^ゞ