Hello there, ('ω')ノ
修復の考古学 — 古代の XSS の発見と解読を。
脆弱性:
記事:
今回は、ログイン リダイレクト機能が。
どのように機能しているかを確認したかったので。
新しいアカウントを登録し、確認トークンを取得し。
これは適切なハッシュであり、中途半端なタイムスタンプではなく。
Web アプリにログインできて。
URL をコピーして、認証されていない別のブラウザに貼り付け。
当然のことながら、ログイン ページにリダイレクトされましたが。
今度は returnTo という興味深いパラメータが長い 16 進数値で指定されていて。
認証後の URL:
https://example.com/en-us/messages/my-messages.html?test=123
ログインページの URL:
https://example.com/en-us/login.html?returnTo=67616373756d6f23757d2e656f246e6162726f247e65647e6f636f2332313d347375647f3c6d64786e237567616373756d6d297d6f2375
アプリに正常に再ログインすると、/authcheck というエンドポイントで。
returnTo の値がデコードされ、最初に移動しようとしていた認証後の URL が返され。
このデコードされた値は window.location.href に直接渡されたので。
これは潜在的な DOM XSS の発生を待っている可能性があると考えて。
returnTo パラメータを16 進値をデコードしようとすると、おかしくなり始めて。
67616373756d6f23757d2e656f246e6162726f247e65647e6f636f2332313d347375647f3c6d64786e237567616373756d6d297d6f2375
下記がデコードした結果で。
gacsumo#u}.eo$nabro$~ed~oco#21=4sud.<mdxn#ugacsumm)}o#u
これは暗号化できず、ほぼランダムではなく。
文字シフト や文字頻度分析などを試して。
次に、一連の A 文字を含む別のダミー URL を試して、何が起こるかを確認して。
認証後のダミー URL:
https://example.com/en-us/messages/my-messages.html/AAAAAAAAAAAAA?test=123
そこにはたくさんの41があり。
それは間違いなく暗号化ではなく、16 進文字列の奇妙さで。
文字列をデコードしようとして、次のようにデコードされ。
VÖÒ.Öò7Vv.77VÖò7WÒæVòFæ.’&òGæVGæö6ò3#.ÓG7VGó…………..òÆÖG.â7Vv.77
Cyberchef が 16 進文字の 41 ではなく 14 を印刷しようとしていることに。
気付いたとき、何が起こっているのかを考えながら座って。
16進デコードの前にリバース機能を追加してこれを手に入れて。
デコードされた値は、下記で。
アクセスしようとした Post-Auth URI が、文字列の途中でトランプのように。
切り取られていることがわかり。
元の文字列の後半が先頭に追加されていて。
このように文字列を実際に「シャッフル」しなくてよくて。
クリア テキストに戻ることに。
これらの 3 つの手順 (カード カット、16 進エンコード、リバース) を。
逆にするだけで、XSS シンクに渡したい任意の値を作成できて。
javascript:prompt(document.domain)
ベガス カード カット:
(document.domain)javascript:prompt
16 進エンコード:
28646f63756d656e742e646f6d61696e296a6176617363726970743a70726f6d7074
上記の逆: 4707d6f62707a3470796273637166716a692e69616d6f646e247e656d65736f64682
ログインが成功すると、returnTo の細工された値が /authcheck に送信され。
デコードされて javascript:prompt(document.domain) に戻され。
window.location.href シンクに直接ヒットして。
$.ajax({
type: "GET",
url: "/authcheck",
data: getParam("returnTo"),
success: function(data) {
// I didn't test this jQuery code, but it looked kinda like this ¯\_(ツ)_/¯
window.location.href = data.returnToPath
}
})
これは脆弱性レポートで提出することができてうれしかった XSS PoC URL の 1 つで。
設置されている Akamai WAF を簡単にバイパスできて。
ほこりっぽい古いレポートが受信トレイに残っている場合は、それらを掘り下げて。
どのような宝物が見つかるかを確認することをお勧めして。
Best regards, (^^ゞ