反映されたXSSについて私が理解していることは
... Webアプリケーションがこのタイプの攻撃に対して脆弱である場合、リクエストを通じて送信された未検証の入力をクライアントに返します... [1]
私のwebappがサーバー上ですべてのリクエストに対して有効なCSRFトークンをチェックするCSRF検証を持っていると仮定します。 CSRFトークンを含まないリクエストを受信すると、適切なエラーが発生します(このエラーは単純な文字列で、攻撃ベクトルはありません)。完全を期すために、CSRFトークンの盗難や推測を防ぐための適切なセキュリティ対策があるとしましょう。
CSRFトークンも反射XSS攻撃を防止すると想定しても安全です。
答えは通常です。有効なCSRFトークンが提供されている場合にのみ値が反映されます。この場合、ユーザーは自分自身のみを「攻撃」できます。
ただし、CSRFトークンを含むページに出力を正しくエンコードするフォームが生成されたが、そのフォームが出力を正しくエンコードしないページに送信する場合、サイトは依然として脆弱です。
例えば元のページ(副作用がないために通常CSRFトークンの影響を受けないGETリクエスト-POSTのみすべき副作用を引き起こす):-
www.example.com/displayForm.php?name=<script>alert('xss')</script>
含む
<input type="hidden" name="csrfToken" value"123456" />
<input type="hidden" name="name" value="<script>alert('xss')</script>" />
ただし、このページがPOSTによって送信された場合、name
はエンコードされずに出力されます。
<body>
Hello <script>alert('xss')</script>.
</body>
特にエラートレースに入力パラメーターが含まれている場合は、エラーページにXSSの脆弱性も反映されている可能性があります。 CSRFトークンが存在しないときに脆弱なエラーページが表示される場合、CSRF保護は反映されたXSSを防止しません。