今日精选 ·绝对解密 XP系统中隐藏的10个秘密 ·Windows系统文件详解【大全】 ·配置Windows Server 2008高级防火墙 ·带你现场体验专业服务器机房 ·屏蔽五项功能 让Windows XP极速狂飙 ·木马免杀技术大盘点 ·如何让无线路由信号更强更广 ·各大路由器默认密码(完美汇总经典版) ·如何构建安全的入侵检测系统 ·电脑故障维修判断指导大全(联想内部文件) >>>>
编程开发  Java | .Net | C/C++ | Delphi | VC/VB | XML | ASP | PHP
数据库  Oracle | Mysql | DB2 | Sql server
应用方案 无线网络方案 | 有线网络方案 

网管天地  网吧管理 | 路由器 | 交换机 | 服务器
网络安全  黑客技术 | 病毒漏洞 | 网站安全 | 服务器安全 | 入侵防御 | 防火墙
操作系统 Linux/Unix | Windows 
相关文章
没有相关文章
您现在的位置: 企业网络安全 >> 文章·资讯 >> 互联网安全 >> 网站安全 >> 文章正文
旁注保护跨站脚本请求伪造(CSRF)
作者:佚名 文章来源:本站原创 点击数: 更新时间:2008-2-21 14:11:47
CSRF(Cross-site Request Forgery,跨站请求伪造)在过去的n年(n>2)一直都火,在bh/defcon/owasp等会议上多次探讨CSRF的攻防。前段时间PLAYHACK.net上发表了一个总结性的:Preventing CSRF,然而CSRF是很难彻底防止的,下面我的一些Bypass Preventing(旁注) CSRF的技巧:

  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。


免责声明:作品版权归所属媒体与作者所有!!本站刊载此文不代表同意其说法或描述,仅为提供更多信息。如果您认为我们侵犯了您的版权,请告知!本站立即删除。有异议请联系我们。
文章录入:security    责任编辑:security 
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 |