XSS vs CSRF
このセクションでは、XSSとCSRFの違いを説明し、CSRFトークンがXSS攻撃を防ぐのに役立つかどうかについて説明します。
XSSとCSRFの違いは何ですか
クロスサイトスクリプティング(またはXSS)は、攻撃者が犠牲となるユーザーのブラウザ内で任意のJavaScriptを実行することを可能にします。
クロスサイト・リクエスト・フォージェリ (または CSRF) は、攻撃者が被害者であるユーザーに、意図しないアクションを実行するよう仕向けることができるようにします。
XSS 脆弱性の結果は、一般的に CSRF 脆弱性よりも深刻です。
- CSRF は、多くの場合、ユーザーが実行できるアクションのサブセットにのみ適用されます。 多くのアプリケーションは一般的に CSRF の防御を実装していますが、1つか2つのアクションを見落とし、それが公開されたままになっています。 逆に、成功したXSS悪用は、脆弱性が発生した機能に関係なく、ユーザが実行可能なすべてのアクションを実行するように通常誘導することができます。
- CSRF は、攻撃者が犠牲者に HTTP リクエストを発行するよう誘導することはできても、そのリクエストからのレスポンスを取得することはできないという点で、「一方通行」の脆弱性であると言うことができます。 逆に、XSS は「双方向」であり、攻撃者が注入したスクリプトは任意のリクエストを発行し、そのレスポンスを読み、攻撃者が選んだ外部ドメインにデータを流出させることができます。
Can CSRF tokens prevent XSS attacks?
いくつかの XSS 攻撃は、CSRF トークンの有効利用により実際に防止することが可能です。 このように簡単に悪用できる、単純な反射型 XSS 脆弱性について考えてみましょう。
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
さて、脆弱な関数が CSRF トークンを含んでいるとします。
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>
サーバが CSRF トークンを適切に検証し、有効なトークンがないリクエストを拒否すると仮定すると、トークンは XSS 脆弱性の利用を防ぎます。 このヒントは名前にあります。「クロスサイト スクリプティング」は、少なくとも反映された形では、クロスサイト リクエストを伴います。 攻撃者がクロスサイトリクエストを偽造するのを防ぐことで、アプリケーションは XSS 脆弱性の些細な悪用を防いでいます。
ここでいくつかの重要な注意事項が生じます。
- CSRF トークンで保護されていない関数内のサイト上の他の場所に反射型 XSS 脆弱性が存在する場合、その XSS は通常の方法で悪用される可能性があります。
- 悪用可能な XSS 脆弱性がサイト上の任意の場所に存在する場合、その脆弱性を利用して、たとえそのアクション自体が CSRF トークンで保護されていたとしても、犠牲者のユーザーにアクションを実行させることが可能です。 この状況では、攻撃者のスクリプトは、有効なCSRFトークンを取得するために関連するページを要求し、保護されたアクションを実行するためにトークンを使用することができます。
- CSRF トークンは、保存された XSS 脆弱性を保護するものではありません。 CSRFトークンによって保護されているページが、保存されたXSS脆弱性の出力ポイントでもある場合、そのXSS脆弱性は通常の方法で悪用され、ユーザーがそのページにアクセスすると、XSSペイロードが実行されます。