CSRF解释:
Cross-site rquest forgery(跨站点请求伪造)
指利用受害者尚未失效的身份认真信息(cookie.会话等)诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害者不知情的情况下以受害者的身份证向服务器发送请求,从而完成非法请求.
CSRF产生原因:
web应用存在以下特性:
- form元素的action属性能够指定任意域名的url
- 保存在cookie中的会话id会被自动发送给对象网站
1的问题在与,即便是恶意网站,也能够向攻击目标网站发送请求.
2的问题在于,即便请求经过了恶意网站,会话id的cookie值也照样会被发送,从而导致攻击请求在认证的状态下被执行
CSRF攻击过程的要求:
- 目标用户已经登录可网站,能够执行网站的功能
- 目标用户访问了攻击者构造的URL
CSRF漏洞的验证的两个简单条件:
验证方法:抓取数据包,删除referer后页面返回正常或者看有无token,以上两个返回正常和没有带token的话实锤csrf
1.服务端未验证referer(referer是判断用户从哪儿点击来到该页面),验证机制不完善,导致另一个不可信站点的请求可以被服务器接收并返回相应数据,
2.服务端未加token验证,用户每次执行敏感操作时,服务端应该返回一个随机数(token)给用户,用户请求时必须带上和服务端一样的token,否则拒绝执行,如果没有采用token机制或者token可预测,csrf就变得很容易执行
CSRF利用过程:
攻击者发现csrf漏洞-构造恶意代码-发送给受害人-受害人打开-受害人被欺骗执行代码-完成攻击
可以参考如下图攻击流程图:
从上图可以看出,要完成一次csrf攻击,受害者必须依次完成两个步骤:
1.登录受信任的网站A,并在本地生成cookie
2.在不登出A的情况下,访问危险网站B
那是不是可以提出疑问:"如果我不满足以上两个条件,是不是我就不会受到csrf攻击"使得,确实如此,但是你不能保证如下两点:
1.你不能保证你登录了一个网站后,不在打开一个tab页面并访问另外的网站
2.你不能保证你关闭浏览器后,你本地cookie立刻失效,你上次的会话立马结束(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了)
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站
CSRF对策总结:
CSRF漏洞的根本性防范策略:
- 筛选出需要防范csrf的页面
- 确认是正规用户自愿发起的请求
确认请求是正规用户自愿发起的方法有三种:
嵌入机密信息(令牌,也就是token)
服务端验证token来确认是否由正规用户发起的请求,接受令牌请求(接收关键处理的请求)必须为post方法,假如使用get方法发送机密信息的话,令牌信息就有可能通过referer泄露出去
开发耗时中等,可以利用在收集网站上,对用户没有影响,建议使用的地方:最基本的防御策略,所有情况下均可使用
再次输入密码:
开发耗时中等,,增加了用户输入密码的麻烦,可以利用在手机网站,建议使用的地方:需要防范他人伪装或者确认需求很强的页面
验证referer
检验referer的策略也存在一定的缺陷,因为用户设置为不发送referer,页面就会无法正常显示,通过个人防火墙或浏览器的插件等禁止referer的用户不在少数,另外,收集浏览器中也有不发送referer的浏览器和能够关闭发送referer功能的浏览器,其适用范围较小
开发耗时小,关闭了referer的用户无法正常使用该策略,不能用于手机网站,建议使用的地方:用于能够限定用户环境的既有应用的csrf防范策略
csrf的辅助策略:
执行完关键处理后,像用户注册的邮箱发送通知邮件(虽然不能防范csrf攻击,但是在遭受了csrf攻击情况下能第一时间让用户知情,从而将损害降到最低)