前段時間被爆出微信支付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