XSSとは:出力エスケープと安全な表示を学ぶCTF入門

掲示板、検索結果、プロフィールなどでは、利用者が入力した文字列を別の利用者に表示することがあります。

クロスサイトスクリプティング(XSS)は、表示するはずのデータがブラウザにコードとして扱われ、ページの文脈で実行されてしまう問題です。

入力と出力は別の問題

入力を受け取る時点で形式を確認することは、データの品質を保つために役立ちます。

しかし、HTML、属性、URL、JavaScript文字列など、出力先ごとに解釈の規則が異なるため、入力検証だけでは表示時の安全性を決められません。

表示する文脈に合った出力エスケープで、データをコードから分離する必要があります。

防御を重ねる

テンプレート機能の自動エスケープを無効にする処理は、必要な場合でも出力先を限定して検討します。

Content Security Policyは、想定外のスクリプト実行を抑える層として役立ちますが、エスケープの代わりにはなりません。

Cookieの属性や権限設計も、仮に表示処理に誤りがあったときに扱える情報を減らすための別の対策です。

CTFで得るべき説明

演習では、どの入力が、どのページの、どの文脈に表示されるかを追います。

問題が示す結果だけでなく、データをテキストとして表示するにはどの処理が必要かを説明できる状態を目指します。

この理解は、テンプレートの選択やレビューで危険な出力箇所を見つける基礎になります。

対象を演習環境に限定する

他人が利用するサイト、投稿欄、問い合わせフォームでXSSを試すことは許可されません。

キノコハッカーの問題と、明示的に許可されたテスト環境だけを使ってください。

WebカテゴリのチャレンジSQLインジェクションの基礎Webセキュリティ入門を順に読むと、入力から出力までの境界を整理できます。