CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。一般来说,CSRF是除XSS外最常见一种漏洞,也是一大刷分利器。 有关CSRF的具体利用,CEO早在 08年就给我们详细介绍了,大家可以去膜拜下:
文章链接http://blog.csdn.net/lake2/Article/details/2245754
下面分享下我个人在测CSRF漏洞时绕过防御的一些主要经验,希望能和大家一起交流下。目前腾讯百度等站点防御CSRF漏洞的主要方法是添加 token(一般参数名为g_tk,bdtoken)与referer验证,相信大家在很多时候抓包一看有token或者删除referer重新发包报错 了就会觉得这里不会有csrf漏洞了,可实际情况可不一定。还有一种常见情况就是使用验证码,这种情况我暂时没找到什么方法,查阅了一些网络资料,目前识 别验证码的方法都无法直接利用到绕过CSRF防御上来,所以不考虑用户体验的话,验证码是防御CSRF攻击的最有效的方法。如果有大牛有其它思路绕过的话 希望能分享给大家一起讨论下。
情况A:
无token无referer验证这种情况现在比较少了,一般出现在一些新上线的业务。我一般测试时都是用Firefox的Live Http Headers插件先抓取一个正常请求的数据包,如果没token的话,先去掉referer字段再重新提交看返回值。如果没报错的话,那就可以直接写一 个表单(POST型)或者构造个链接(GET型)重新测试了,一般都会成功;但有些通过ajax提交的是行不通的,因为ajax无法跨域。
如下图1:
情况B:
无token有referer验证这种情况比较常见,也许我们抓包发现无token正庆幸时,删除referer重新提交一看发现报错了,难道就这样放弃了么?当然NO。。。
一.我们可以试试空referer:即删除header中的referer的值,如果服务器只是验证了是否存在referer没验证referer值 的话,我们重新提交会发现一个CSRF漏洞又被发现了~因为所有跨协议传递的请求都是不会送referer的,如https->http,(这个利 用成本有点高)还有javascript->http,data->http.如下面两个例子:
1.javascript->http <img src=http://hiphotos.baidu.com/aullik5/pic/item/b2cdb444a5ea4402cffca317.jpeg /> <script> window.sc="<img src='http://www.businessinfo.co.uk/labs/hackvertor/images/logo.gif?"+Math.random()+"'>"; </script> <iframe src="javascript:parent.sc"></iframe> 2.data->http <iframe src="data:text/html; base64,PGltZyBzcmM9aHR0cDovL2hpcGhvdG9zLmJhaWR1LmNvbS9hdWxsaWs1L3BpYy9pdGVtL2IyY2RiNDQ0YTVlYTQ0MDJjZmZjYTMxNy5qcGVnIC8+" ></iframe> //base64 加密的部分实际上就是我们构造的CSRF链接
二.我们可以试试修改referer值:如果原referer值为Referer: t.qq.com/xxxx 话,我们可以试试修改为Referer: t.qq.com.baidu.com/xxx。如果服务器只是验证了referer是否存在qq.com或者t.qq.com等关键词的话,争对前一种 情况,我们可以在腾讯某子站点(http://xx.qq.com)发个帖子将图片地址修改为我们构造的csrf链接或者写好CSRF表单后将地址发布在 微博上等待其它用户点击,针对后一种情况我们可以建立个t.qq.com.yourdomain.com的域名存放CSRF表单来绕过REFERER检 测;
三.伪造referer(具体方法我也没测试过,可自行百度)
如下图2,图3: