因此,当我对我的应用程序运行安全扫描时,我遇到了一个问题。事实证明,我未能防止 XXE。这是一个显示有问题的代码的简短片段:
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 的说法,它应该是安全的:
默认情况下,System.Xml.Linq 库中的 XElement 和 XDocument 对象都可以防止 XXE 注入。XElement 仅解析 XML 文件中的元素,因此完全忽略 DTD。XDocument 默认禁用 DTD,并且仅在使用不同的不安全 XML 解析器构造时才不安全。
所以似乎我犯了使用 usafe XML Parser 的错误,打开XDocument
了 XXE。
我找到了一个复制问题的单元测试,并且也可以安全使用,XDocument
但我似乎无法找到我的代码到底是什么不安全,因为我不使用:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse; // unsafe!
您可以运行我的代码来复制该问题,但您应该将带有空 xmlStr 的行替换为以下值:here(对于单个帖子来说太大)