我们最近对我们的一个 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 漏洞还是不是?