跨站点请求伪造(CSRF),也称为XSRF,Sea Surf或会话骑马,是一种攻击媒介,它会诱使Web浏览器在用户登录的应用程序中执行不需要的操作。
成功的CSRF攻击可能对企业和用户造成破坏。它可能会导致客户关系受损,未经授权的资金转移,密码更改和数据窃取 - 包括被盗的会话cookie。
CSRF通常使用恶意社交工程进行,例如电子邮件或欺骗受害者向服务器发送伪造请求的链接。由于毫无防备的用户在攻击时通过应用程序进行身份验证,因此无法区分伪造用户的合法请求。
在执行攻击之前,犯罪者通常会研究应用程序,以使伪造的请求尽可能合法。
例如,一个100美元银行转账的典型GET请求可能如下所示:
GET http://netbank.com/transfer.do?acct=PersonB&amount=$100 HTTP / 1.1
黑客可以修改此脚本,以便将100美元转换为自己的帐户。现在恶意请求可能如下所示:
GET http://netbank.com/transfer.do?acct=AttackerA&amount=$100 HTTP / 1.1
坏的演员可以将请求嵌入到无辜的超链接中:
<a href="http://netbank.com/transfer.do?acct=AttackerA&amount=$100">阅读更多内容</a>
接下来,他可以通过电子邮件将超链接分发给大量的银行客户。那些在登录其银行账户时点击该链接的人将无意发起100美元的转账。
请注意,如果银行的网站只使用POST请求,则无法使用<a> href标记来构造恶意请求。但是,攻击可以通过自动执行嵌入式JavaScript的<form>标签提供。
这就是这种形式的外观:
<body onload =“document.forms [0] .submit()”> <form action =“http://netbank.com/transfer.do”method =“POST”> <input type =“hidden”name =“acct”value =“AttackerA”/> <input type =“hidden”name =“amount”value =“$ 100”/> <input type =“submit”value =“查看我的照片!”/> </ FORM> </ BODY>
预防和缓解CSRF攻击有很多有效的方法。从用户的角度来看,预防是保护登录凭据并拒绝未经授权的角色访问应用程序的问题。
最佳做法包括:
对于Web应用程序,存在多种解决方案来阻止恶意流量并防止攻击。最常见的缓解方法之一是为每个会话请求或ID生成唯一的随机令牌。这些随后由服务器检查和验证。具有重复标记或缺失值的会话请求被阻止。或者,禁止与其会话ID令牌不匹配的请求到达应用程序。
双重提交Cookie是阻止CSRF的另一个众所周知的方法。与使用唯一标记类似,随机标记分配给cookie和请求参数。然后,服务器在授予对应用程序的访问权限之前验证令牌是否匹配。
虽然有效,但如果受保护的站点链接到外部URL,令牌可能会暴露在多个点上,包括浏览器历史记录,HTTP日志文件,记录HTTP请求的第一行和引用标头的网络设备。这些潜在的弱点使得令牌不是全面的解决方案。
CSRF攻击的高度个性化阻碍了一种万能解决方案的发展。但是,可以采用自定义安全策略来防范可能的CSRF情况。
Incapsula专有的定制规则引擎IncapRules可让客户创建自己的安全策略。这些策略是使用直观的语法生成的,并且可以随时进行修改,从而增强了我们的默认Web应用程序防火墙配置。
使用IncapRules,您可以创建一个策略,根据您的HTTP引用链接头内容来过滤对敏感页面和函数的请求。这样做可以让请求从安全域的简短列表中执行。
这种方法完全对抗CSRF攻击的社会工程方面。它可以防止在安全边界之外执行恶意请求,而不管内容如何。
或者,您可以在“仅限警报”模式下运行规则,以追踪可能的漏洞利用企图,或者呈现提醒不注意用户的CAPTCHA。