Bypass Preventing CSRF

CSRF在过去的n年(n>2)一直都火,在bh/defcon/owasp等会议上多次探讨CSRF的攻防[具体你可以看看以往的那些pp].前
段时间PLAYHACK.net上发表了一个总结性的pp:Preventing
CSRF,然而CSRF是很难彻底防止的,这个也是我说CSRF卑鄙无耻的一个原因,下面我的一些Bypass Preventing
CSRF的tips:

0x01.HTTP Referer

其实国内的CSRF攻击由来已久了,比如n年前的各大下载网站防止盗链,n前dvbbs的一个xss利用了csrf提升权限等等.在下载网站防止盗链的过程中很多就使用了通过判断HTTP
Referer来限制,但是这样的Prevent很容易就被绕过了.
  
  
0x01a.Attack From Inside
很多人都忽律了从site‘内部‘的攻击.
1.很多的web
app都支持link/img等标签,然而通过这些标签访问的url的Referer都是本站的,所以攻击者只要在你的bbs
或者blog等上通过那些标签发一个你构造好的url,然后就是引诱admin了 :)

2.ie有很多特点如:txt/图片等里面的html/js会被执行,当年你可以通过上传你的构造的代码...[注意这里txt里js执行的domain和txt是同一个]

   0x01b.伪造http header
1.客户端脚本:

    a.js
      
XMLhttp.setRequestHeader()
但是xmlhttp不可以跨区域[当然你可以利用0x01a.2里的方式上传],所以一般的是要结合xss.

     b.as
     *
XML.addRequestHeader()
     *
LoadVars.addRequestHeader() as里直接设置Header是有一些限制的,比如
.addRequestHeader("Refere", "AAA"); 这样是不行的.Rapid7在06年发布了一个可以绕过的巧妙方法:
.addRequestHeader("Referer:http://anywhere\r\nX-foo",
"bar"); 直接放到第1个参数. 这个bug已经被Adobe
fix了,但是在htm调用swf时swf可以使用任意后缀,我们同样可以利用类似0x01a.2里的方法一样把swf上传[具体可以参考
《Discuz!/phpwind flash标签的xss》]

2.服务端脚本:

    
基本上所有的服务端语言都有发http包的功能,如php的fsockopen(),asp的xmlhttp等等,所以可以通过外面服务端脚本来伪造一个
Referer[其实就是类似于nc]
这个一般只对于单纯的限制Referer而且没有身份验证的[因为你cookie没办法传递],所以这个基本可以YY的.

    
    
0x02.Hidden
value

之所以用‘Hidden value‘做标题,是因为PLAYHACK文中写 ‘0x03a: Cookies
Hashing‘ 和‘0x04: One-Time Tokens‘里产生的hash都是通过hidden
value来传递.但是我们一样可以通过一些手段得到这个hash.

0x02a.利用xss执行js-xmlhttp在xmlhttp.responseText里得到hash:

    
xmlhttp.open("GET",
siteurl+"admincp.php?action=members", false);
xmlhttp.send();

var echo = xmlhttp.responseText;
var reg = /\<input
type=\"hidden\" name=\"formhash\" value=\"([\w\d]+)\">/i;
var
arr=reg.exec(echo);
var formhash=arr[1];

0x02b.利用as里的xml.onData/LoadVars等得到hash:

import RegExp;
var
xml:XML = new XML();
xml.onData = function(s) {

     tb1.text = getFirstMatch(new
RegExp("<input type=\"hidden\" name=\"formhash\" id=\"formhash\"
value=\"(\\w+)\">", "ig"), s, 1);
}

xml.load(url+"post.htm");
function getFirstMatch(re, s, i) {

     var m = null;

     if ((m = re.exec(s)) != null) {

         return m[i];

     }
}

得到hash后,如果原来app里用的‘Request变量‘那么我们可以直接通过xml.load等get提交我们构造的变量,如果是post我们可以通过LoadVars等提交:


var _l3 = new LoadVars();  

        

_l3.decode(unescape("formhash="+hash));
_l3.send(url, "",
"POST");

