常见的漏洞--csrf

CSRF:跨站点请求伪造

大致原理:

用户A请求了正常的网站C,之后产生了cookie,之后用户A又浏览的恶意网站B,网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点C,恶意网站B产生恶意的请求去请求网站C,结果C只能看到cookie是正确的,以为就是用户A的行为,从而产生损失。

CSRF漏洞检测:

       检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

       目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。

1)验证HTTP Referer字段

Referer字段记录了HTTP请求的来源地址

好处:简单易行,不需要操心crsf漏洞,只需要对安全性要求比较高的请求统一增加一个拦截器,检查referer的值。

问题:1.referer是由浏览器提供的,每个浏览器对referer的实现可能有差别,并不保证浏览器不存在安全漏洞。事实上对于一些浏览器比如 ie6或者ff2,就可以修改referer的值,如果网站支持这些浏览器,黑客就可以篡改这个字段,从而达到csrf攻击的效果。2.就算有些浏览器不能篡改,但是一些用户会认为这是侵犯了隐私,有些组织也担心会把内网的信息泄露到外网去,就会设置浏览器在发送请求的时候不再提供referer,这样会被误认为是csrf,拒绝了合理用户的请求。

2)在请求地址中添加token并验证

要防御,就是需要在请求中添加请求者无法伪造的信息。可以在HTTP请求中以参数的形式加入一个随机产生的token。服务器来拦截验证这个token,如果不存在或者错误,则认为很可能是csrf。

token可以放入session传入服务器,每次请求的时候再从session中拿出来比较,与请求中的token进行比较。

通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。

问题:难以保证 token 本身的安全。1。黑客发在那些允许发表自己内容的网站,这个链接也许会被加上token,黑客就可以进行攻击。解决办法是加上一个判断,如果网站上的链接是链接到自己网站的就加上token,如果是链接到外网的就不需要加上。2.不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

3)在http头中自定义属性并进行验证

通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。

好处:1)解决了上种方法在请求中加入 token 的不便2)通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

问题:1)并非所有请求都适应。2)这类请求得到的页面浏览器无法记录,不能前进后退,给用户带来不便。3)对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

你可能感兴趣的:(常见的漏洞--csrf)