XML实体
翻译
原文:https://portswigger.net/web-security/xxe/xml-entities
- name: 翻译
desc: 原文:https://portswigger.net/web-security/xxe/xml-entities
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# XML实体
在本节中,我们将介绍 XML 的一些关键特性,这些特性对于理解 XXE 漏洞有很大的帮助。
# 1什么是XML?
XML 表示 “可扩展标记语言(Extensible Markup Language)” 。XML 是一种专门设计并用于存储和传输数据的语言。
- 与 HTML 的共同点,XML 使用标签和数据的树状结构。
- 与 HTML 的不同点,XML 不使用预定义的标签,因此,可以随意地为标签指定描述数据的名称。(XML标签的 数据和名称 都可以自定义)
在 Web 历史的早期,XML 作为一种数据传输格式 使其非常流行(“AJAX” 中的 “X” 代表 “XML”)。但它的流行程度现在已经下降,取而代之的是 JSON 格式。
# 2什么是XML实体?
XML 实体是在 XML 文档中表示数据项的一种方式,而不是数据本身。XML 语言的规范中内置了各种实体。例如,实体<
和>
表示字符<
和>
。这两个字符是用于表示 XML 标记的元字符,因此当它们出现在数据中时,通常必须使用它们的实体形式来表示。
# 3什么是文档类型定义?
XML文档类型定义(DTD)具有各种声明规则,它可以定义 XML 文档结构、文档内包含的数据值类型 等其他选项。DTD 在 XML 文档开头的DOCTYPE
元素中声明,该元素是可选的。
- DTD 可以完全包含在文档本身当中(称为 “内部DTD”);
- 也可以从其他位置加载(称为 “外部DTD”);
- 也可以是两者的混合。
# 4什么是XML自定义实体?
XML 允许你在 DTD 中创建自己的实体。例如:
<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>
此定义意味着,在 XML 文档中对&myentity;
实体的任何引用,都将替换为定义的值:"my entity value"
。
(译者加:“实体” 可以理解为编程语言中的 “变量” 。例如,你在 XML 文档中定义了一个myentity "abc123"
,则你在文档的其他位置可以通过&myentity;
来获取它的值)
# 5什么是XML外部实体?
(译者加:从文档外部加载自定义的 XML 实体,有点像 PHP 中的远程文件包含)
XML 外部实体是一种自定义的实体,它的具体定义 位于声明它们的 DTD 外部。
外部实体的声明使用SYSTEM
关键字,并且必须指定一个 URL,文档会从该 URL 加载实体的值。例如:
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>
URL 可以使用file://
协议,因此可以从文件中加载外部实体。例如:
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>
XML 外部实体成为了XML 外部实体攻击 (opens new window)的主要手段。