从零掌握XML与DTD实体:原理、XXE漏洞攻防

本文仅用于技术研究,禁止用于非法用途。
Author:枷锁

文章目录

  • 一、XML基础
    • 1. 什么是XML?
    • 2. XML语法规则
    • 3. 数据类型
  • 二、DTD
    • 1. 认识DTD
    • 2. 声明DTD
    • 3. DTD实体
    • 4. 如何防御XXE攻击?
    • 5. 总结

一、XML基础

1. 什么是XML?

XML : 可扩展标记语言(Extensible Markup Language)是一种用于​​结构化存储和传输数据​​的文本格式标记语言。XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

XML 就是让你用自己定义的标签(比如 <价格>3999</价格>)把数据包成纯文本,让不同系统和软件都能读懂的一种通用数据格式。

作用:XML的设计宗旨是传输数据,不是显示数据。XML在web中的应用已十分广泛。XML是各种应用程序之间数据传输最常用的格式。与HTML的区别在于一个被设计用来展示数据,一个用来传输数据
特点 :

  • XML 的设计宗旨是传输数据,而非显示数据;
  • XML 标签没有被预定义,需要自行定义标签;
  • XML 被设计为具有自我描述性;
  • XML 是 W3C 的推荐标准。

与 HTML 相比:

  1. HTML 用于定义数据的展示,专注于它应该是什么样子;XML 用于传输和存储数据。
  2. 都是用标签组织文本内容,但是XML没有预定义的标签。
    XML文档结构包括XML声明(可选)、DTD文档类型定义(可选)、文档元素。下面是一个XML文档实例:
<?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
<girls><girl><hair>短头发</hair><eye>大眼睛</eye><face>可爱的脸庞</face><summary age="23">我最爱的女孩</summary></girl>
</girls>

说明:

  1. 第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8)。
  2. XML注释:。
  3. 第二行是文档的根元素(girls)。
  4. 后面就是子元素以及元素结尾。
  5. 整个XML是一种树形结构(根节点,子节点)。
    元素:XML 元素指的是从开始标签直到结束标签的部分(包括标签)。一个元素可以包含:
  6. 其他元素(子元素)
  7. 文本
  8. 属性

2. XML语法规则

  • XML 声明文件是可选部分,如果存在需要放在文档的第一行。
  • XML 必须包含根元素,它是所有其他元素的父元素。上文中的girls就是根元素。

(1) 所有 XML 元素都必须有关闭标签(成双成对出现)
在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签:

<p>This is a paragraph</p>
<p>This is another paragraph</p>

注释:XML 声明没有关闭标签。这不是错误。声明不属于XML本身的组成部分。它不是 XML 元素,也不需要关闭标签。
(2) XML 标签对大小写敏感
XML 标签对大小写敏感。在 XML 中,标签必须使用相同的大小写来编写打开标签和关闭标签:

 <Message>这是错误的。</message>
<message>这是正确的。</message>

(3) XML 必须正确地嵌套
在 XML 中,所有元素都必须彼此正确地嵌套:

<b><i>This text is bold and italic</i></b>

(4) XML 的属性值须加引号
与 HTML 类似,XML 也可拥有属性(名称/值的对)。
在 XML 中,XML 的属性值须加引号。请研究下面的两个 XML 文档。第一个是错误的,第二个是正确的:

<note date=08/08/2008>
<to>George</to>
<from>John</from>
</note>
<note date="08/08/2008">
<to>George</to>
<from>John</from>
</note>

在第一个文档中的错误是,note 元素中的 date 属性没有加引号。

3. 数据类型

主要有两种数据类型:

  1. PCDATA:被解析的字符数据,其中的标签会被当作标记来处理,而实体会被展开。
  2. CDATA:不被解析的字符数据,其中的标签不会被当作标记来对待,其中的实体也不会被展开。

二、DTD

1. 认识DTD

DTD(Document Type Definition)文档类型定义。
DTD是用来控制文档的一个格式规范的,由 XML 设计者或作者开发。
在DTD中定义了XML中存在什么标签、拥有什么属性、以及其它元素里面有什么元素等。

​​DTD(文档类型定义)是XML的“语法说明书”​​,用来规定XML文档里能写哪些标签、标签怎么嵌套、哪些属性必须填 —— 就像老师批改作文时用的《写作格式要求》。

下面是一个DTD文档的实例:

