龙空技术网

安全技术研究-XML实体扩展XXE攻击(JAVA代码)

血超级厚的土豆 205

前言:

当前兄弟们对“apachejaxpjar”大约比较珍视,你们都需要分析一些“apachejaxpjar”的相关内容。那么小编在网摘上网罗了一些对于“apachejaxpjar””的相关内容,希望我们能喜欢,你们一起来学习一下吧!

JAVA漏洞代码示例1

class XXE {  private static void receiveXMLStream(InputStream inStream, DefaultHandler defaultHandler)      throws ParserConfigurationException, SAXException, IOException {    SAXParserFactory factory = SAXParserFactory.newInstance();    SAXParser saxParser = factory.newSAXParser();    saxParser.parse(inStream, defaultHandler);    // process xml data  }  public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {    try {      receiveXMLStream(new FileInputStream("evil.xml"), new DefaultHandler());    } catch (java.net.MalformedURLException mue) {      System.err.println("Malformed URL Exception: " + mue);    }  }}

如果evil.xml文件包含以下内容,该程序将受到XML实体扩展攻击:

<?xml version="1.0" ?> <!DOCTYPE foo [   <!ELEMENT foo ANY >   <!ENTITY xxe SYSTEM "; >]> <foo>&xxe;</foo>

解析后,evil.xml文件将包含应用程序所在主机的/etc/passwd文件的内容。该攻击可以被利用来窃取任意文件,发起服务器端请求伪造攻击(例如,从受害应用程序的网络角度扫描端口)并执行拒绝服务。

如何防护

使用XML库的Java应用程序特别容易受到XXE的攻击,因为大多数Java XML解析器的默认设置是启用XXE。要安全地使用这些解析器,必须显式地禁用所使用解析器中的XXE。下面介绍如何在最常用的Java XML解析器中禁用XXE。

JAXP DocumentBuilderFactory, SAXParserFactory 和 DOM4J

DocumentBuilderFactory、SAXParserFactory和DOM4J XML解析器可以使用相同的技术进行配置,以保护它们不受XXE的影响。

JAXP DocumentBuilderFactory setFeature方法允许开发人员控制启用或禁用哪些XML处理器特性。

这些特性既可以在Factory上设置,也可以在底层XMLReader setFeature方法上设置。

每个XML处理器都有自己的特性来控制如何处理dtd和外部实体。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();String FEATURE = null;try {    // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all     // XML entity attacks are prevented    // Xerces 2 only -     FEATURE = ";;    dbf.setFeature(FEATURE, true);    // If you can't completely disable DTDs, then at least do the following:    // Xerces 1 -     // Xerces 2 -     // JDK7+ -     FEATURE = ";;    dbf.setFeature(FEATURE, false);    // Xerces 1 -     // Xerces 2 -     // JDK7+ -     FEATURE = ";;    dbf.setFeature(FEATURE, false);    // Disable external DTDs as well    FEATURE = ";;    dbf.setFeature(FEATURE, false);    // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"    dbf.setXIncludeAware(false);    dbf.setExpandEntityReferences(false);    // And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then    // ensure the entity settings are disabled (as shown above) and beware that SSRF attacks    // () and denial    // of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."    // remaining parser logic} catch (ParserConfigurationException e) {    // This should catch a failed setFeature feature    logger.info("ParserConfigurationException was thrown. The feature '" + FEATURE     + "' is probably not supported by your XML processor.");} catch (SAXException e) {    // On Apache, this should be thrown when disallowing DOCTYPE    logger.warning("A DOCTYPE was passed into the XML document");} catch (IOException e) {    // XXE that points to a file that doesn't exist    logger.error("IOException occurred, XXE may still possible: " + e.getMessage());}// Load XML file or stream using a XXE agnostic configured parserDocumentBuilder safebuilder = dbf.newDocumentBuilder();

Xerces 1特性:

不要通过将设置为false来包含外部实体。不要通过将设置为false来包含参数实体。不要通过将设置为false来包含外部dtd。

Xerces 2特性:

通过将设置为true来禁止内联DTD。不要通过将设置为false来包含外部实体。不要通过将设置为false来包含参数实体。不要通过将设置为false来包含外部dtd。

注意:上述防御需要Java 7更新67,Java 8更新20或更高版本,因为上述针对DocumentBuilderFactory和SAXParserFactory的防御措施在较早的Java版本中被破坏了(相关漏洞编号:CVE-2014-6517)。

XMLInputFactory (a StAX parser)

诸如XMLInputFactory之类的StAX解析器允许设置各种属性和特性。来保护Java XMLInputFactory不受XXE攻击:

// This disables DTDs entirely for that factoryxmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // disable external entitiesxmlInputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
TransformerFactory

保护javax.xml.transform.TransformerFactory不受XXE影响:

TransformerFactory tf = TransformerFactory.newInstance();tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
Validator

保护javax.xml.validation.Validator不受XXE影响:

SchemaFactory factory = SchemaFactory.newInstance(";);Schema schema = factory.newSchema();Validator validator = schema.newValidator();validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
SchemaFactory

保护javax.xml.validation.SchemaFactory 不受XXE影响

SchemaFactory factory = SchemaFactory.newInstance(";);factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");Schema schema = factory.newSchema(Source);
SAXTransformerFactory

保护javax.xml.transform.sax.SAXTransformerFactory不受XXE影响:

SAXTransformerFactory sf = SAXTransformerFactory.newInstance();sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");sf.newXMLFilter(Source);

注意:使用以下XMLConstants需要JAXP 1.5,它是在7u40和Java 8中添加到Java中的:

javax.xml.XMLConstants.ACCESS_EXTERNAL_DTDjavax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMAjavax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEETXMLReader

保护Java org.xml.sax.XMLReader不受XXE影响:

XMLReader reader = XMLReaderFactory.createXMLReader();reader.setFeature(";, true);// This may not be strictly required as DTDs shouldn't be allowed at all, per previous line.reader.setFeature(";, false); reader.setFeature(";, false);reader.setFeature(";, false);
SAXReader

保护Java org.dom4j.io. SAXReader不受XXE影响

saxReader.setFeature(";, true);saxReader.setFeature(";, false);saxReader.setFeature(";, false);

根据测试,如果您缺少其中之一,您仍然容易受到XXE攻击。

SAXBuilder

保护Java org.jdom2.input.SAXBuilder 免受XXE影响:

SAXBuilder builder = new SAXBuilder();builder.setFeature(";,true);builder.setFeature(";, false);builder.setFeature(";, false);Document doc = builder.build(new File(fileName));
No-op EntityResolver

对于接受EntityResolver的api,你可以通过实现一个no-op来抵消XML解析器解析实体的能力:

public final class NoOpEntityResolver implements EntityResolver {    public InputSource resolveEntity(String publicId, String systemId) {        return new InputSource(new StringReader(""));    }}xmlReader.setEntityResolver(new NoOpEntityResolver());documentBuilder.setEntityResolver(new NoOpEntityResolver());
JAXB Unmarshaller

由于javax.xml.bind.Unmarshaller解析XML,并且不支持禁用XXE的任何标志,因此必须首先通过可配置的安全解析器解析不受信任的XML,生成一个源对象,并将源对象传递给解组器。例如:

//Disable XXESAXParserFactory spf = SAXParserFactory.newInstance();spf.setFeature(";, false);spf.setFeature(";, false);spf.setFeature(";, false);//Do unmarshall operationSource xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(),                                 new InputSource(new StringReader(xml)));JAXBContext jc = JAXBContext.newInstance(Object.class);Unmarshaller um = jc.createUnmarshaller();um.unmarshal(xmlSource);
XPathExpression

xpathexpression类似于Unmarshaller,无法通过它自身的配置来达到安全目的,因此必须首先通过另一个安全的XML解析器解析不受信任的数据。

例如:

DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();df.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");df.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");DocumentBuilder builder = df.newDocumentBuilder();String result = new XPathExpression().evaluate( builder.parse(                            new ByteArrayInputStream(xml.getBytes())) );
java.beans.XMLDecoder

这个类中的readObject()方法基本上是不安全的。它所解析的XML不仅会导致XXE,而且该方法还可用于构造任何Java对象,并执行此处所述的任意代码。重要的是,除了信任或正确验证传入该类的输入外,没有任何方法可以安全使用该类。因此,我们强烈建议避免使用这个类,并将其替换为安全或正确配置的XML解析器。

Other XML Parsers

有许多第三方库直接或通过使用其他库解析XML。请测试并验证他们的XML解析器默认情况下能抵抗XXE攻击。如果解析器在默认情况下不安全,请查找解析器支持的标志以禁用所有可能的外部资源包含,如上面给出的示例。如果没有向外部公开控件,首先请确保通过安全解析器传递不受信任的内容,然后将其传递给不安全的第三方解析器,这与Unmarshaller的安全方式类似。

Spring Framework MVC/OXM XXE Vulnerabilities

例如,在Spring OXM和Spring MVC中发现了一些XXE漏洞。以下版本的Spring Framework易受XXE攻击:

3.0.0 to 3.2.3 (Spring OXM & Spring MVC)4.0.0.M1 (Spring OXM)4.0.0.M1-4.0.0.M2 (Spring MVC)

还有其他一些问题后来也被修复了,所以为了完全解决这些问题,Spring建议您升级到Spring Framework 3.2.8+或4.0.2+。

对于Spring OXM,这指的是使用org.springframework.oxm.jaxb.Jaxb2Marshaller。请注意,Spring OXM的CVE特别指出,有两种XML解析情况由开发人员来处理,其中两种是Spring的责任,并发布了补丁来解决这个CVE漏洞。

他们是这么说的:

开发者必须处理两种情况:

对于DOMSource, XML已经被用户代码解析过,用户自己的代码负责防止XXE。对于StAXSource, XMLStreamReader已经由用户代码创建,用户自己的代码负责防止XXE。

Spring修复的问题:

对于SAXSource和StreamSource实例,Spring默认情况下处理外部实体,因此产生了此漏洞。

下面是一个使用易受攻击的StreamSource的例子,但如果你使用的是Spring OXM或Spring MVC的最新版本,那么现在是安全的,:

import org.springframework.oxm.Jaxb2Marshaller;import org.springframework.oxm.jaxb.Jaxb2Marshaller;Jaxb2Marshaller marshaller = new Jaxb2Marshaller();// Must cast return Object to whatever type you are unmarshallingmarshaller.unmarshal(new StreamSource(new StringReader(some_string_containing_XML));

因此,根据Spring OXM CVE的记录,以上内容现在是安全的。但是如果您要使用DOMSource或StAXSource,那么将由您来配置这些源,使其免受XXE的威胁。

标签: #apachejaxpjar