Bit*_*itz 7 c# xml linq-to-xml veracode xxe
因此,当我在应用程序上运行安全扫描时,我遇到了一个问题。事实证明,我无法防范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();
}
Run Code Online (Sandbox Code Playgroud)
根据Veracode,不安全的行是 XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml));
但是根据Owsap的说法,它应该是安全的:
默认情况下,System.Xml.Linq库中的XElement和XDocument对象都不受XXE注入的影响。XElement仅解析XML文件中的元素,因此将完全忽略DTD。XDocument默认情况下禁用DTD,并且只有在使用其他不安全的XML解析器构造时,它才是不安全的。
因此,似乎我在使用usafe XML分析器(XDocument对XXE 开放)时犯了一个错误。
我发现一个单元测试可以重复该问题,并且可以安全使用,XDocument但是我似乎找不到确切的代码不安全之处,因为我没有使用:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse; // unsafe!
Run Code Online (Sandbox Code Playgroud)
您可以运行我的代码以复制问题,但是您应使用以下值将行替换为空的xmlStr:此处(对于单个帖子而言太大)
我不确定这是如何或为什么有效,但它确实有效:
XDocument fixedFilterXmlObj;
using (XmlNodeReader nodeReader = new XmlNodeReader(filerNode))
{
nodeReader.MoveToContent();
fixedFilterXmlObj = XDocument.Load(nodeReader);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1016 次 |
| 最近记录: |