前两周我们搞明白了XXE漏洞在Java语言中的深层原理,以及错误修复方案为何无法防御XXE的原理。今天我们来解决最后一个问题: Java中如何正确防御XXE,同时它为何能防御呢?
OWASP推荐的修复代码如下,号称是可以防御几乎所有XXE攻击!今天我们来深入研究下它为何可以防御XXE漏洞。
0x01
测试代码
同时使用以下命令,在本地启动一个监听1664端口的Web服务器,用于检测XXE漏洞是否被触发了。
python -m SimpleHTTPServer 1664
0x02
原理分析
在测试代码dbf.setFeature(...);处打断点,开始调式跟踪。
dbf.setFeature()方法会调用多个对象的setFeature()方法,最终到达XMLDocumentScannerImpl对象setFeature()方法,调用链如下:
在XMLDocumentScannerImpl.setFeature()中,将fDisallowDoctype属性设置为了true。
在这些XML解析器完成设置后,解析器会调用XMLDocumentScannerImpl.scanDocument()对XML的文档进行扫描。在解析器读到DOCTYPE字符串时,扫描状态会被设置为SCANNER_STATE_DOCTYPE。解析器会进入SCANNER_STATE_DOCTYPE阶段。
该阶段会首先判断fDisallowDoctype的值,由上面的跟踪可知fDisallowDoctype已经被改为true,所以会调用reportFatalError()方法,输出致命错误报告并向上抛出解析异常。
异常会被抛到XML11Configuration.parse()中处理。处理的结果是fParseInProgress变量被设置为了false,接着会调用cleanup()方法在完全解析XML文档之前终止解析,释放解析期间分配的任何资源。所以程序不会运行到漏洞触发处。
最终运行结果如下,Web服务器也并未收到Http请求。
0x03
参考文章
-
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
本文始发于微信公众号(回忆飘如雪):【第5周】Java XXE漏洞正确修复方法及原理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论