クロスサイトスクリプティング(XSS)の仕組みと対策について解説|サイバー攻撃

thumbnail

こんにちは。今回はWEBアプリケーションの代表的なサイバー攻撃の1つクロスサイトスクリプティング(XSS)の仕組みと対策について解説します。

クロスサイトスクリプティング(XSS)攻撃とは

クロスサイトスクリプティング(XSS)攻撃とは、WEBアプリケーションの脆弱性を悪用して悪意のあるスクリプトを埋め込み、スクリプトを実行させる攻撃手法です。

サイト内検索や掲示板等、フォームが存在するWEBサイトはクロスサイトスクリプティングの脆弱性が潜在している可能性があるため、WEBサイトの作成時に対策を行うことが必要になります。

XSSは「Cross-Site Scripting」の略称です(CSSと略すとスタイルシートと被ってしまうため、XSSと呼ばれています)。

【XSS例:図】

① 攻撃者がXSS脆弱性のあるWEBサイトで起動させるスクリプトをリンク等に仕込む。(掲示板やメール、偽のサイト、レビュー等)

② ユーザーがトラップサイトにアクセスし、トラップを踏む。

③ スクリプトを含んだままXSS脆弱性のあるWEBサイトにアクセスする。(クロスサイトする)

④ スクリプトが起動し情報漏洩やマルウェア感染等の被害が発生する。

⑤ 偽の入力フォームを表示させるスクリプトでユーザーが入力してしまった場合、ユーザー情報が攻撃者の手に渡ってしまう。

名前の似ているサイバー攻撃クロスサイトリクエストフォージェリについては以下より。

クロスサイトスクリプティングの種類

クロスサイトスクリプティングは共通脆弱性タイプ一覧 CWE(Common Weakness Enumeration)で以下の3種類に分類されています。

格納型クロスサイトスクリプティング(Stored XSS)

反射型クロスサイトスクリプティング(Reflected XSS)

DOMベースのクロスサイトスクリプティング(DOM Based XSS)

格納型クロスサイトスクリプティング(Stored/Persistent XSS)

格納型XSSは、WEBアプリに事前に不正なスクリプトを永続的に格納しておき、格納したページをユーザーがアクセスする度にスクリプトが起動される仕組みです。
ユーザーが該当ページを閲覧する度に、スクリプトが実行されることから格納型XSSと呼ばれています。

反射型クロスサイトスクリプティング(Reflected/non-persistent XSS)

反射型XSSは、攻撃者が不正なスクリプトを含むリンクを作成し、トラップサイトやメールに配置します。ユーザーにトラップを踏ませ、XSS脆弱性のあるWEBサイトにアクセスさせます。その際にユーザーのブラウザで不正なスクリプトを起動させる仕組みです。
スクリプトはリクエスト送信者に返ることから反射型XSSと呼ばれています。

DOMベースのクロスサイトスクリプティング(DOM Based XSS)

DOMベースのXSSは、サーバー側でのHTML生成時に問題はなく、ブラウザ上で動作するJavaScript上のコードの脆弱性を悪用した攻撃で、ユーザーのブラウザ上で不正なスクリプトが実行されてしまいます。
動的なWEBアプリではなく、静的なHTMLのみを使ったWEBサイトでもJavaScriptを使用していればDOMベースのXSSが発生する可能性があります。
ブラウザには様々なXSSフィルターが備えられていますが、JavaScriptを使ってクライアント側でHTMLを生成した場合、不正なスクリプトがサーバーにリクエスト送信されないため、XSSフィルターを回避しやすい傾向があります。

クロスサイトスクリプティングの原因

クロスサイトスクリプティングが生じる原因として以下が挙げられます。

  • WEBアプリでフォームにユーザーが入力した内容をエスケープ処理していない。
  • 入力値の制限(バリデーション処理)が不完全。
  • URLスキームの制限が不完全。
  • ライブラリに脆弱性が存在する。

クロスサイトスクリプティングの対策

サニタイジング(エスケープ処理)

サニタイジング(エスケープ処理)は、「<」や「"」、「&」等の文字列を無害な文字列に置き換えることをいいます。
サニタイジングが行われたスクリプト文字列は、単なる文字列として表示されます。
攻撃者が如何なる文字を入力しても問題ないようにするサニタイジングはXSSの根本的な対策になります

URLスキームの制限

javascript:スキーム等が含まれている場合もXSSのリスクが生じます。http:スキームやhttps:スキームのみに制限することで想定外の処理を実行されることを抑制できます。

Content-Typeに文字コードを指定する

HTTPレスポンスヘッダのContent-Typeフィールドに「charset=utf-8」等の文字コードを指定していないと、ブラウザは文字コードを自動で判別し、判別した文字コードで処理してしまいます。
例えば、攻撃者がHTMLに「+ADw-script+AD4-alert(+ACI-xss+ACI-)+ADsAPA-/script+AD4-」という文字列を埋め込むと、一部のブラウザでは「UTF-7」の文字コードでエンコードされた文字列と判別されます。UTF-7として画面に表示されると、「<script>alert('xss');</script>」というスクリプトが実行されてしまいます。
この場合、サニタイジングしていても文字コードを指定していないと、UTF-7等の文字列はエスケープ処理されないため、文字コードを指定することが必須になります。

入力値の制限

入力値の制限(バリデーションチェック)は、特定の文字列以外を受け付けなくしたり、文字数を制限したりする設定をいいます。
入力値を制限することで不正なスクリプトを挿入しにくくなるため、ある程度攻撃を抑制することがができます。

WAFを導入する

XSSの対策を行っていたとしても、抜けが生じてしまう可能性があります。
WAF(Web Application Firewall)はXSSの対策漏れが生じた場合等に有効なため、導入しておくとより強固な対策となります。

まとめ

クロスサイトスクリプティング(XSS)について解説しました。

サイバー攻撃での被害が数多く報告されている攻撃で、きちんと対策しておくことが必要になります。

セキュリティは1つでも穴(セキュリティホール)が生じると攻撃者に狙われてしまいます。
可能な対策は全て行い安全性を強化しておくことが必要です。