1>内容
Csrf是跨站请求伪造,是一种挟持用户在当前已登录的Web应用程序上执行非本意的操作的一种攻击方式。CSRF攻击的本质在于利用用户的身份,执行非本意的操。简单的说,跨站请求伪造的攻击是攻击者通过一些技术手段欺骗用户的浏览器去访问用户曾经认证过的网站并执行一些操作(如发送邮件、发消息、甚至财产操作如转账和购买商品等)
2>分类
1)GET CSRF
假设现在,目标网站A的url:www.a.com。恶意网站B的url:www.b.com。
两个网站的域名不一样,目标网站A上有一个删除文章的功能,通常是用户单击’删除文章‘链接时才会删除指定的文章。这个链接是www.a.com/blog/del?id=1, id代表不同的文章。实际上就是发起一个GET请求。如果在目标网站A上不存在XSS漏洞,那么可以利用GET CSRF进行攻击。因为CSRF请求是跨域的,但是又因为Ajax有同源策略的限制所以无法使用Ajax发起GET请求。但是可以通过在恶意网站B上静态或者动态创建img,script等标签发起GET请求。将其src属性指向目标网Awww.a.com/blog/del?id=1。通过标签的方式发起的请求不受同源策略的限制。 最后欺骗已经登录目标网站A的用户访问恶意网站B,那么攻击就会发生。
2)POST CSRF
POST请求实际上就是在恶意网站B上发起一个POST请求,同样的,这个请求也是跨域和身份认证后的。如静态或动态的创建一个form表单,当用户访问到这个恶意网站B时,就会提交这个表单。假如目标网站A上有‘写文章’的功能,那么我们就可以动态创建form标签,然后修改文章的题目。
3>要被crfs攻击必须满足
1.请求是跨域的。可以看出请求是从恶意网站B上发出的
2.发出的请求是身份认证后的。
4>CSRF危害
- 模拟表单提交盗取用户资金。实际上就是上面所说的POST CSRF攻击
- 篡改目标网站上的用户数据。
- 盗取用户隐私数据
5>csrf防御:
1)验证http的referer字段(记录了http的来源地址),目标网站A和恶意网站B发出的请求中,请求头唯一的不同就是Referer字段。可以根据Referer字段与Host字段在同一域名下的规则,可以检测Referer字段值,如果发现其与Host值不在同一域名下,这时候服务器就能够识别出恶意的访问了。但是因为referer是浏览器提供的不能保证浏览器自身没有安全漏洞。
Host主要用于指定被请求资源的Internet主机和端口号
2)添加检验token,由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再执行CSRF攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个随机数。即<input type="hidden" name="_csrf_token" value="xxxx">)的形式。当客户端通过表单提交请求时,这个随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个随机数的值,服务器端就会因为校验token的值为空或者错误,拒绝这个可疑请求。
3) 尽量使用POST,限制GET
GET接口太容易被拿来做CSRF攻击,看第一个示例就知道,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为POST使用,GET则无效,降低攻击风险。
当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。
4)chorm浏览器启用same site cookie