java 安全 支付_微信支付Java SDK XXE漏洞实战浅析

微信支付SDK JAVA版今天曝出了XXE漏洞,主要原因是在使用DOM处理回传的XML格式的支付结果通知时,未禁用外部实体、参数实体、内联DTD等,导致存在XXE漏洞。

0x01 原理分析

作者原文分析提到在看微信支付JAVA SDK的说明文档时,发现了结果通知代码示例:

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 = new MyConfig();

WXPay wxpay = new WXPay(config);

Map notifyMap = WXPayUtil.xmlToMap(notifyData); // 转换成map

if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {

// 签名正确

// 进行处理。

// 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户侧订单状态从退款改成支付成功

}

else {

// 签名错误,如果数据里没有sign字段,也认为是签名错误

}

}

}

其中notifyData是攻击者可控的,再看微信支付JAVA SDK中的WXPayUtil.xmlToMap()方法,代码片段如下:

public class WXPayUtil {

/**

* XML格式字符串转换为Map

*

* @param strXML XML字符串

* @return XML数据转换后的Map

* @throws Exception

*/

public static Map xmlToMap(String strXML) throws Exception {

try {

Map data = new HashMap();

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

//未使用setFeature()方法来禁用外部实体、参数实体、内联DTD等。

DocumentBuilder documentBuilder = documentBuilderF

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值