跨站点请求伪造(CSRF)
跨站点请求伪造(CSRF)
跨站点请求伪造(CSRF)是一种欺骗受害者用户提交恶意请求的攻击。它继承了受害者的身份和特权,代表受害者执行不在预期范围内的功能。对于大多数站点,浏览器会自动请求包括与站点关联的任何凭据,例如用户的会话cookie,IP地址,Windows域凭据等。因此,如果用户当前已对该站点进行了身份验证,则该站点将无法区分攻击者发送的伪造请求与用户发送的合法请求。
攻击过程:
·假设用户A登录银行的网站进行操作,同时也访问了攻击者预先设置好的网站。
·用户A点击了攻击者网站的某一个链接,这个链接是http://www.bank.com/xxx指向银行,银行服务器会根据这个链接携带的参数会进行转账操作。
·银行服务器在执行转账操作之前会进行Session验证,但是由于用户A已经登录了银行网站,攻击者的链接也是www.bank.com,所以攻击的链接就会携带session到服务器。
·由于session id是正确的,所以银行会判断操作是由本人发起的,执行转账操作。
攻击条件:
1. 登录受信任网站A,生成可信的Session
2. 在不登出A的情况下,访问危险网站B,网站B伪造网站A的请求
预防方法:
CSRF攻击者获取不到cookie,同时也无法对服务器返回的内容进行解析,唯一能做的就是给服务器发送请求。
Referer校验:
HTTP header中包含一个Referer字段,这个字段用于指明http请求的来源地址。当用户进行正常请求时,此Referer字段应该与请求的地址位于同一个域名下(bank.com)。如果是通过CSRF攻击伪造的请求则此Referer应当包含恶意网址的地址(evil.com)。所以通过对Referer来源地址的校验可以识别出伪造的恶意请求。
这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。
Token校验:
由于CSRF攻击的本质在于攻击者欺骗用户去访问自己设置的请求,所以如果在请求敏感数据时,要求用户浏览器提供不是保存在cookie中并且攻击者无法伪造的数据作为校验条件,那么攻击者就无法伪造未校验的请求进行CSRF攻击。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过表单提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从获取页面信息得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。
通过连接不小心进入恶意网站时是token值是不会保留的,因为token值保存在请求头中,但cookie会保留在浏览器,恶意网站再次连接到修改密码等界面cookie的值会携带过去,但token值是获取不到的,如果系统检测token值就会访问失败,所以token可以有效防止csrf漏洞
测试方法:
将referer和token的值修改为不同值,发送测试请求,若可以访问,则说明存在csrf漏洞,说明系统没有进行token和referer校验