XXE:使用XDocument对XML外部实体引用的限制不正确
问题描述:
因此,当我在应用程序上运行安全扫描时遇到了问题。 It turns out that I am failing to protect against XXE。 下面是该问题的代码短的片段:XXE:使用XDocument对XML外部实体引用的限制不正确
static void Main()
{
string inp = Console.ReadLine();
string xmlStr = ""; //This has a value that is much too long to put into a single post
if (!string.IsNullOrEmpty(inp))
{
xmlStr = inp;
}
XmlDocument xmlDocObj = new XmlDocument {XmlResolver = null};
xmlDocObj.LoadXml(xmlStr);
XmlNodeList measureXmlNodeListObj = xmlDocObj.SelectNodes("REQ/MS/M");
foreach (XmlNode measureXmlNodeObj in measureXmlNodeListObj)
{
XmlNode detailXmlNodeListObj = xmlDocObj.SelectSingleNode("REQ/DTD");
string measureKey = measureXmlNodeObj.Attributes["KY"].Value;
if (detailXmlNodeListObj.Attributes["MKY"].Value ==
measureKey) //Checking if selected MeasureKey is same
{
XmlNode filerNode = measureXmlNodeObj.SelectSingleNode("FS");
if (filerNode != null)
{
XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml));
var measureFixedFilters = (from m in fixedFilterXmlObj.Element("FS").Elements("F")
select m).ToList();
foreach (var fixedFilter in measureFixedFilters)
{
var fixedFilterValues = (from m in fixedFilter.Elements("VS").Elements("V")
select m.Attribute("DESC").Value).ToList();
foreach (var value in fixedFilterValues)
{
Console.WriteLine(value.Trim());
}
}
}
}
}
Console.ReadLine();
}
根据Veracode的,不安全是XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml));
线但好像根据Owsap,it should be safe:
无论是System.Xml.Linq库 中的XElement和XDocument对象在默认情况下从XXE注入是安全的。 XElement仅解析XML文件中的 元素,因此DTD完全被忽略。 XDocument默认情况下禁用了DTD,并且如果 使用不同的不安全XML解析器构造,则仅仅是不安全的。
所以看起来我犯了错误,使用美国国家安全局XML解析器,向XXE打开XDocument
。
I found a unit test that replicates the issue,也有XDocument
安全使用,但我似乎无法准确地找到我的代码是什么不安全的,因为我不使用:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse; // unsafe!
您可以运行我的代码复制的问题,但是你应该有这个值替换空xmlStr行:here(太大,单篇文章)
答
我不知道如何或为何这个工作,但它的作用:
XDocument fixedFilterXmlObj;
using (XmlNodeReader nodeReader = new XmlNodeReader(filerNode))
{
nodeReader.MoveToContent();
fixedFilterXmlObj = XDocument.Load(nodeReader);
}