类型: 安全缺陷
XML作为一种使用较为广泛的数据传输格式,很多应用程序都包含有处理XML数据的代码,默认情况下,许多过时的或配置不当的 XML处理器都会对外部实体进行引用。如果攻击者可以上传 XML文档或者在 XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,就能够攻击包含缺陷的XML处理器,从而造成拒绝服务攻击或者程序崩溃。
private static void receiveXMLStream(InputStream inStream){
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser;
try {
saxParser = factory.newSAXParser();
saxParser.parse(inStream,new DefaultHandler());
...
} catch (ParserConfigurationException e) {
...
} catch (SAXException e) {
...
} catch (IOException e) {
...
}
}
private static void receiveXMLStream(InputStream stream){
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder;
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
documentBuilder.parse(stream);
...
} catch (ParserConfigurationException e) {
...
} catch (SAXException e) {
...
} catch (IOException e) {
...
}
}
当使用不可信数据来源作为文件输入流时
String fileName = request.getParameter("filename");
receiveXMLStream(new FileInputStream(fileName));
如果evil.xml文件中包含以下文本
<?xml version="1.0"?>
<!DOCTYPE foo SYSTEM "file:/dev/tty">
<foo>bar</foo>
SAX或者DOM解析器会尝试访问在SYSTEM属性中标识的URL,这意味着它将读取本地/dev/tty文件的内容。在POSIX系统中,读取这个文件会导致程序阻塞,直到可以通过计算机控制台得到输入数据为止。这样,攻击者可以使用这个恶意的XML文件来导致系统挂起,程序会受到XML外部实体注入攻击。