XSSによる攻撃(まとめ)

というわけで、一応問題を全部解いたので、jerlsbergのドキュメントを一部サマリつつ、まとめ。

Cross-Site Scripting(XSS)とは

XSSとは、攻撃者の管理下に無いコンテンツに対し、実行コードを埋め込むことを許してしまう脆弱性です。通常、javasciptをHTML中に埋め込むことになります。もしユーザーが、悪意のあるコードが埋め込まれてしまったサイトを閲覧すると、そのコードがユーザーのブラウザで実行されます。結果、攻撃者は、そのユーザーの個人情報の取得、ページの改竄、CSRFなどを引き起こすことが可能になります。(今回のケースでは、ユーザーのcookie値を取得するデモをおこないました)

また、jerlsbergでは、XSSを以下の2種類に分けて説明しています。

reflected XSS attack

refrected XSS attackでは、攻撃コードそのものがURLに埋め込まれています。攻撃は、以下の流れで実行されます。

  1. ユーザーがブラウザ上で、攻撃者によって作成された悪意のあるURLリンクを踏んでしまう。
  2. サーバーがその攻撃に対するレスポンスを、ユーザーに返す。
  3. サーバーのエスケープ処理が不適切なことにより、攻撃コードがコンテンツに埋め込まれてしまい、結果、ユーザーのブラウザ上で、悪意のあるコードが実行されてしまう。
stored XSS attack

stored XSS attackでは、攻撃コードはサーバー上に保持(通常、データベース)されています。攻撃は、以下の流れで実行されます。

  1. 攻撃者が、悪意のあるコードを事前にコンテンツに埋め込む。
  2. ユーザーが、コードが埋め込まれたコンテンツを参照する。
  3. サーバーは、ユーザーにレスポンスを返す。このときに、正しいエスケープ処理が実装されていないことにより、攻撃コードがレスポンス中に埋め込まれてしまい、結果、ユーザーのブラウザ上で実行されてしまう。
補足

Amazon.co.jp: PHPサイバーテロの技法―攻撃と防御の実際: GIJOE: 本」では、前者をScript Injection、後者をXSSと呼んでいるようです。

  • Script Injectionは、悪意ある攻撃者がそのサイトにアクセスし、コンテンツを改竄。改竄されたコンテンツをユーザーが閲覧することで、攻撃が成立する。
  • XSSでは、悪意のあるリンクをユーザーに踏ませることで、間接的に攻撃を行う。アクセスしたユーザーのブラウザに、悪意のあるリンクによる処理結果が(エスケープされずに)表示されることで、攻撃が成立する。

XSSの防御方法

XSSを防ぐには、「コンテンツを出力するときに、正しくエスケープすること」が必要になります。ただし、この「正しく」が難しい。

通常、HTMLのエスケープ処理といった際には、HTMLタグのエスケープ(<→&lt;、>→&gt;へ変換したり、PHPのhtmlspecialcharsを使用)がまず頭に浮かびますが、これだけでは不十分なケースもあります。(今回の問題「Stored XSS via HTML Attribute 」など。)

XSSを防ぐには、少なくとも、以下が必要なのではないでしょうか。

  1. 変数をHTMLに出力する際には、htmlspecialcharsなどで必ずエスケープする(設計上、確実に安全と思われる場合であっても、変数を出力する際には必ずエスケープする。こうすることで、エスケープ実装漏れを防ぐことができる。例えば、エスケープ漏れが無いかをチェックするツールを作成してもよい。)
  2. onmouseoverなど、イベントを記載可能な位置に、スクリプトを埋め込める設計としない
  3. どうしても埋め込む必要がある場合には、ホワイト・リストでチェックする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です