CS.XXE.DOCUMENT

可能的 XML 外部实体 (XXE) 攻击

CS.XXE.DOCUMENT 检查器会标记 XML 输入的实例,这些实例由配置较弱的 XmlDocument 分析程序处理。

漏洞与风险

XML 外部实体攻击是一种针对解析 XML 输入的应用程序的攻击。当包含对外部实体进行引用的 XML 输入由配置较弱的 XML 分析程序处理时,会发生此攻击。这种攻击可能导致机密数据泄露、拒绝服务、服务器端请求伪造、从分析程序所在机器的角度进行端口扫描,以及其他系统影响。

缓解与预防

防止 XXE 攻击的最安全方法是完全禁用 DTD(外部实体)。根据分析程序的不同,方法可能会有所不同。例如,在 .NET 4.5.2+ 中,XDocument 默认禁用 DTD,只有使用具有默认或不安全设置的非 null XmlResolver 时才会出现安全风险。

漏洞代码示例

复制
  static void LoadXML()
   {
     string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/testdata2.txt'>]>"
                       + "<doc>&win;</doc>";
     string xml = "<?xml version='1.0' ?>" + xxePayload;
   
     XmlDocument xmlDoc = new XmlDocument();
     xmlDoc.XmlResolver = new XmlUrlResolver(); // Defect reported here.XmlResolver 与 XmlUrlResolver 一起配置会有安全风险。
     xmlDoc.LoadXml(xml);
    Console.WriteLine(xmlDoc.InnerText);
    Console.ReadLine();
  }

修正代码示例

复制
  static void LoadXML()
  {
  string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/testdata2.txt'>]>"
  + "<doc>&win;</doc>";
  string xml = "<?xml version='1.0' ?>" + xxePayload;
   
  XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.XmlResolver = null; // Setting the XmlResolver to null, or not setting it at all 
                           // (it is null by default), disables DTDs.这有助于防止 XXE 攻击。
  xmlDoc.LoadXml(xml);
 Console.WriteLine(xmlDoc.InnerText);
 Console.ReadLine();
 }

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。