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攻击
………………………….
参考:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!