Akamai Bypass! Advanced XSS から学ぶ

ソース:

hosein-vita.medium.com

脆弱性:WAF

 

訳:

WAF (Web アプリケーション ファイアウォール) をバイパスする冒険はすべて、とらえどころのない注入ポイント (要塞の装甲のことわざで言うところの亀裂) を見つける探求から始まり。
そして、悪名高きパラメータ「returnUrl」の存在が夜の灯台のように紛れもなく輝いているエンドポイントに出会ったとき、私の旅は始まり。

 

「再試行」ボタンはペイロードが挿入される場所で


ペイロードを自動的に挿入しますペンテスターとして、この状況に近づくたびに、 javascript:alert(1) が、応答として得られたものは次のとおりで。

 

 

次に、分析フェーズに入り。
JavaScript プロトコルにアクセスできるかどうかを確認するために、「javascript:」以降をすべて削除して。
幸いにも、次のことができ。

 

 

javascript:」の後の「alert」がブロックされていることが判明したため、他の一般的な JavaScript 関数のブロックを評価するために調査を進めました。
javascript:prompt()」、「javascript:console.log()」、および「javascript:eval()」をテストしましたが、すべて失敗に終わり。 Web アプリケーションのセキュリティ対策が徹底されており、私の最初の試みが効果的に阻止されていることが明らかになり。 

 

それでも私は、より高度な JavaScript 関数を調べて、セキュリティ防御を回避できるものがないかどうかを判断することにして。
特に「javascript:atob()」と「String.fromCharCode()」をテストしましたが、いずれの試みも同じ結果、つまり失敗に終わり。

 

徹底的なテストの結果、次のことがわかりました。
decodeURI()はブロックされないままであり、脆弱性を悪用する潜在的な経路を提供し。

 

according Mozilla

 

decodeURI()関数は、以前に作成された URI (Uniform Resource Identifier) をデコードします。 または同様のルーチンによって作成された。 

 

その仕組みは次のとおりで。
基本的に、次のような関数を使用する場合、 javascript:decodeURI("<h1>vita</h1>")をクリックし、[再試行] ボタンをクリックすると、デコードされた URI の結果が次のように表示され。

 

「再試行」ボタンをクリックした後の結果 

 

次に、さらに深く掘り下げて、次のようなペイロードを挿入し。 <img src=x onerror=alert(1)>の中で decodeURIXSS を実現するための関数ですが、私が得たのは次のとおりで。

 

 

なくても onerror=alert(1), それでも同じエラーが発生し、WAF が悪意のあるタグを効果的にフィルタリングしていることを示して。

すべてのタグを確認しましたが、1 つのタグを除いてすべてブロックされました <button>は働いている!

 

そこで < button autofocus onfocus=alert(1)>test</button> で 最初の試みを行ったところ、はい! またブロックされ: 

 

 

WAF はイベント ハンドラーの検査を続けましたが、時間を無駄にすることはなく。
すべてのイベント ハンドラーに対してブルート フォースの試行を迅速に開始し、どのイベント ハンドラーが応答をトリガーしたかを特定し。 

 

 

イベント ハンドラーの配列内で、「 onbeforetoggle」だけでした。 ブロック メカニズムを回避できたのは。

その後、PortSwigger にアクセスして、 <button>タグと「onbeforetoggle」イベント ハンドラーを調べた結果、利用可能なオプションが次の 2 つだけであることがわかり。

 

 

両方のオプションを試しましたが、主に WAF が効果的にブロックしていたため、どちらも成功しません、 alert(1)

しかし、どうやってこの問題を克服できたのでしょうか?

基本的に、「javascript:」の後に変数を宣言でき。
そこで、少し創造力を発揮して、 alert()関数を 3 つの別々の変数に変換し。
次のようになります。

javascript: var a = 'ale'; var b = 'rt'; var c = '()'

 

次に、これらの変数を文字列内で連結し。
decodeURI関数を実行すると、最終的なペイロードは次のようにな。

 

javascript:var a="ale";var b="rt";var c="()";decodeURI("<button popovertarget=x>Click me</button><hvita onbeforetoggle="+a+b+c+" popover id=x>Hvita</hvita>")

 

その結果。

 

 

 

ほなほな。