防CSRF攻击方法

CSRFTester的使用
1,安装CSRFTester
CSRFTester是一款 CSRF检测工具,点击本文附件进行下载。

解压附件zip文件,然后打开run.bat,修改JAVA_HOME的具体路径,让其指向你计算机中的JAVA_HOME,双击run.bat,会打开CSRFTester,如图所示:

同时会打开命令行窗口,就会发现如图所示的输出:


也就是说CSRFTester打开了8008这个端口,这个我们以后会用到。



2,在 浏览器中设置代理服务器
接下来,我们需要打开浏览器,这里以 Firefox为例,设置代理服务器为: localhost:8008,如图所示。

我们可以单击"Start Recording"来开启CSRFTester的检测工作,这样以后我们所有访问的URL以及参数都会被记录下来。
3,通过CSRFTester抓取并伪造请求
我们以一个合法的用户登录网站后,执行某个重要操作,这时CSRF Tester会进行抓取,如图所示。

如上图所示,我们抓取了该请求,修改参数值,然后发送此请求。在Report Type栏选中默认的Forms,最后单击Generate HTML按钮来产生CSRF攻击脚本。
4,分析CSRF攻击脚本
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<! DOCTYPE HTML PUBLIC "-//<a href = "http://zhannei.baidu.com/cse/search?s=1885791307927250101&entry=1&q=W3C" class = "bdcs-inlinelink" target = "_blank" >W3C</ a >//DTD HTML 4.01 Transitional//EN">
< html >
< head >
<< a href = "http://zhannei.baidu.com/cse/search?s=1885791307927250101&entry=1&q=title" class = "bdcs-inlinelink" target = "_blank" >title</ a >>OWASP CRSFTester Demonstration</ title >
</ head >
< body onload = "<a href=" http://zhannei.baidu.com/cse/search? s = 1885791307927250101 & entry = 1 & q = javascript " class = "bdcs-inlinelink" target = "_blank" >javascript</ a >:fireForms()">
< script language = "<a href=" http://zhannei.baidu.com/cse/search? s = 1885791307927250101 & entry = 1 & q = JavaScript " class = "bdcs-inlinelink" target = "_blank" >JavaScript</ a >">
var pauses = new Array( "8967","6","5","96" );
function pausecomp(millis)
{
     var date = new Date();
     var curDate = null;
 
     do { curDate = new Date(); }
     while(curDate-date < millis );
}
function fireForms()
{
     var count = 4 ;
     var i = 0 ;
     
     for( i = 0 ; i<count; i++)
     {
         document.forms[i].<a href = "http://zhannei.baidu.com/cse/search?s=1885791307927250101&entry=1&q=submit" class = "bdcs-inlinelink" target = "_blank" >submit</ a >();
         
         pausecomp(pauses[i]);
     }
}
</ script >
< H2 >OWASP CRSFTester Demonstration</ H2 >
< input type = "hidden" name = "account" value = "sqadmin" />
< input type = "hidden" name = "passwd" value = "123456" />
< input type = "hidden" name = "validcode" value = "g652" />
</ form >
</ body >
</ html >

从上面CSRFTester中生成的代码我们可以看到,因为我们选中的是Forms类型,所以它构造了一个form,如果在另一个标签页打开它,如果没有注销原来的合法用户,浏览器就会自动提交这个请求。如果提交成功,则证明该操作具有CSRF漏洞。
   防CSRF攻击方法
1,用户自行提高安全意识
用户需要知道的一些小技巧
对于用户来说,下面的小技巧有助于防止CSRF攻击。
(1)在重要的网站内进行操作以后,不要长时间地待在这个网页上,一定记得要退出。几乎所有的网站都有退出按钮,它最主要的功能就是清除当前用户的session,使之失效。
(2)使用多个浏览器,一个浏览器用来访问重要网站,另一个浏览器用来上网冲浪。而不要在一个浏览器的多个标签页面打开,因为它们共享同一个进程,会导致session共享。
2,服务端加强预防
目前业界服务器端防御CSRF攻击主要有三种策略: 验证HTTP Referer字段,在请求地址中添加token并验证,在HTTP头中自定义属性并验证。下面分别对这三种策略进行简要介绍。
(1)验证HTTP Referer字段
根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。比如某银行的转账是通过用户访问http://bank.test/test?page=10&userID=101&money=10000页面完成,用户必须先登录bank. test,然后通过点击页面上的按钮来触发转账事件。当用户提交请求时,该转账请求的Referer值就会是转账按钮所在页面的URL(本例中,通常是以bank. test域名开头的地址)。而如果攻击者要对银行网站实施CSRF攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该请求的Referer是指向攻击者的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank. test开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。
(2)在请求地址中添加token并验证
CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于Cookie之中。鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。
(3)在HTTP头中自定义属性并验证
自定义属性的方法也是使用token并进行验证,和前一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了前一种方法在请求中加入token的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心token会通过Referer泄露到其他网站。
本文总结:CSRF攻击作为一种存在已久的攻击方式,在大量的商业网站上都可以找出。对广大系统维护者来说需要深入理解CSRF攻击,并制定最适合当前系统的防御方案,在不损害应用程序性能的前提下,提高系统安全性;而对即将开发的网络应用系统来说,深刻理解CSRF的危害性,在设计阶段就考虑到对 CSRF的防范将会取得事半功倍的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值