但是需要加载crossdomain.xml[而且只可以提交到crossdomain.xml里设置的domain].如果没有
crossdomain.xml或者crossdomain.xml里设置不符合我们的要求,我们可以把crossdomain.xml改为任意后缀然后
通过System.security.loadPolicyFile()来加载.

0x03.CAPTCHA
Image

也就是我们经常看到的图片验证码,如果抛开用户感觉等不谈,就安全上应该是比较安全的防止crsf的方法,目前还没有什么通用的破解方法,现在有很多通过分析图片格式来得到验证码的,但是这些都是基于gui的,没办法利用到crsf上来.


要突破CAPTCHA
Image只有具体问题具体分析了,通过分析原代码找到app的一些逻辑错误/算法问题来想办法绕过.比如有的图片验证码是根据cookie来计算判断
的,那么我可以通过xss得到cookie来‘算‘出这个验证码,又如验证码保存到session没有清空,可以暴力这个验证码[详细见lake2的文
章:轻轻绕过你的验证码]等等.

小结:
  
在上面的文字里,其实主要介绍的一个思路是通过http的请求来伪造提交的数据,然后通过分析这个数据得到你要的东西.按这个思路你可以不须拘泥于js/as等脚本,还有很多脚本/语言可以实现如java/jvm?
:)
  
[最后,感谢那些和我一起交流探讨的人们.]  

参考:

0.Preventing CSRF:http://www.playhack.net/view.php?id=31

1.XMLHttp参考手册:http://suwei.nanshapo.com/tech/webdev/ajax/xmlhttp/

2.Flash Lite 2.x ActionScript 语言参考: http://livedocs.adobe.com/flashlite/2_cn/main/wwhelp/wwhimpl/js/html/wwhelp.htm

3.HTTP Header Injection Vulnerabilities in the Flash Player
Plugin:http://www.rapid7.com/advisories/R7-0026.jsp

4.Discuz!/phpwind flash标签的xss :http://superhei.blogbus.com/logs/11792433.html

5.Request变量与csrf :http://superhei.blogbus.com/logs/11412189.html

6.轻轻绕过你的验证码 :http://blog.csdn.net/lake2/archive/2006/09/15/1224897.aspx

Bypass Preventing CSRF,布布扣,bubuko.com

时间: 2024-10-16 15:29:43

Bypass Preventing CSRF的相关文章

Preventing CSRF With Ajax

https://stackoverflow.com/a/24394578/3782855 You don't need the ValidationHttpRequestWrapper solution since MVC 4. According to this link. Put the token in the headers. Create a filter. Put the attribute on your method. Here is my solution: var token

CSRF——攻击与防御

CSRF——攻击与防御 author: lake2 0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情——这些事情用户未必知道和愿意做,你能够把它想做HTTP会话劫持.    站点是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,仅仅要不关闭浏览器或者退出登录,以后訪问这个站点会带上这个

转-CSRF——攻击与防御

0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情--这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持.    网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie.如果这期间浏览器被人控制着请求了这个网站

MVC 应用免受 CSRF攻击

保护ASP.NET 应用免受 CSRF 攻击 CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF.CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很

漏洞科普:对于XSS和CSRF你究竟了解多少

转自:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显. 黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使

浅谈CSRF攻击方式

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. 三.CSRF漏洞现状 CSRF这

CSRF攻击详解(转)

原文:http://www.django-china.cn/topic/580/ 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账...

如何防止ASP.NET网站遭受CSRF的攻击

转载地址: http://www.cnblogs.com/shanyou/p/5038794.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF.CSRF(Cross Site Request Forger

浅谈CSRF攻击方式(转)

add by zhj: 在看Django开发的应用时,看到了CSRF,然后搜到了这篇文章,讲的不错.其实CSRF 攻击也蛮简单的.当你登陆网站A后,会在本地存有cookie,在cookie没有过期的情况下,你又去访问 网站B,而网站B的js中包含发给A的http请求(即http的域名是A),因为这个请求的域名是A,所以会 携带你的对于A域名的cookie,这样就在你不知情的情况下完成了一次操作. 原文:http://www.cnblogs.com/hyddd/archive/2009/04/09