渗透测试结果:可疑的 CSRF 攻击

信息安全 渗透测试 csrf
2021-08-17 05:08:33

我们最近对我们的一个 webapps 进行了渗透测试。一切都很顺利,除了一个 CSRF 漏洞,我有一个可以选择的就是这个发现。

一些背景知识:我们正在使用 ASP.NET MVC,除此之外,我们确实使用了其中内置的CSRF 保护功能。它的工作方式严格按照OWASP 的建议:通过包含所谓的“同步器令牌”,一个在 HTTP cookie 中,另一个在一个名为__RequestVerificationToken

<form action="/Home/Test" method="post">
  <input name="__RequestVerificationToken" type="hidden" 
    value="6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" />    
  <input type="submit" value="Submit" />
</form>

我们还定期进行 Acunetix 扫描,并表示扫描从未发现任何不受 CSRF 保护的表格。

现在,渗透测试者声称他们能够使用以下代码“破坏”我们的 CSRF 保护:

<html>
  <body>
    <form action="https://our.site/support/discussions/new" method="POST">
      <input type="hidden" name="subject" value="Subject" />
      <input type="hidden" name="content" value="Content" />

      <input type="hidden" name="__RequestVerificationToken" 
        value="_e-upIZFx7i0YyzrVd[...]" />

      <input type="submit" value="Submit Request" />
    </form>
  </body>
</html>

包含该__RequestVerificationToken字段是最困扰我的:对我来说,这类似于声称攻击者从我的银行账户中转移了数亿美元,因为我自愿给了他我的 iPhone 来摆弄,他看到了一次性密码我的银行通过短信发送的。

我想这种攻击可能起作用的唯一方法是,如果我们不使用 HTTPS、易受 XSS 攻击、使用非仅 HTTP cookie 并且疏忽了同源策略。这些都不是真的,因为这些漏洞都没有被 pentesters 或 Acunetix 报告。

所以问题是:我错了,这是一个合法的 CSRF 漏洞还是不是?

3个回答

这似乎不是 CSRF 漏洞。

如果攻击者需要知道 CSRF Token,那么这不是攻击。而且您对 CSRf 的处理方法似乎是正确的。

泄露 CSRF Token 的问题确实会导致 CSRF 攻击,但问题不在于 CSRF 保护不正确,而是那些问题(XSS、加密、URL 中的 CSRF Token 等)。

尽管如此,我还是会要求测试人员澄清一下。谁知道呢,也许攻击总是使用那个特定的令牌,因为它在某处被硬编码,或者因为特殊字符给你的应用程序带来了某种问题。或者也许可以使用来自不同用户的令牌,或者令牌检查根本不起作用并且它接受任意令牌。该报告应该包含更多详细信息,因此我将与测试人员核实这一点。

概念证明中包含确实很奇怪__RequestVerificationToken,因为通常攻击者不会知道这个令牌的价值。

__RequestVerificationToken但是,如果没有正确绑定到会话,页面仍然容易受到 CSRF 的攻击。如果概念证明中的值_e-upIZFx7i0YyzrVd[...]适用于所有人,那么您很容易受到 CSRF 的攻击。如果它只适用于 pentester 登录的用户,那么你就不会受到 CSRF 的攻击。

由于您使用的是默认的 .NET CRSF 保护,我认为这是正确实现的,并且渗透测试者犯了一个错误。

如果 __RequestVerificationToken 未在服务器端验证,并且它适用于每个请求和不同的用户,那么你的应用程序容易受到 CSRF 的攻击。