启用XML eXternal Entity(XXE)后,可以创建恶意XML(如下所示)并读取计算机上任意文件的内容。 XXE攻击是OWASP十大漏洞的一部分,这并不奇怪。JavaXML库特别容易受到XXE注入的攻击,因为大多数XML解析器默认情况下都启用了外部实体。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE bar [
<!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<song>
<artist> &xxe; </artist>
<title> Bohemian Rhapsody </title>
<album> A Night at the Opera </album>
</song>
如下所示,DefaultHandler和Java SAX解析器的简单实现实现了对该XML文件的解析并显示了passwd文件的内容。 这里以Java SAX解析器案例为主要示例,但其他解析器(如DocumentBuilder和DOM4J)具有类似的默认行为。
SAXParserFactory factory = SAXParserFactory . newInstance ();
SAXParser saxParser = factory . newSAXParser ();
DefaultHandler handler = new DefaultHandler () {
public void startElement ( String uri , String localName , String qName , Attributes attributes ) throws SAXException {
System . out . println ( qName );
}
public void characters ( char ch [], int start , int length ) throws SAXException {
System . out . println ( new String ( ch , start , length ));
}
};
更改默认设置以分别禁止xerces1或xerces2的外部实体和doctype可以防止此类攻击。
...
SAXParserFactory factory = SAXParserFactory . newInstance ();
SAXParser saxParser = factory . newSAXParser ();
factory . setFeature ( "https://xml.org/sax/features/external-general-entities" , false );
saxParser . getXMLReader (). setFeature ( "https://xml.org/sax/features/external-general-entities" , false );
factory . setFeature ( "https://apache.org/xml/features/disallow-doctype-decl" , true );
...
有关防止恶意XXE注入的更多动手信息,请查看OWASP XXE备忘单
这只是10个Java安全最佳实践中的1个。 看一看完整的10页和易于打印的一页纸
From: https://dev.to/brianverm/configure-your-java-xml-parsers-to-prevent-xxe-213c