挖洞经验 | PayPal验证码质询功能(reCAPTCHA Challenge)存在的用户密码泄露漏洞
字数 1472 2025-08-18 11:39:15
PayPal验证码质询功能用户密码泄露漏洞分析报告
漏洞概述
2020年初,安全研究员Alex Birsan发现PayPal登录界面的验证码质询功能(reCAPTCHA Challenge)存在严重漏洞,攻击者可通过特定方式获取受害者的注册邮箱和明文密码。该漏洞最终获得PayPal官方$15,300的奖励,并被评定为CVSS 8.0高危漏洞。
漏洞发现过程
初始发现
研究员在分析PayPal的验证机制时,发现recaptchav3.js文件中包含两个敏感参数:
_csrf:CSRF令牌_sessionID:会话ID
这些参数出现在JavaScript文件中,存在被跨站脚本包含(XSSI)攻击窃取的风险。
验证测试
初步测试证实了XSSI漏洞的存在:
- 虽然每次请求都会使用混淆方法随机化变量名
- 但敏感的用户token仍会出现在预期位置
- 通过精心构造的攻击可提取这些信息
深入分析
参数用途调查
研究员对_csrf和_sessionID进行了深入分析:
- 尝试替换
_csrf值,发现无法实现经典CSRF攻击 - 尝试替换
_sessionID,发现无法冒充受害者身份
验证码质询机制分析
PayPal为防止暴力破解,在多次登录失败后会触发验证码质询(reCAPTCHA challenge):
- 用户需完成Google验证码验证
- 验证后会向
/auth/validatecaptcha发送POST请求
请求示例:
POST /auth/validatecaptcha HTTP/1.1
Host: www.paypal.com
Content-Type: application/x-www-form-urlencoded
_csrf=[CSRF_TOKEN]&_sessionID=[SESSION_ID]&jse=[JSE_VALUE]&captcha=[CAPTCHA_TOKEN]
关键漏洞点
验证码质询响应中包含自动提交表单,其中泄露了:
- 用户最新登录请求输入的所有数据
- 包括注册邮箱
- 明文密码
响应示例(解析后HTML):
<form ...>
<input type="hidden" name="email" value="victim@example.com">
<input type="hidden" name="password" value="plaintextpassword">
...
</form>
参数安全性分析
jse参数:实际未起到验证作用captcha参数:Google提供的验证码token,与特定用户会话无关,接受任何有效输入token
漏洞利用方法
攻击步骤
-
信息收集阶段:
- 利用XSSI漏洞获取受害者会话中的
_csrf和_sessionID
- 利用XSSI漏洞获取受害者会话中的
-
触发验证码质询:
- 使用获取的token向
/auth/validatecaptcha发起POST请求 - 模拟暴力破解尝试以触发验证码机制
- 使用获取的token向
-
窃取凭证:
- 当受害者成功登录后
- 质询响应中包含邮箱和明文密码
- 攻击者通过恶意页面获取这些信息
扩展攻击面
该漏洞不仅存在于登录框架,还存在于:
- 未经用户授权的支付页面
- 可获取用户的敏感支付数据
漏洞时间线
- 2019.11.18:漏洞提交至PayPal的HackerOne项目
- 2019.12:PayPal确认漏洞有效性
- 2019.12.10:获得$15,300奖励,评定为CVSS 8.0
修复方案
PayPal采取的修复措施:
- 在
/auth/validatecaptcha端点添加CSRF token验证 - 防止跨站脚本包含攻击
安全建议
-
密码存储原则:
- 永远不要以明文方式存储或传输密码
- 即使临时存储也应加密
-
敏感信息保护:
- 避免在JavaScript文件中暴露敏感token
- 对关键端点实施严格的CSRF保护
-
验证机制改进:
- 确保验证码token与用户会话绑定
- 验证所有关键参数的有效性
-
安全开发实践:
- 对边缘功能进行同等严格的安全审查
- 定期进行安全审计和渗透测试
总结
该漏洞展示了几个关键安全问题:
- 边缘功能的安全同样重要
- 敏感信息不应出现在客户端脚本中
- 密码明文传输是严重的安全隐患
- 验证机制需要全面考虑所有参数的安全性
通过此案例,安全开发人员应更加重视:
- 所有功能组件的安全设计
- 敏感信息的全生命周期保护
- 防御机制的完整性验证