Skip to content

【安全漏洞】CWE-295: 微信支付 API TLS 证书验证完全禁用 — 支付凭据可被中间人窃取 #176

Description

@LeoWSY-hashblue

Title: 【安全漏洞】CWE-295: 微信支付 API TLS 证书验证完全禁用 — 支付凭据可被中间人窃取


漏洞概述

CWE-295: Improper Certificate Validation
严重程度: 🔴 CRITICAL (CVSS 8.1)

OpenShare 的微信支付模块 (pay.php) 在调用微信统一下单 API 时,完全禁用了 TLS 证书验证和主机名验证。支付相关数据(商户号、订单金额、商品描述、回调地址)通过未经验证的 HTTPS 连接发送到 api.mch.weixin.qq.com

受影响代码

文件: pay.php:99-109

$opts = array(
    'http' => array(
        'method'  => 'POST',
        'header'  => 'Content-type: text/xml',
        'content' => $xml
    ),
    "ssl" => array(
        "verify_peer"      => false,    // ← 证书验证已禁用
        "verify_peer_name" => false,    // ← 主机名验证已禁用
    )
);
$context = stream_context_create($opts);
$result = file_get_contents(
    'https://api.mch.weixin.qq.com/pay/unifiedorder',
    false,
    $context
);

数据流分析

以下数据通过未验证 TLS 传输到微信支付 API:

  • appid — 微信支付应用 ID
  • mch_id — 商户号
  • sign — 使用商户 API 密钥生成的 MD5/SHA256 签名
  • body — 商品/订单描述
  • out_trade_no — 商户订单号
  • total_fee — 交易金额
  • notify_url — 支付结果回调地址

攻击场景

具备网络中间人(MITM)定位的攻击者可以:

  1. 窃取支付信息 — 捕获所有订单详情和商户信息
  2. 篡改交易金额 — 修改 total_fee 字段
  3. 劫持支付回调 — 修改 notify_url 指向攻击者服务器
  4. 伪造支付确认 — 冒充微信支付返回虚假的支付成功响应

修复方案

"ssl" => array(
    "verify_peer"      => true,
    "verify_peer_name" => true,
    // 如需指定 CA 证书包:
    // "cafile" => "/path/to/cacert.pem",
)

PHP 默认的 CA 证书包路径通常为:

  • Linux: /etc/ssl/certs/ca-certificates.crt
  • 或通过 php.ini 中的 openssl.cafile 配置

影响范围

OpenShare 是一个被广泛使用的中国社交媒体集成 SDK(3,619 stars),涵盖:

  • 微信支付统一下单
  • 微信/QQ/微博社交登录
  • 支付宝支付集成
  • 各主流平台社交分享

发现信息

  • 日期: 2026-06-18
  • 方法: GitHub Code Search: verify_peer false stream_context_create language:PHP
  • CWE: CWE-295

备注

本项目最后更新为 2018 年 9 月,距今已近 8 年无维护。建议下游用户:

  1. 自行修改 pay.php 中的 TLS 配置
  2. 考虑迁移至官方微信支付 SDK
  3. 关注 CVE 分配进度(将通过 GitHub Security Advisory 申请)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions