CSRF挺尴尬的,危害大但难搞。
判断是否存在CSRF最简单的方法就是抓取一个正常请求的数据包,去掉 Referer 字段后再重新提交,如果该提交还有效,那么基本上可以确定存在 CSRF 漏洞。
目前CSRF要利用还得需要其他的漏洞(心虚)
CSRF(Cross-Site Request Forgery,**跨站点伪造请求**)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。具体来讲,可以这样理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
利用已经登录过的cookie信息或者session之类的会话。
1.用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
2.在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A;
3.用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;(还建立着对话)
4.网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;
5.浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行
1、CSRF 的攻击建立在浏览器与 Web 服务器的会话之中。
2、欺骗用户访问 URL
CSRF 漏洞一般分为站外和站内两种类型。
站外类型
外部提交数据的时候,没有多做限制,比如留言或者评论。
所以攻击者可以事先预测并设置请求的参数,在站外的 Web 页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现 GET、POST 请求,当用户在会话状态下点击链接访问站外 Web 页面,客户端就被强迫发起请求。
站内类型
内部代码是用了$_REQUEST
类变量
该变量允许用户使用各种请求方式,而不是局限于post,攻击者就可以构造get请求方式
般攻击者只要把预测的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起这些请求
CSRF构造蠕虫
同域内 CSRF 攻击获取数据几乎没任何限制。
跨域 CSRF 攻击获取数据方法:
- xss
- 服务端代理
- JSON Hijacing
- Flash AsctionScript(crossdomain.xml)
要获取的关键数据是唯一标识:
用户 id、用户昵称、用户 email、用户个人页面地址等。
三种防御方法
服务端防御,用户端防御,安全设备防御
我的建议是埋了
防御方法-服务端防御
- 目前业界服务器端防御 CSRF 攻击主要有 5 种策略:**验证 HTTP Referer 字段**,**在请求地址中添加 token 并验证**,**在 HTTP 头中自定义属性并验证**等。
* * *
1.检验Referer头
Referer头必须得是指定的url,拒绝其他网站的请求
* * *
2.请求地址中添加 token验证
CSRF大多利用cookie进行攻击,所以对cookie进行现在在cookie中设置一个随机数token,并在服务器端建立一个拦截器来验证这个token
* * *
3. HTTP 头中自定义属性并验证
4. 服务端区严格区分好 POST 与 GET 的数据请求
5. 用验证码或者密码确认方式进行