Java XXE漏洞正确修复方法及原理

  • A+
所属分类:gv7.me

前两周我们搞明白了XXE漏洞在Java语言中的深层原理,以及错误修复方案为何无法防御XXE的原理。今天我们来解决最后一个问题: Java中如何正确防御XXE,同时它为何能防御呢?

OWASP推荐的修复代码如下,号称是可以防御几乎所有XXE攻击!今天我们来深入研究下它为何可以防御XXE漏洞。

1
2
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

0x01 测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class DOMXXEFix {
public static void main(String[] args) throws ParserConfigurationException,SAXException,Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
DocumentBuilder db = dbf.newDocumentBuilder();
String str = " n" +
"n" +
"]>&xxe;";
InputStream is = new ByteArrayInputStream(str.getBytes());
Document doc = db.parse(is);
}
}

同时使用以下命令,在本地启动一个监听1664端口的Web服务器,用于检测XXE漏洞是否被触发了。

1
python -m SimpleHTTPServer 1664

0x02 原理分析

在测试代码dbf.setFeature(...);处打断点,开始调式跟踪。

dbf.setFeature()方法会调用多个对象的setFeature()方法,最终到达XMLDocumentScannerImpl对象setFeature()方法,调用链如下:

Java XXE漏洞正确修复方法及原理

在XMLDocumentScannerImpl.setFeature()中,将fDisallowDoctype属性设置为了true

Java XXE漏洞正确修复方法及原理

在这些XML解析器完成设置后,解析器会调用XMLDocumentScannerImpl.scanDocument()对XML的文档进行扫描。在解析器读到DOCTYPE字符串时,扫描状态会被设置为SCANNER_STATE_DOCTYPE。解析器会进入SCANNER_STATE_DOCTYPE阶段。

Java XXE漏洞正确修复方法及原理

该阶段会首先判断fDisallowDoctype的值,由上面的跟踪可知fDisallowDoctype已经被改为true,所以会调用reportFatalError()方法,输出致命错误报告并向上抛出解析异常。

Java XXE漏洞正确修复方法及原理

异常会被抛到XML11Configuration.parse()中处理。处理的结果是fParseInProgress变量被设置为了false,接着会调用cleanup()方法在完全解析XML文档之前终止解析,释放解析期间分配的任何资源。所以程序不会运行到漏洞触发处。

Java XXE漏洞正确修复方法及原理

最终运行结果如下,Web服务器也并未收到Http请求。

Java XXE漏洞正确修复方法及原理

0x03 参考文章

文章来源于gv7.me:Java XXE漏洞正确修复方法及原理

相关推荐: 10分钟总结所有类型SQL注入

最近在给公司内部培训sql注入。其实很头疼,毕竟sql注入谁都知道,没有什么好讲的。于是一直在思考,这方面我能给大家带来什么干货。毕竟我也不想所有人浪费2个小时听我讲这些已经知道的东西。后来想想也许对于大家来说都知道sql注入,也都了解其原理。但是大家也许并没…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: