跨站请求伪造,是一种通过挟制当前用户已登录的Web应用程序从而实现非用户本意的操作的攻击方法。攻击者通过一些技术手段,挟制用户去访问用户曾经认证过的网站并进行一些操作,比如发邮件、发消息、购买商品、银行转账等。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。
跨站请求伪造攻击如何工作?
跨站请求伪造攻击过程如下:
跨站请求伪造攻击过程
- 用户通过浏览器访问存在CSRF漏洞的信任网站A,输入身份验证信息请求登录网站A。
- 身份验证通过后,网站A产生Cookie信息并返回给浏览器。此时,用户登录网站A成功。
- 用户未登出网站A前,在同一浏览器中访问攻击者构建的恶意的网站B。
- 网站B接收到用户请求后,返回一些攻击性代码,同时发出请求访问第三方网站A。
- 浏览器在接收到这些攻击代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由网站B发起的,所以会根据用户浏览器的Cookie信息以用户的权限处理该请求,导致来自网站B的恶意代码被执行。
网站B通过获取用户权限操作网站A,这种通过伪造请求实现的攻击,叫做跨站请求伪造攻击。
跨站请求伪造的防御策略
跨站请求伪造通常从第三方网站发起,被攻击网站无法防止攻击发生,只能通过增强网站针对跨站请求伪造的防护能力来提升安全性。
- 验证HTTP Referer字段
HTTP头中的Referer字段用来标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应该和请求地址位于同一域名下。
这种方法简单易行,仅需要在关键访问处增加一步校验。但该方法也有局限性,因其完全依赖浏览器发送正确的Referer字段。虽然HTTP协议对此字段的内容有明确的规定,但无法保证来访浏览器的具体实现,也无法保证浏览器没有安全漏洞影响到此字段。并且,也存在攻击者攻击浏览器篡改其Referer字段的可能性。
- 在请求地址中添加Token并验证
CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果在访问敏感数据请求时要求用户浏览器提供不保存在Cookie中并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常访问时客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者事先无从得知这个伪随机数的值,服务端就会因为校验Token的值为空或者错误而拒绝这个可疑请求。
- 使用验证码
CSRF是在用户不知情的情况下构造了网络请求,因此添加验证码能强制用户必须与应用进行交互,服务器通过验证码来识别是不是用户主动发送的请求。