XXE -- XML外部实体注入

本文最后更新于:1 年前

对于XXE - xml外部实体注入的学习

XXE - XML外部实体注入

XML External Entity Injection

简单说,

XML 文件在引用外部实体时候,可以沟通构造恶意内容,可以导致读取任意文件,命令执行和对内网的攻击,这就是XXE漏洞

XML

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言

XML被设计为传输和存储数据,其焦点是数据的内容

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

XML把数据从HTML分离,XML是独立于软件和硬件的信息传输工具

两个采用不同技术的系统可以通过XML进行通信和交换数据

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

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

XML基本语法

  • 所有 XML 元素都须有关闭标签

  • XML 标签对大小写敏感

  • XML 必须正确地嵌套

  • XML 文档必须有根元素

  • XML 的属性值须加引号

  • 在 XML 中,空格会被保留,多个空格不会被合并为一个

DTD

文档类型定义(DTD)可定义合法的XML文档构建模块

它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用

内部声明DTD
<!DOCTYPE 根元素 [元素声明]>

引用外部DTD
<!DOCTYPE 根元素 SYSTEM "文件名">
或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

DTD实体—漏洞原理

实体是用于定义引用普通文本或特殊字符的快捷方式的变量

实体引用是对实体的引用

实体可以在内部或外部进行声明

内部实体

<!ENTITY 实体名称 "实体的值">

<?xml version="1.0"?>
<!DOCTYPE note[
<!ELEMENT note (name)>
<!ENTITY hack3r "Hu3sky">
]>
<note>
<name>&hack3r;</name>
</note>

按实体有无参分类,实体分为一般实体和参数实体

一般实体的声明

<!ENTITY 实体名称 "实体内容">

引用一般实体的方法

&实体名称;

外部实体

<!ENTITY 实体名称 SYSTEM "URL">

参数实体

<!ENTITY %实体名称 SYSTEM "URL">

参数实体+外部实体

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

%name(参数实体)是在DTD中被引用的,而&name;是在xml文档中被引用的

XXE主要是利用了DTD引用外部实体导致的漏洞

XXE漏洞原理

既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞

那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击

XML外部实体注入(XML External Entity)

基础的XXE注入— 外部实体注入本地DTD

基于盲注的XXE注入—XML解析器在响应中不显示任何错误

基于错误的XXE注入—成功解析之后,XML解析器始终显示SAME响应。(即“您的消息已被接收”),因此,我们可能希望解析器将文件的内容“打印”到错误响应中。

基础的XXE注入

SYSTEM标识符来引用外部实体的数据

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY a SYSTEM "file:///etc/passwd">
  ]>
<user><username>&a;</username><password>123456</password></user>

//a为实体名,&a;为调用实体

基于盲注的XXE注入

基于错误的XXE注入

https://www.cnblogs.com/backlion/p/9302528.html
https://www.freebuf.com/vuls/175451.html
https://www.freesion.com/article/9065247611/

XXE攻击利用

1.任意文件读取

2.内网信息探测

3.DOS攻击

4.远程命令执行

5.攻击内网网站

攻击分类

1.拒绝服务攻击(DDoS)

2.基本的XXE攻击

3.高级的XXE攻击 - 直接反馈通道

4.高级的XXE攻击 - 外带数据(OOB)通道

5.SSRF攻击

6.XInclude攻击

7.XSLT攻击

………………………….

参考:

https://www.cnblogs.com/backlion/p/9302528.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!