<!ELEMENT girls (girl)*>
<!ELEMENT girl (hair, eye, face, summary)>
<!ELEMENT hair (#PCDATA)>
<!ELEMENT eye (#PCDATA)>
<!ELEMENT face (#PCDATA)>
<!ELEMENT summary (#PCDATA)>
<!ATTLIST summary age CDATA "0">

说明:

  1. 第一行定义了girls元素,它可以有任意个girl子元素,其中型号(*)表示出现0次或者多次。
  2. 第二行定义了girl元素,它有4个子元素,并且在girl中必须且只能出现一次。
  3. 第三行定义了hair元素,该元素的数据类型为PCDATA。
  4. 第七行声明了summary元素的age属性,属性类型是CDATA,默认值是“0”。

2. 声明DTD

第一个例子中 XML 文档并不包含标签定义,它由我们第二个例子的 DTD 来完成。XML文档要使用
DTD定义的标签,就要先声明DTD。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
(1) 内部声明DTD

  • 内部声明必须使用<!DOCTYPE>元素.

(2) 外部引用DTD
我们可以从外部的dtd文件中引用(这也是xxe漏洞产生的原因)。引用格式为:

<!DOCTYPE 根元素 SYSTEM "URL">

比如:

 <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
<!DOCTYPE girls SYSTEM "girls.dtd">
<girls><girl><hair>短头发</hair><eye>大眼睛</eye><face>可爱的脸庞</face><summary age="23">我最爱的女孩</summary></girl>
</girls>

URL中常见的协议有:
在这里插入图片描述

3. DTD实体

实体(ENTITY):如果在 XML 文档中需要频繁使用某一条数据,我们可以预先给这个数据起一个别名
(类似于变量),即一个ENTITY,然后在文档中调用它。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体可以分为通用实体和参数实体,都可以内部声明或者外部引用。

1. DTD实体是什么?
DTD实体(Entity) 是XML文档中的一种“变量”或“占位符”,它允许你定义一个值(比如一段文本、一个文件内容、甚至一个网络请求的结果),然后在XML文档中通过 &实体名; 来引用它。

类比理解

  • 就像编程里的变量
    author = "刘慈欣"  # 定义变量
    print(author)     # 使用变量
    
    XML里类似:
    <!ENTITY author "刘慈欣">  <!-- 定义实体 -->
    
    <作者>&author;</作者>  <!-- 使用实体 -->
    
    最终解析时会变成:
    <作者>刘慈欣</作者>
    

2. DTD实体的分类
DTD实体主要分为 3种类型,每种有不同的用途:

(1)内部实体(存储固定文本)
作用:定义一个固定的字符串,在XML里复用。
语法

<!ENTITY 实体名 "文本内容">

示例

<!ENTITY book_title "三体">
<!ENTITY book_author "刘慈欣">

XML调用

<><书名>&book_title;</书名><作者>&book_author;</作者>
</>

解析后

<><书名>三体</书名><作者>刘慈欣</作者>
</>

(2)外部实体(加载外部文件或URL)
作用:引用外部文件、网页、甚至系统命令的结果。
语法

<!ENTITY 实体名 SYSTEM "文件路径或URL">

示例

<!ENTITY secret_file SYSTEM "file:///etc/passwd">  <!-- 读取Linux密码文件 -->
<!ENTITY website SYSTEM "http://example.com/data.txt">  <!-- 加载网页内容 -->

XML调用

<数据>&secret_file;</数据>

解析后

<数据>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...</数据>

⚠️ 这是黑客攻击的入口!(后面会讲XXE漏洞)


(3)参数实体(DTD内部复用)
作用:在DTD内部定义可复用的规则(普通XML不能直接调用)。
语法

<!ENTITY % 实体名 "DTD规则">

示例

<!ENTITY % book_rule "书名, 作者, 价格">
<!ELEMENT 书籍 (%book_rule;)>

解析后

<书籍><书名>三体</书名><作者>刘慈欣</作者><价格>59.9</价格>
</书籍>

3. DTD实体的安全风险(XXE漏洞)
XXE漏洞:
XXE(XML External Entity) 漏洞是指攻击者利用 外部实体 加载恶意内容,比如:

  • 读取服务器上的敏感文件(/etc/passwdC:\Windows\win.ini
  • 扫描内网服务(http://192.168.1.1/admin
  • 发起SSRF攻击(让服务器访问恶意网站)

攻击示例
(1)读取本地文件

<?xml version="1.0"?>
<!DOCTYPE hack [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>&xxe;</user>

服务器返回

<user>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...</user>

(2)扫描内网

<!ENTITY xxe SYSTEM "http://192.168.1.1:8080/admin">

如果服务器返回数据,说明内网存在管理后台。

(3)远程代码执行(某些环境下)

<!ENTITY xxe SYSTEM "expect://id">

可能返回当前用户权限(uid=0(root))。


4. 如何防御XXE攻击?

开发者应该怎么做?

  1. 禁用DTD和外部实体解析(最有效)

    • Java示例
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
      
    • PHP示例
      libxml_disable_entity_loader(true);
      
  2. 输入过滤

    • 检查XML是否包含 <!DOCTYPE<!ENTITY
  3. 使用JSON替代XML

    • 现代API推荐用JSON(没有实体解析风险)。

安全测试如何检测XXE?

  1. 提交测试Payload:
    <?xml version="1.0"?>
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
    <data>&xxe;</data>
    
  2. 观察响应是否包含 /etc/passwd 的内容。

5. 总结

关键点说明
DTD实体是什么XML的“变量”,用于复用数据
内部实体存储固定文本,如 <!ENTITY name "Alice">
外部实体加载文件/URL,黑客利用它读文件(XXE漏洞)
参数实体DTD内部复用规则,如 <!ENTITY % rule "a,b,c">
XXE漏洞攻击者通过外部实体读取 /etc/passwd
防御方法禁用外部实体解析 + 输入过滤

一句话记住DTD实体
DTD实体是XML的变量,外部实体可能被黑客利用读取服务器文件(XXE漏洞),必须禁用!
DTD实体是XXE漏洞的根源,安全开发必须禁用外部实体解析!

宇宙级免责声明​​
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。

🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界

⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。

希望这个教程对你有所帮助!记得负责任地进行安全测试。

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

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

相关文章

.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!

.NET 8 Release Candidate 1 (RC1)发布&#xff1a;ASP.NET Core重大改进来袭&#xff01; 近日&#xff0c;.NET 8 Release Candidate 1 (RC1)正式发布&#xff0c;这是在今年晚些时候计划发布的最终 .NET 8 版本之前的两个候选版本中的第一个。此版本包含了大部分计划中的功…

Jenkins pipeline 部署docker通用模板

Jenkinsfile: Docker的NETWORK_NAME不要使用bridge默认网络&#xff0c;要使用自定义的网络如test默认 bridge 网络&#xff1a;容器间不能用名字互相访问&#xff0c;只能用 IP。自定义网络&#xff1a;容器间可以用名字互相访问&#xff0c;Docker 自动做了 DNS 解析。pipeli…

【每日算法】专题十五_BFS 解决 FloodFill 算法

1. 算法思想 Flood Fill 问题的核心需求 给定一个二维网格&#xff08;如像素矩阵&#xff09;、一个起始坐标 (x, y) 和目标颜色 newColor&#xff0c;要求&#xff1a; 将起始点 (x, y) 的颜色替换为 newColor。递归地将所有与起始点相邻&#xff08;上下左右&#xff09; …

ESLint 完整功能介绍和完整使用示例演示

以下是ESLint的完整功能介绍和完整使用示例演示&#xff1a; ESLint 完整功能介绍 一、核心功能静态代码分析&#xff1a; 通过解析JavaScript/TypeScript代码为抽象语法树&#xff08;AST&#xff09;&#xff0c;识别语法错误、潜在问题&#xff08;如未定义变量、未使用变量…

解决问题七大步骤

发现问题后寻找解决方案的流程可以细化为 7个核心步骤&#xff0c;每个步骤包含具体措施、信息源和关键技巧&#xff0c;形成“从自查到验证、从独立解决到寻求帮助”的完整闭环。以下是完善后的流程&#xff1a; 一、明确问题与初步自查&#xff08;前提&#xff1a;减少无效搜…

思维链(CoT)技术全景:原理、实现与前沿应用深度解析

一、核心概念与原理 定义与起源 CoT 是一种引导大语言模型&#xff08;LLM&#xff09;显式生成中间推理步骤的技术&#xff0c;通过模拟人类逐步解决问题的过程&#xff0c;提升复杂任务&#xff08;如数学证明、多步逻辑推理&#xff09;的准确性。该概念由 Google Brain 团…

实验-华为综合

华为综合实验 一 实验拓扑二 实验配置交换机2 vlan batch 10 20 int e0/0/2 port link-type access port default vlan 10 int e0/0/1 port link-type access port default vlan 20 int e0/0/3 port link-type trunk port trunk allow-pass vlan alltelnet交换机3 链路类型配置…

Matlab打开慢、加载慢的解决办法

安装完毕后直接打开会非常慢&#xff0c;而且打开了之后还得加载很久才能运行 解决办法如下&#xff1a; 1.找到路径“D:\Program Files\Polyspace\R2020a\licenses”&#xff08;我是把matlab安装在D盘了&#xff0c;如果是其他盘修改路径即可&#xff09;&#xff0c;该路径记…

混沌趋势指标原理及交易展示

1. 引言在金融市场交易中&#xff0c;尤其是加密货币合约交易&#xff0c;趋势跟踪是最主流的策略之一。然而&#xff0c;传统趋势指标如均线、MACD等存在明显的滞后性&#xff0c;往往在趋势确立后才发出信号&#xff0c;导致交易者错失最佳入场时机。更糟糕的是&#xff0c;市…

Java面试宝典:Maven

一、Maven的本质与核心价值 项目管理革命 POM驱动:通过pom.xml文件定义项目结构、依赖、构建规则,实现标准化管理()。示例配置: <dependencies> <dependency> <groupId>org.springframework

可靠消息最终一致性分布式事务解决方案

之前文章写过主流的一些 分布式事务的解决方案&#xff0c;但其实工作中很少有一些高并发的业务中去使用这些方案&#xff0c;因为对于高并发的场景来说&#xff0c;引入这些方案的性能损耗太大&#xff0c;且对系统事务侵入性太强影响系统稳定性。 所以在高并发的业务中&…

ISIS基础

拓扑计算方式 模型 支持的网络 支持的地址OSPF SPF TCP/IP IP网络 IPv4地址ISIS SPF OSI CLNP网络 NSAP地址集成ISIS SPF TCP/IP IP网络 NSAP地址&#xff0c;但可以支持IPv4地址12. …

基于ASP.NET+SQL Server实现(Web)排球赛事网站

排球赛事网的设计与实现摘要随着近几年来计算机技术、网络技术及相应软件技术的迅猛发展&#xff0c;人们的生活已越来越离不开计算机了&#xff0c;而且总是要花费很多时间在它上面。一直以来&#xff0c;排球作为一项大众喜爱的运动&#xff0c;得到广泛传播。随着各项排球赛…

【PTA数据结构 | C语言版】根据后序和中序遍历输出前序遍历

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果&#xff0c;输出该树的前序遍历结果。 输入格式: 第一行给出正整数 n (≤30)&#xff0c;是树中结点的个数。随后两行&#xff0c;每行给出…

Java HashMap高频面试题深度解析

在 Java 面试中&#xff0c;HashMap 是必问的核心知识点&#xff0c;以下是高频问题和深度解析框架&#xff0c;助你系统性掌握&#xff1a;一、基础概念HashMap 的本质是什么&#xff1f; 基于哈希表的 Map 接口实现&#xff0c;存储键值对&#xff08;Key-Value&#xff09;非…

GitHub Pages无法访问以点号.开头的目录

目录 前言 Jekyll 是什么 启用访问 总结 前言 一些前端项目经常会使用GitHub Pages进行部署展示&#xff0c;但是GitHub Pages 使用的是 Jekyll 引擎&#xff0c;对 Jekyll 引擎不熟悉的小伙伴就会出现如文章标题所言的情况。 Jekyll 是什么 Jekyll 是 GitHub Pages 默认…

JS JSON.stringify介绍(JS序列化、JSON字符串 )(遍历输入值的所有可枚举属性,将其转换为文本表示)缓存序列化、状态管理与时间旅行、replacer

文章目录JSON.stringify 全解析1. 基本概念2. 序列化原理1. 对于原始类型&#xff0c;直接转换为对应的字符串表示2. 对于对象和数组&#xff0c;递归处理其每个属性或元素3. 应用特殊规则处理日期、函数、Symbol 等特殊类型4. 检测并防止循环引用5. 应用 replacer 函数或数组进…

SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战

关键词&#xff1a; SQLite、LiteDB、VACUUM、WAL、auto_vacuum、文件瘦身、数据库维护在嵌入式或桌面、IoT 网关等场景&#xff0c;很多同学都会选择单文件数据库&#xff08;SQLite、LiteDB、SQL CE…&#xff09;。 最近群里一位朋友反馈&#xff1a;“我的 test.db 已经把业…

如何加固Web服务器的安全?

Web服务器是用户和公司联系的桥梁&#xff0c;Web服务器为用户交付网页内容和提供Web应用。正因为Web服务器是面向互联网的&#xff0c;所以成为了网络的攻击经常利用的一个入口。Web 服务器是企业数字化转型的 “前沿阵地”&#xff0c;其安全性不仅关乎技术层面的稳定运行&am…

MyBatis:配置文件完成增删改查_添加

1 实现添加操作 编写接口方法:Mapper接口编写sql语句&#xff1a;sql映射文件<insert id"add">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brandName},#{companyName},#{ordered},#{description},#{status});</ins…