提问者:小点点

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


因此,当我对我的应用程序运行安全扫描时,我遇到了一个问题。事实证明,我未能防范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的说法,它应该是安全的:

系统中的XElement和XDocument对象。默认情况下,Xml.Linq库不会被XXE注入。XElement只解析XML文件中的元素,因此dtd被完全忽略。默认情况下,XDocument禁用dtd,只有用不同的不安全XML解析器构造时,它才是不安全的。

因此,我似乎犯了一个错误,使用了一个usafe XML Parser,将XDocument打开到XXE。

我找到了一个重现该问题的单元测试,并且也有一个安全的< code>XDocument用法,但是我似乎找不到我的代码到底哪里不安全,因为我没有使用:

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;   // unsafe!

您可以运行我的代码来复制这个问题,但是您应该用以下值替换带有空xmlStr的行:here(对于单个帖子来说太大了)


共1个答案

匿名用户

我不确定这如何或为什么工作,但它确实如此:

XDocument fixedFilterXmlObj;
using (XmlNodeReader nodeReader = new XmlNodeReader(filerNode))
{
    nodeReader.MoveToContent();
    fixedFilterXmlObj = XDocument.Load(nodeReader);
}