CSRF 预防也能防止反射型 XSS 攻击吗?

信息安全 xss 攻击预防 csrf
2021-09-02 03:25:22

我对反射型 XSS 的理解是

...当 Web 应用程序容易受到此类攻击时,它会将通过请求发送的未经验证的输入传递回客户端... [1]

假设我的 webapp 在服务器上有一个 CSRF 验证,用于检查所有请求的有效CSRF 令牌如果它收到任何不包含 CSRF 令牌的请求,它将给出正确的错误(这个错误是一个简单的字符串,它没有攻击向量)。为了完整起见,我们还假设我有适当的安全措施来防止 CSRF 令牌被盗或被猜测。

因此可以安全地假设CSRF 令牌也可以防止反射型 XSS 攻击,因为这两个都是真的:

  1. 如果 CSRF 令牌不存在,服务器不会反映任何内容。
  2. 攻击者无法拥有或猜测 CSRF 令牌。
2个回答

如果仅在提供有效的 CSRF 令牌时才反映该值,则答案通常是肯定的——在这种情况下,用户只能“攻击”自己。

但是,如果生成的表单将输出正确编码到包含 CSRF 令牌的页面,但随后该表单提交到未正确编码输出的页面,那么您的站点仍然容易受到攻击。

例如原始页面(一个 GET 请求,由于缺乏副作用,它通常不受 CSRF 令牌的影响 - 只有 POST引起副作用):-

www.example.com/displayForm.php?name=<script>alert('xss')</script>

包含

<input type="hidden" name="csrfToken" value"123456" />
<input type="hidden" name="name" value="&lt;script&gt;alert(&#039;xss&#039;)&lt;/script&gt;" />

但是,当这个页面通过 POST 提交时,name输出未编码:

<body>

Hello <script>alert('xss')</script>.

</body>

错误页面也可能反映 XSS 漏洞,尤其是当任何错误跟踪包含输入参数时。如果在 CSRF 令牌不存在时提供易受攻击的错误页面,那么您的 CSRF 保护不会阻止反射 XSS。