7月3日,微信支付爆出存在嚴重安(ān)全漏洞,可(kě)能(néng)導緻商(shāng)戶服務(wù)器被入侵。
問題重現
public static void test() {
String xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE xdsec[<!ELEMENT methodname ANY><!ENTITY xxe SYSTEM \"file:///c:/windows/win.ini\">]><methodcall><methodname>&xxe;</methodname></methodcall>";
try {
System.out.println(xmlStr);
System.out.println("+++++++++++++++++");
Map<String, String> hm = WxPayTool.xmlToMap(xmlStr);
System.out.println("+++++++++++++++++");
System.out.println(hm);
} catch (Exception e) {
e.printStackTrace();
}
}
xmlToMap方法對應sdk中(zhōng)xmlToMap方法。
運行測試代碼,可(kě)以發現本地文(wén)件被輸出。
上面隻是問題的簡單定位,雖然攻擊者不太可(kě)能(néng)知道微信通知的url,而且實際項目中(zhōng)一般不會将内容直接輸出,但是攻擊者仍然可(kě)以執行其他(tā)命名(míng)或者通過其他(tā)方式獲取到服務(wù)器上文(wén)件或目錄,因此應當盡快修複該問題。
修複方案
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true); //防止可(kě)能(néng)的SSRF
documentBuilderFactory.setXIncludeAware(false);
documentBuilderFactory.setExpandEntityReferences(false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
InputStream stream = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
- 版權所有(yǒu):奇站網絡 轉載請注明出處
- 廈門奇站網絡科(kē)技(jì )有(yǒu)限公(gōng)司,專業提供網站建設,響應式網站建設,小(xiǎo)程序開發,系統定制開發。
- 軟件開發咨詢熱線(xiàn):吳小(xiǎo)姐 13313868605