Shikata Ga Nai

Private? There is no such things.

LAB: WebSocketのメッセージ改ざんによるXSS攻撃の手法と解説

Hello there, ('ω')ノ

✅ 背景と目的

WebSocket通信を使うチャットアプリケーションなどでは、ユーザーの入力内容がそのまま他のユーザーに送信され、画面に表示されるケースが多くあります。

こうした場面で入力の検証やサニタイズが不十分だと、WebSocketメッセージを改ざんすることでXSS(クロスサイトスクリプティング)攻撃が成立します。


🧪 攻撃の前提とメッセージの構造

例えば以下のような通信構造になっているとします:

✅ 正常なメッセージ送信

ユーザーが「Hello Carlos」と送信すると:

{"message":"Hello Carlos"}

✅ サーバーから他のユーザーへ再送信

<td>Hello Carlos</td>

🚨 XSS攻撃の成立例

この構造でタグやイベント属性がフィルタされていなければ、以下のような悪意あるメッセージでXSSが成立します:

{"message":"<img src=1 onerror='alert(1)'>"}

✅ 結果:他のユーザーのブラウザでJavaScriptが実行される

<td><img src=1 onerror='alert(1)'></td>

→ このように、imgタグ+onerror属性は典型的なXSSテストベクトルです。


🛠 攻撃実施手順(Burp Suite使用)

ステップ 操作
① WebSocket通信を「WebSockets」タブで確認 該当の送信メッセージを探す
② 右クリック →「Send to Repeater」 メッセージを改ざん・送信するため
③ メッセージ本文を書き換える {"message":"<img src=1 onerror='alert(1)'>"}
④ Sendでサーバーへ送信 攻撃メッセージを他ユーザーに転送させる
⑤ 被害者の画面でスクリプト実行を確認 alert(1)ポップアップが表示されれば成功

✅ 対策方法

対策 内容
エスケープ処理 <, >, ', " などの文字をHTMLエンコード
コンテンツセキュリティポリシー(CSP) 'unsafe-inline' を禁止する
メッセージのスキーマ検証 JSON構造と内容の型や長さを事前に検証する

✅ まとめ

  • WebSocket経由でも、通常のHTTPと同様にXSS脆弱性は発生する
  • JSON内のデータをHTMLにそのまま表示してしまう構造は特に危険
  • 攻撃はBurpで簡単に再現・検証可能

Best regards, (^^ゞ