關於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章