はじめに
ずっと前に見つけたメールアドレスのXSSの話。
少し珍しいので今更ながら記録に残しておくけど、結論としては、ちゃんと念のためにHTMLエンコードしていれば脆弱性診断で指摘されることはなかった。という内容です。
Webアプリケーションの仕組み
ユーザ登録機能の最初のメールアドレス仮登録画面だったかな...(記憶が曖昧だけど...)
- 入力データとして、メールアドレスを取得
- メールアドレスを元にAddressクラスのインスタンスを生成
- XSSを発動するようなメールアドレスとして不適切な書式の場合は、Addressクラス生成に失敗して、Exceptionが発生する
- エラーが発生した場合は、単純な「エラーです」のみ表示(入力データは使われない)
- 正常な場合は、そのままメールアドレス宛にメールを送信して、終了。
- 最後に入力データ(メールアドレス)を画面上に(HTMLエンコードせずに)表示して終了
最後にHTMLエンコードしていないのは、XSSを発動するようなメールアドレスなら、途中の例外発生で処理が中断されるので、必要ないということ。
突破方法
ということで
"コメント" <メールアドレス>
というメールアドレスの適切な書式を使って突破できました。
具体的には
"<s>XSS</s>" <メールアドレス>
な感じ
結論
文頭でも記述したけど、念のためにHTMLエンコードすることはとても重要ということ。