【发布时间】:2014-07-17 19:04:22
【问题描述】:
给定一个网站,如何检测潜在的 CSRF 漏洞?
提前致谢
【问题讨论】:
-
任何参数可以被第三方猜测/预测的请求都容易受到CSRF的攻击。
-
如果我可以扩展:来自任何其他系统的任何值,这些值不在您的代码内存执行空间内,第三方可以猜测/预测,都容易受到 CSRF 的攻击。
给定一个网站,如何检测潜在的 CSRF 漏洞?
提前致谢
【问题讨论】:
这是CSRF 攻击:-
www.evil.com 上被诱使受害者浏览的页面包含以下代码:-
<form method="post" action="https://www.example.com/executeAction">
<input type="hidden" name="action" value="deleteAllUsers">
</form>
<script>document.forms[0].submit()</script>
当受害者以管理员用户身份登录您的站点 (www.example.com) 时,表单提交工作正常,所有用户都将从您的系统中删除。
Synchronizer Token Pattern 是修复此漏洞的推荐方法。当合法用户加载到您的站点上时,这将向您的表单添加一个称为令牌的加密安全随机字符串,该合法用户已存储在服务器端并与用户会话配对。提交表单后,您的系统将检查 POSTed 的令牌是否与预期相符。任何攻击者都无法从您的站点读取令牌,因为任何跨站点访问都受 Same Origin Policy 保护。
网络安全扫描程序通常可以检测您网站上的此类漏洞。您可以通过检查浏览器机制提交的表单来手动检查它们是否包含令牌字段。但是,AJAX 提交可能会使用其他方法,例如the Origin header or X-Requested-With。
【讨论】:
您需要了解什么是 CSRF 才能检测 CSRF 漏洞。
CSRF 是一种攻击,它迫使最终用户在他/她当前已通过身份验证的 Web 应用程序上执行不需要的操作。借助一些社会工程学的帮助(例如通过电子邮件/聊天发送链接),攻击者可能会诱骗 Web 应用程序的用户执行攻击者选择的操作。
当后端应用程序不检查客户端有意发送的表单时,就会出现基本的 CSRF 漏洞。为了了解请求是否有意发送,您需要使用 html 形式的令牌,然后在后端检查该令牌。
例如:
<form action="/setting/emailchange.php">
<input type="hidden" name="csrf_token" value="RANDOM_STRING_HERE"
<input type="text" name"email" value="" placeholder="Type new email">
</form>
您看到有一个名为“csrf_token”的隐藏输入字段。作为攻击者,我们无法预测该值,因为它为相关用户生成并存储在会话中。如果没有有效的 csrf_token 值,后端应用程序将不会处理该请求。
因此,如果您没有看到任何 html 形式的 csrf 令牌,这意味着它可能会受到 CSRF 的攻击。
【讨论】: