Tag:XXE

Tag (XXE)'s result:

微信支付流程及其XXE漏洞

0x00 概述 7月4日,网上爆出微信支付sdk存在xxe漏洞,原因是商户用来获取微信支付结果的notify_url接口可以接受XML数据,而且未禁用外部实体,利用该漏洞可以读取支付服务器文件,甚至可能获取商户key实现0元支付。   0x01 微信支付流程 以微信公众号支付为例,其他支付方式大同小异 基本流程: 1.商户后台携带支付数据调用微信统一下单api:https://api.mch.weixin.qq.com/pay/unifiedorder获取prepay_id。 2.调起微信支付内置js,点支付输密码,支付成功(微信客户端与微信服务器交互)。 3.微信服务器向notify_url(回调地址)返回支付结果通知给商户后台(须验签),这一步才是最终交易成功。 微信支付签名算法://—–来自https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3————————— 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 特别注意以下重要规则: ◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 ◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置 //—————————————————————————————————————————-   0x01 微信支付XXE漏洞 此漏洞发生在上述支付流程第三步,攻击者向notify_url发送恶意xml数据,形成xxe,可能获取key达到0元支付的效果。 漏洞文件: WXPayUtil.java:38 关键代码: public static Map<String, String> xmlToMap(String strXML) throws Exception { try { Map<String, String> data = new HashMap<String, String>(); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); InputStream stream = new ByteArrayInputStream(strXML.getBytes( “UTF-8”)); org.w3c.dom.Document doc = documentBuilder.parse(stream); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getDocumentElement().getChildNodes(); for (int idx = 0; idx < nodeList.getLength(); ++idx) { Node node = nodeList.item(idx); if (node.getNodeType() == Node.ELEMENT_NODE) { org.w3c.dom.Element element = (org.w3c.dom.Element) node ; data.put(element.getNodeName(), element.getTextContent ()); } } try { stream.close(); } catch (Exception ex) { // do nothing } return data; } catch (Exception ex) { WXPayUtil.getLogger().warn(“Invalid XML, can not convert to map. Error message: {}. XML content: {}”, ex.getMessage(), strXML); throw ex; } } ] 解析xml没有禁用外部实体…… 收到支付结果通知的官方demo: 收到支付结果通知时,需要验证签名,可以这样做: “`java import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayUtil; import java.util.Map; public class WXPayExample { public static void main(String[] args) throws Exception { String notifyData = “….”; // 支付结果通知的xml格式数据 MyConfig config =……

一文熟悉XXE

0x00 概述 XXE(XML External Entity attack),即外部实体注入,攻击利用xml作为数据交换的功能点,较为少见,但是威力巨大。 0x01 危害 任意文件读取,如/etc/passwd 命令执行(expect://id) 内网端口探测 攻击内网网站(struts2) DOS(billion laughs)   0x02 前置知识 XML: 一种允许用户对自己的标记语言进行定义的源语言。 文档结构包括: 1.XML声明: <?xml version=”1.0″?> 2.DTD文档类型定义(可选) DTD 可以在 XML 文档内声明,也可以外部声明。 内部声明: <?xml version=”1.0″?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don’t forget the meeting!</body> </note> 外部声明: <?xml version=”1.0″?> <!DOCTYPE note SYSTEM “note.dtd”> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don’t forget the meeting!</body> </note> note.dtd: <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> 很像css的内部样式和外部样式。 dtd实体用于定义引用普通文本或特殊字符的快捷方式的变量。 分为一般实体和参数实体。 一般实体:<!ENTITY 实体名 “实体内容“> &实体名 参数实体:<!ENTITY % 实体名 “实体内容“> %实体名   内部实体声明: <?xml version=”1.0″?> <!DOCTYPE test [ <!ENTITY writer “Bill Gates”> <!ENTITY copyright “Copyright W3School.com.cn”> ]> <test>&writer;&copyright;</test> 外部实体声明: <?xml version=”1.0″?> <!DOCTYPE test [ <!ENTITY writer SYSTEM “http://www.w3school.com.cn/dtd/entities.dtd”> <!ENTITY copyright SYSTEM “http://www.w3school.com.cn/dtd/entities.dtd”> ]> <author>&writer;©right;</author> 3.文档元素 <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don’t forget the meeting!</body> </note> 0x02 原理分析 有回显: 测试代码: //测试代码来源 //www.mottoin.com/wp-content/uploads/2016/11/xxe.txt <?php # Enable the ability to load external entities libxml_disable_entity_loader (false); $xmlfile = file_get_contents(‘php://input’); $dom = new DOMDocument(); # http://hublog.hubmed.org/archives/001854.html # LIBXML_NOENT: 将 XML 中的实体引用 替换 成对应的值 # LIBXML_DTDLOAD: 加载 DOCTYPE 中的 DTD 文件 $dom->loadXML($xmlfile,……