IPBUF安全漏洞报告
English
CVE-2020-37168 CVSS 9.8 严重

CVE-2020-37168 Systempay弱加密密钥爆破漏洞

披露日期: 2026-05-13

漏洞信息

漏洞编号
CVE-2020-37168
漏洞类型
加密问题
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Ecommerce Systempay

相关标签

弱加密暴力破解支付系统签名伪造CVE-2020-37168

漏洞概述

Ecommerce Systempay 1.0支付系统存在严重的弱加密实现漏洞,主要涉及支付签名生成机制的安全性不足。攻击者能够通过网络流量截获支付表单数据及其对应的SHA1签名。利用该漏洞,攻击者可以实施暴力破解攻击,逐一测试密钥候选者以还原用于签名的16位生产密钥。一旦密钥被成功破解,攻击者即可伪造合法的支付签名,恶意篡改交易金额,对电商平台的资金安全构成极大威胁。

技术细节

该漏洞源于Ecommerce Systempay 1.0在支付验证环节采用了不够健壮的加密策略。系统依赖一个仅16位字符的生产密钥来计算支付参数的SHA1哈希值作为签名。由于密钥空间相对狭窄,且缺乏针对暴力破解的有效防护机制(如速率限制或复杂的密钥派生函数),攻击者能够利用离线攻击方式破解密钥。具体利用过程如下:首先,攻击者捕获客户端向支付网关发送的POST请求数据包,从中提取出所有明文参数(如金额、订单号等)以及服务端返回的签名字段。接着,攻击者在本地编写脚本,遍历所有可能的16字符密钥组合,对明文参数进行SHA1运算,并将计算结果与截获的签名进行比对。当哈希值匹配时,即表明找到了正确的生产密钥。随后,攻击者便可以任意修改交易参数(例如将100元改为0.01元),利用还原出的密钥重新生成签名,从而构造出看似合法的欺诈性支付请求。

攻击链分析

STEP 1
步骤1:信息收集
攻击者监听网络流量或诱导用户发起支付,捕获发送至支付网关的HTTP POST请求,提取其中的明文表单数据(如金额)和签名值。
STEP 2
步骤2:密钥破解
攻击者编写脚本,利用已知的数据和签名,在本地进行暴力破解。通过不断生成16字符密钥并计算SHA1哈希值,与截获的签名进行比对,直至找到匹配的生产密钥。
STEP 3
步骤3:伪造请求
利用破解出的生产密钥,攻击者修改交易参数(例如大幅降低订单金额),并使用该密钥对修改后的参数重新生成合法的支付签名。
STEP 4
步骤4:执行攻击
攻击者将构造好的包含恶意参数和合法签名的伪造请求发送给支付网关。由于签名验证通过,系统误认为该请求合法,从而完成欺诈交易。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import hashlib import itertools # Target signature captured from the POST request target_signature = "a1b2c3d4e5f6g7h8i9j0" # Data extracted from the payment form data_fields = "amount=100&currency=USD&transaction_id=123456" # Function to generate a candidate key def generate_keys(charset, length): for candidate in itertools.product(charset, repeat=length): yield ''.join(candidate) # Brute force logic charset = 'abcdefghijklmnopqrstuvwxyz0123456789' # Example charset key_length = 16 print("Starting brute force attack...") for key in generate_keys(charset, key_length): # Construct the string to hash (algorithm depends on implementation) # Assuming format: key + data string_to_hash = key + data_fields # Calculate SHA1 hash hashed_signature = hashlib.sha1(string_to_hash.encode('utf-8')).hexdigest() # Compare with the target signature if hashed_signature == target_signature: print(f"[+] Key found: {key}") break else: print("[-] Key not found in this charset.")

影响范围

Ecommerce Systempay 1.0

防御指南

临时缓解措施
在无法立即升级系统的情况下,建议立即重置所有支付密钥,并密切监控交易日志中的异常金额变动或高频失败的签名验证请求。可以通过网络层配置限制对支付接口的外部访问来源,但这仅作为临时手段,根本解决仍需修补加密算法缺陷。

参考链接