如何防止 XML 注入

Posted

技术标签:

【中文标题】如何防止 XML 注入【英文标题】:How to prevent XML injection 【发布时间】:2020-12-15 17:10:13 【问题描述】:

我收到了一份漏洞报告。

XML 被注入到 URL“XInclude”中。我试图找到一个验证来阻止 XML 被执行。我的 Web 应用程序是使用带有 Web 表单的 Visual Studio C# 构建的。

我正在考虑从 web.config 或 IIS 验证这一点。我不确定是否必须添加代码来验证或解析 XML。


问题详情:

URL 路径文件名似乎容易受到 XML 注入的影响。有效载荷:

<mhx xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include href="http://o6vsilg7waiopz0impyw3z2cn3twho5ptgl3br0.burpcollaborator.net/foo"/></mhx>

已发送到服务器。此有效负载包含一些引用外部域上的 URL 的 XML。应用程序与该域交互,表明解析器处理了注入的 XML。


请求

GET /Edit/Employee/%3cmhx%20xmlns%3axi%3d%22http%3a//www.w3.org/2001/XInclude%22%3e%3cxi%3ainclude%20href%3d%22http%3a//o6vsilg7waiopz0impyw3z2cn3twho5ptgl3br0.burpcollaborator.net/foo%22/%3e%3c/mhx%3e?RequestId=428 HTTP/1.1
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Connection: close

【问题讨论】:

您需要创建单独的minimal reproducible example,它会产生相同的行为并且行为类似于您的应用程序。没有代码就不可能知道如何加载 XML。仅在 url 中添加指向 XML 文件的链接本身不会引入安全问题。 你试过这个代码吗? @Jay 检查这个类似的问题***.com/questions/6381689/… 【参考方案1】:

您没有在问题中包含代码的相关部分,也没有添加太多上下文,因此无法比下面更准确地回答。

    您需要先正确编码(使用 XML 编码)参数,然后再将其写入 xml 文件,然后再进行处理。编码是您的第一道防线。不幸的是,这在 C# 中一点也不简单,并且取决于用户输入在 XML 中的确切位置。

    除此之外,您还应该验证您的输入。在上面的 URL 中,我猜你期望的是一个 Employee id,可能是一个数字。如果它是一个数字,您应该在使用它之前验证它。如果它不是数字,您可能仍然可以验证它(例如长度、字符集、格式),以便不会处理格式错误的输入。

这两个(嗯,很可能甚至其中之一)可以防止漏洞。

【讨论】:

【参考方案2】:

可以在 IIS 中使用 URL 重写来做到这一点,微软网站上有一篇文章解释了它是如何完成的。你可以看看下面的文章: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/request-blocking-rule-template。 这取决于您网站的配置和架构,您可以添加一些代码来验证它,但为此,您必须在代码中分享您如何处理这些请求。 一种方法是使用正则表达式并将可注入字符转换为其他字符。例如,您也可以使用 URL 编码。

【讨论】:

以上是关于如何防止 XML 注入的主要内容,如果未能解决你的问题,请参考以下文章

如何防止SQL注入漏洞

如何正确清理文件名(防止外壳注入)?

XML (XXE) 注入Payload List

防止XSS注入的方法

MyBaits中#{}和${}的真正区别,${}的使用场景,#{}如何防止注入?

asp 防止SQL注入方式