关于XML解析存在的安全问题记录

前段时间被爆出微信支付sdk漏洞,吓得赶紧去项目里看了下微信的SDK(虽然没多少人使用),发现使用的微信sdk不是当前发布的最新的SDK,也就没有使用下面的DocumentBuilderFactory来解析xml,其实不仅是微信的SDK,所有使用xml的地方都需要注意。

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

先说一下使用这个的怎么修复吧,很简单加入一句代码就行,如下:

documentBuilderFactory.setExpandEntityReferences(false);

然后我发现我的项目里没有使用DocumentBuilderFactory,但是有一个SAXBuilder,代码如下:

SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);

那这个SAXBuilder是什么呢,用这个会不会也有漏洞呢?

看了下SAXBuilder源码英文不好就不乱说了,百度到的解释:SAXBuilder是一个JDOM解析器,能将路径中的XML文件解析为Document对象,看到这是不是明白了,这也有可能会导致XXE漏洞(XML外部实体注入漏洞)。

系统能够接收并解析用户的xml,在xml未禁用DTD、Entity时,可能导致命令执行漏洞的发生。所以Java解析xml的常用第三方库,如果不禁用DTD、Entity都会导致XXE漏洞。下面是一些常用的第三方库

javax.xml.stream.XMLStreamReader;

javax.xml.parsers.DocumentBuilderFactory;

org.dom4j.io.SAXReader;

org.xml.sax.helpers.XMLReaderFactory;

javax.xml.parsers.SAXParser;

javax.xml.parsers.DocumentBuilder;

org.jdom.input.SAXBuilder;

org.dom4j.DocumentHelper;

org.jdom.output.XMLOutputter;

那如何解决这个漏洞呢,参考了一下微信官方文档的提示和一些资料,需要加入以下代码:

SAXBuilder builder = new SAXBuilder();

//下面是添加的代码
String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
builder.setFeature(FEATURE, true);

FEATURE = "http://xml.org/sax/features/external-general-entities";
builder.setFeature(FEATURE, false);

FEATURE = "http://xml.org/sax/features/external-parameter-entities";
builder.setFeature(FEATURE, false);

FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
builder.setFeature(FEATURE, false);

然后就可以了

 

参考文章

微信官方文档  https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5
小谷先生的文章中的Java解析XML的常用三方库  https://www.jianshu.com/p/960f0b4629b3

你可能感兴趣的:(支付)