CSRF攻击与防御

CSRF是什么?

CSRF攻击与防御

文章插图
 
(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站 。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左 。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站 。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性 。
CSRF可以做什么?
你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,伪装成你发送恶意请求 。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全 。
它这么厉害,那它的原理是什么?
CSRF攻击与防御

文章插图
 
登录受信任网站A,并在本地生成Cookie 。
在不登出A的情况下,访问危险网站B 。
看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击” 。是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站 。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束 。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站 。
详细的原理介绍
几种常见的攻击类型
GET类型的CSRF
这种类型的CSRF一般是由于程序员安全意识不强造成的 。GET类型的CSRF利用非常简单,只需要一个HTTP请求,所以,一般会这样利用:
<img src=http://####/csrf?xx=11 /> 在访问含有这个img的页面后,成功向http://wooyun.org/csrf?xx=11 发出了一次HTTP请求 。所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了 。
乌云案例
POST类型的CSRF
这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单,如:
<form action=http://####/csrf.php method=POST> <input type="text" name="xx" value=https://www.isolves.com/it/aq/wl/2019-11-26/"11" /> 访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作 。
其他其他猥琐流CSRF
过基础认证的CSRF(常用于路由器):
POC:
<img src=http://admin:admin@192.168.1.1 /> 加载该图片后,路由器会给用户一个合法的SESSION,就可以进行下一步操作了
防御CSRF的策略
CSRF攻击与防御

文章插图
 
在业界目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证 。下面就分别对这三种策略进行详细介绍 。
验证 HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址 。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件 。因此,要防御 CSRF 攻击,网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的 。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求 。
这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以 。
然而,这种方法并非万无一失 。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞 。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全 。事实上,对于某些浏览器,比如IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值 。如果 网站支持IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击 。


推荐阅读