赞
踩
XML外部实体注入(XML eXternal Entity Injection,XXE)是一种针对解析XML输入的应用程序的攻击。当应用程序处理包含不受信任的外部实体引用的XML输入,并使用配置不当的XML解析器时,就可能发生这种攻击。此类攻击可能导致机密数据泄露、拒绝服务攻击(DoS)、服务器端请求伪造(SSRF)以及从解析器所在服务器进行端口扫描等一系列系统安全问题。
除了通用的输入验证,还可以采用以下方式有效防止XXE攻击:
防止XXE的最安全方法是完全禁用DTD(外部实体)。根据不同的解析器,方法如下:
SAXBuilder builder = new SAXBuilder(true);
Document doc = builder.build(new InputSource());
或者:
SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
builder.setFeature("http://xml.org/sax/features/external-general-entities", false);
builder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
builder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
Document doc = builder.build(new InputSource());
SAXReader saxReader = new SAXReader();
saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
saxReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
saxReader.read(new InputSource());
SAXTransformerFactory sf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
StreamSource source = new StreamSource(new InputSource());
sf.newTransformerHandler(source);
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
StreamSource source = new StreamSource(new InputSource());
Schema schema = factory.newSchema(source);
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
StreamSource source = new StreamSource(new InputSource());
tf.newTransformer().transform(source, new DOMResult());
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
StreamSource source = new StreamSource(new InputSource());
validator.validate(source);
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.parse(new InputSource(new InputSource()));
在默认情况下,System.Xml.Linq库中的XElement和XDocument对象不会受到XXE注入攻击,但会受到DoS攻击。为了在不同攻击类型之间提供安全保障,请参考微软关于如何防止.NET中的XXE和XML拒绝服务攻击的指南。
System.Xml.XmlDictionaryReader在默认情况下是安全的,因为当它试图解析DTD时,编译器会抛出一个异常。但是,如果使用不同的不安全XML解析器构造,它会变得不安全。
在.NET Framework 4.5.2版本之前,System.Xml.XmlDocument在默认情况下是不安全的。以下是确保其安全的示例:
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();
// 设置为NULL以禁用DTD - 默认情况下不是NULL
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xml);
Console.WriteLine(xmlDoc.InnerText);
Console.ReadLine();
}
在4.5.2及以上版本中,XmlDocument的XmlResolver默认设置为空。
System.Xml.XmlNodeReader对象在默认情况下是安全的,即使使用不安全的解析器构造或包装在另一个不安全的解析器中也会忽略DTD。
System.Xml.XmlReader对象在默认情况下是安全的。在.NET版本4.5.2及以后,XmlReaderSettings的XmlResolver默认设置为null,提供了额外的安全保障。
在.NET Framework 4.5.2版本之前,XmlTextReader默认情况下是不安全的。以下是不同版本中的安全设置方法:
XmlTextReader reader = new XmlTextReader(stream);
// 需要设置为TRUE,因为默认是FALSE
reader.ProhibitDtd = true;
XmlTextReader reader = new XmlTextReader(stream);
// 需要设置为Prohibit,因为默认是Parse
reader.DtdProcessing = DtdProcessing.Prohibit;
在4.5.2及以上版本中,XmlTextReader的XmlResolver默认设置为空。如果创建自己的非空XmlResolver并使用默认设置或不安全设置,则会变得不安全。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。