XXE:使用XDocument对XML外部实体引用的不当限制

问题描述 投票:7回答:1

所以当我在我的应用程序上运行安全扫描时,我遇到了一个问题。 It turns out that I am failing to protect against 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));

但似乎根据Owasp,qazxsw poi:

默认情况下,System.Xml.Linq库中的XElement和XDocument对象都可以安全地从XXE注入。 XElement仅解析XML文件中的元素,因此完全忽略DTD。默认情况下,XDocument禁用DTD,如果使用不同的不安全XML解析器构造,则只是不安全。

所以我似乎犯了使用usafe XML Parser的错误,将it should be safe打开到XXE。

XDocument并且还安全使用I found a unit test that replicates the issue但我似乎无法找到我的代码究竟是什么不安全,因为我不使用:

XDocument

您可以运行我的代码来复制问题,但是您应该使用以下值替换空xmlStr:XmlReaderSettings settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Parse; // unsafe! (对于单个帖子来说太大)

c# xml linq-to-xml veracode xxe
1个回答
3
投票

我不确定这是如何或为什么有效,但确实如此:

here
© www.soinside.com 2019 - 2024. All rights reserved.