【问题标题】:XXE: Improper Restriction of XML External Entity Reference With XDocumentXXE:使用 XDocument 对 XML 外部实体引用的不当限制
【发布时间】:2018-02-28 10:54:37
【问题描述】:

因此,当我对我的应用程序运行安全扫描时,我遇到了一个问题。 It turns out that I am failing to protect against XXE。 这是一个简短的 sn-p 显示有问题的代码:

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 解析器构造。

所以我似乎犯了使用 usafe XML 解析器的错误,将 XDocument 打开到 XXE。

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

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

您可以运行我的代码来重现该问题,但您应该将带有空 xmlStr 的行替换为以下值:here(对于单个帖子来说太大)

【问题讨论】:

  • 我希望有一种方法可以在 SOAP 端点处理的上下文中解决这个问题。

标签: c# xml linq-to-xml veracode xxe


【解决方案1】:

我不确定这是如何或为什么会起作用的,但确实如此:

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

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2019-11-08
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多