Shikata Ga Nai

Private? There is no such things.

Remediation Archeology — Finding and Decoding an Ancient XSSを訳してみた

Hello there, ('ω')ノ

 

修復の考古学 — 古代の XSS の発見と解読を。

 

脆弱性

 XSS

 

記事:

 https://bendtheory.medium.com/remediation-archeology-finding-and-decoding-an-ancient-xss-ea541c1106d1

 

今回は、ログイン リダイレクト機能が。

どのように機能しているかを確認したかったので。

新しいアカウントを登録し、確認トークンを取得し。

これは適切なハッシュであり、中途半端なタイムスタンプではなく。

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 つで。

 

https://example.com/en-us/login.html?returnTo=4707d6f62707a3470796273637166716a692e69616d6f646e247e656d65736f64682

 

さらに、ペイロードを「エンコード」する機能により。

設置されている Akamai WAF を簡単にバイパスできて。

 

ほこりっぽい古いレポートが受信トレイに残っている場合は、それらを掘り下げて。

どのような宝物が見つかるかを確認することをお勧めして。

 

Best regards, (^^ゞ