类型: 安全缺陷

    XML作为一种使用较为广泛的数据传输格式,很多应用程序都包含有处理XML数据的代码,默认情况下,许多过时的或配置不当的 XML处理器都会对外部实体进行引用。如果攻击者可以上传 XML文档或者在 XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,就能够攻击包含缺陷的XML处理器,从而造成拒绝服务攻击或者程序崩溃。

    1. private static void receiveXMLStream(InputStream inStream){
    2. SAXParserFactory factory = SAXParserFactory.newInstance();
    3. SAXParser saxParser;
    4. try {
    5. saxParser = factory.newSAXParser();
    6. saxParser.parse(inStream,new DefaultHandler());
    7. ...
    8. } catch (ParserConfigurationException e) {
    9. ...
    10. } catch (SAXException e) {
    11. ...
    12. } catch (IOException e) {
    13. ...
    14. }
    15. }
    1. private static void receiveXMLStream(InputStream stream){
    2. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    3. DocumentBuilder documentBuilder;
    4. try {
    5. documentBuilder = documentBuilderFactory.newDocumentBuilder();
    6. documentBuilder.parse(stream);
    7. ...
    8. } catch (ParserConfigurationException e) {
    9. ...
    10. } catch (SAXException e) {
    11. ...
    12. } catch (IOException e) {
    13. ...
    14. }
    15. }

    当使用不可信数据来源作为文件输入流时

    1. String fileName = request.getParameter("filename");
    2. receiveXMLStream(new FileInputStream(fileName));

    如果evil.xml文件中包含以下文本

    1. <?xml version="1.0"?>
    2. <!DOCTYPE foo SYSTEM "file:/dev/tty">
    3. <foo>bar</foo>

    SAX或者DOM解析器会尝试访问在SYSTEM属性中标识的URL,这意味着它将读取本地/dev/tty文件的内容。在POSIX系统中,读取这个文件会导致程序阻塞,直到可以通过计算机控制台得到输入数据为止。这样,攻击者可以使用这个恶意的XML文件来导致系统挂起,程序会受到XML外部实体注入攻击。