【问题标题】:TransformerFactory still vulnerable to XXE attacksTransformerFactory 仍然容易受到 XXE 攻击
【发布时间】:2020-11-27 05:52:11
【问题描述】:

我有一个类似下面的方法。我已将 FEATURE_SECURE_PROCESSING 设置为 true。

    public String getString(org.w3c.dom.Node node) throws TransformerException {
        StringWriter writer = new StringWriter();
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(node), new StreamResult(writer));

        return writer.toString();
    }

当我在下面运行我的单元测试时,我可以列出项目目录下的文件,这意味着它容易受到 XXE 攻击。

    @Test
    public void test() throws Exception {
        String dir = new File("").getAbsolutePath();
        String xml =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                        "<!DOCTYPE test[" +
                        "<!ENTITY problemEntity SYSTEM \"" + dir + "\">" +
                        "]>" +
                        "<Response>" +
                        "&problemEntity;" +
                        "</Response>";

        org.w3c.dom.Element node = DocumentBuilderFactory
                .newInstance()
                .newDocumentBuilder()
                .parse(new ByteArrayInputStream(xml.getBytes()))
                .getDocumentElement();

        String name = getString(node);
        System.out.println(name);
    }

如何保护 TransformerFactory 免受此类攻击?

【问题讨论】:

    标签: java xml dom4j xxe


    【解决方案1】:

    您正在向TransformerFactory 提供DOMSource,因此在TransformerFactory 存在之前处理了DTD。您需要在解析 XML 文档时应用任何控件,也就是创建 DOM 节点时。

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 2018-11-15
      • 2015-12-31
      • 1970-01-01
      • 2014-02-19
      • 2016-04-29
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多