【发布时间】:2012-12-23 06:00:47
【问题描述】:
我们对我们的代码进行了安全审计,他们提到我们的代码容易受到外部实体 (XXE) 攻击。我正在使用以下代码 -
string OurOutputXMLString=
"<ce><input><transaction><length>00000</length><tran_type>Login</tran_type></transaction><user><user_id>ce_userid</user_id><subscriber_name>ce_subscribername</subscriber_name><subscriber_id>ce_subscriberid</subscriber_id><group_id>ce_groupid</group_id><permissions></permissions></user><consumer><login_details><username>UnitTester9</username><password>pDhE5AsKBHw85Sqgg6qdKQ==</password><pin>tOlkiae9epM=</pin></login_details></consumer></input></ce>"
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(OurOutputXMLString);
在审计报告中,他们说它失败了,因为 XML 实体可以包含可以在预期控制之外解析的 URL。 XML 实体解析器将尝试解析和检索外部引用。如果攻击者控制的 XML 可以提交给这些函数之一,那么攻击者就可以访问有关内部网络、本地文件系统或其他敏感数据的信息。 为了避免这种情况,我编写了以下代码,但它不起作用。
MemoryStream stream =
new MemoryStream(System.Text.Encoding.Default.GetBytes(OurOutputXMLString));
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.MaxCharactersFromEntities = 6000;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
但我可以在这里看到阅读器没有任何价值可以加载到xmlDoc(XmlDocument)。
任何人都可以在我遗漏的地方提供帮助吗?
【问题讨论】:
-
如果您确定不使用外部资源,您可以控制 XmlDocument 的 XMLResolver 使用的凭据。有关示例,请参阅msdn.microsoft.com/en-us/library/…。在这种情况下,您可以将 XmlResolver 的凭据设置为只有有限访问权限的帐户,因此任何检索资源的尝试都可以通过 NT 权限进行控制。
-
事实上,这里有一篇非常有用的 MSDN 文章解决了您的问题:msdn.microsoft.com/en-us/magazine/ee335713.aspx
标签: c# asp.net .net xml xml-parsing