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的更多相关文章

  1. Preventing CSRF in Java web apps---reference

    reference from:http://ricardozuasti.com/2012/preventing-csrf-in-java-web-apps/ Cross-site request fo ...

  2. Preventing CSRF With Ajax

    https://stackoverflow.com/a/24394578/3782855 You don't need the ValidationHttpRequestWrapper solutio ...

  3. CSRF——攻击与防御

    CSRF——攻击与防御 author: lake2 0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意 ...

  4. 转-CSRF——攻击与防御

    0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...

  5. 保护ASP.NET 应用免受 CSRF 攻击

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...

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

    转自:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广 ...

  7. CSRF(跨站请求伪造)攻击方式

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

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

    转载地址: http://www.cnblogs.com/shanyou/p/5038794.html?hmsr=toutiao.io&utm_medium=toutiao.io&ut ...

  9. MVC 应用免受 CSRF攻击

    保护ASP.NET 应用免受 CSRF 攻击   CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack ...

随机推荐

  1. Android Studio 创建aar包与引用

    两者区别:*.jar: 只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件.*.aar: 包含所有资源 ,class以及res资源文件全部包含 一.创建aar包1.创建一个 ...

  2. CSS之导航菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. MyBatis参数传入集合之foreach动态sql

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.ite ...

  4. WF4.0 基础篇 (十八) Flowchar

    本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...

  5. 【转载】Linux小白福利:《超容易的Linux系统管理入门书》(三)在虚拟机上安装Linux

    本篇是Linux小白最佳实践第3篇,目的就是让白菜们自己动手安装个Linux玩玩.如果你是Linux小白,请务必亲自动手来安装.不想安装多个操作系统的,虚拟机是最佳选择,一台电脑上可以用虚拟机安装7. ...

  6. 10套免费的响应式布局 Bootstrap 模版

    1. Cardio Cardio是我最喜欢的一个轻量级模板.它几乎可以很少的修改的用于任何类型的业务. 2. Evento Evento 是一个事件引导广告模板的形状.它是设计精美和注意细节. 3. ...

  7. Cassandra1.2文档学习(15)—— 配置数据一致性

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...

  8. html5 全屏滚动活动页学习

    先看几个具体的实例: 1.腾讯娱乐:http://ent.qq.com/zt2014/qqent/h5.htm?from=groupmessage&isappinstalled=0 2.苏宁互 ...

  9. php下删除一篇文章生成的多个静态页面

    php自定义函数之删除一篇文章生成的多个静态页面,可能有多页的文章,都是需要考虑到的. 复制代码代码如下: //– 删除一篇文章生成的多个静态页面  //– 生成的文章名为 5.html 5_2.ht ...

  10. CentOS6.5 MySQL 配置设置总结笔记

    三.登录MySQL 登录MySQL的命令是mysql, mysql 的使用语法如下:  mysql [-u username] [-h host] [-p[password]] [dbname]  u ...