Razorpay二维码IDOR漏洞深度剖析

本文详细分析了Razorpay支付平台存在的IDOR漏洞,攻击者可通过公开的二维码ID获取敏感客户支付数据。文章包含漏洞原理、复现步骤、厂商响应及安全启示,揭示了依赖"秘密标识符"的设计缺陷。

QR Code IDOR Vulnerability in Razorpay

漏洞概述

本文讲述我在Razorpay二维码支付系统中发现的IDOR(不安全的直接对象引用)漏洞,该漏洞已通过HackerOne平台报告。本文旨在分享发现过程、记录技术细节,并听取安全社区对漏洞分类的意见。

漏洞详情

Razorpay API端点:

1
GET /merchant/api/live/payments/qr_codes/{qr_id}/payments

当传入有效的qr_id时,该端点返回敏感的客户支付详情(UPI ID、账户标识符、时间戳、交易历史)。这意味着:只要拥有qr_id,攻击者无需授权即可获取客户交易数据。

qr_id获取方式

公开暴露:二维码本应由商户公开分享(如在YouTube演示中展示)。

OSINT存档:通过Wayback Machine,我发现了包含有效qr_id值的Razorpay仪表板页面存档。这表明qr_id并不像声称的那样保密,一旦暴露即可被攻击者滥用。

漏洞复现

  1. 从公开分享的二维码或Razorpay存档页面获取qr_id
  2. 调用API端点:GET /merchant/api/live/payments/qr_codes/{qr_id}/payments
  3. API返回包含多个客户支付详情的JSON数据:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "id": "redacted",
  "entity": "payment",
  "amount": 1000,
  "currency": "INR",
  "status": "captured",
  "method": "upi",
  "vpa": "redacted@ybl",
  "email": "redacted",
  "contact": "redacted",
  "created_at": 1726534884
}

这明确证明了存在信息泄露的IDOR漏洞。

Razorpay响应

Razorpay确认了该问题并部署修复(端点现在返回错误):

1
{"status_code":400,"success":false,"errors":["The id provided does not exist"]}

但经过审查后,他们在HackerOne上将报告关闭并标记为"信息类"。其理由是:

  • qr_id是高熵标识符,本应保持机密
  • 商户有责任保护qr_id
  • 基于OSINT/Wayback的发现不在其项目范围内

我的观点

虽然尊重他们的立场,但我认为严重性更高:

  • 设计缺陷而非商户错误:二维码本质是公开的,依赖qr_id保密性是薄弱设计
  • 敏感数据泄露:直接暴露客户支付详情,而不仅是元数据
  • 现实可发现性:Wayback Machine中的存档页面暴露了有效ID,这并非暴力破解而是OSINT
  • 已部署修复:如果真是"信息类",本无需修补

经验教训

研究人员:始终检查范围规则——某些项目排除OSINT或第三方存档 组织:当标识值可能被自然分享或存档时,不要依赖"秘密"标识符 社区:信息类与中等严重性之间存在灰色地带,实际利用风险很重要

最终思考

本报告通过HackerOne负责任地提交,Razorpay修复了漏洞,这最终是积极结果。但被分类为信息类引发重要问题:当通过IDOR可能暴露敏感客户数据时,基于OSINT的复现是否应排除其影响力?

我很想听听其他研究人员的想法:这真是信息类漏洞,还是更接近中等/高严重性问题?

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计