利用HTTP参数污染漏洞绕过reCAPTCHA认证
字数 1451 2025-08-29 08:32:18
reCAPTCHA认证绕过漏洞分析与防御指南
1. reCAPTCHA简介
reCAPTCHA是Google提供的一种CAPTCHA服务,帮助网站验证用户是否为真人而非自动化程序。它提供多种验证方式:
- 基于cookie的用户验证
- 多重"挑战"验证(如图像识别)
- 行为分析验证
2. 漏洞背景
2018年1月发现的reCAPTCHA认证绕过漏洞,允许攻击者在特定条件下绕过验证机制。该漏洞需要两个前提条件:
- Web应用程序以不安全方式构造提交给
/recaptcha/api/siteverify的请求 - 存在HTTP参数污染漏洞
3. reCAPTCHA标准工作流程
- 用户访问包含reCAPTCHA的网页
- Google提供图像集,用户完成验证
- 用户点击"Verify"后,浏览器发送请求:
POST /verify-recaptcha-response HTTP/1.1 Host: vulnerable-app.com recaptcha-response={reCAPTCHA-generated-hash} - 服务器向Google API验证响应:
POST /recaptcha/api/siteverify HTTP/1.1 Content-Length: 458 Host: www.google.com Content-Type: application/x-www-form-urlencoded recaptcha-response={reCAPTCHA-generated-hash}&secret={application-secret} - 验证成功返回:
{ "success": true, "challenge_ts": "2018-01-29T17:58:36Z", "hostname": "..." }
4. HTTP参数污染漏洞
HTTP参数污染(HPP)是指当HTTP请求中包含多个同名参数时,服务器处理方式不一致导致的漏洞。在reCAPTCHA场景中:
- Google API处理方式:使用第一个
secret参数,忽略后续同名参数 - 漏洞利用点:攻击者可注入额外的
secret参数控制验证结果
5. 漏洞利用条件
- Web应用程序存在HTTP参数污染漏洞
- 应用程序使用字符串连接构造URL(不安全方式)
private String sendPost(String CaptchaResponse, String Secret) throws Exception { String url = "https://www.google.com/recaptcha/api/siteverify"+ "?response="+CaptchaResponse+ "&secret="+Secret; URL obj = new URL(url); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); // ... } - URL构造顺序为
response参数在前,secret参数在后
6. 漏洞利用方法
6.1 测试环境禁用reCAPTCHA的默认值
Google文档中提供的测试用值:
- Site key:
6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI - Secret key:
6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
6.2 构造恶意请求
发送以下请求到存在漏洞的Web应用:
POST /verify-recaptcha-response HTTP/1.1
Host: vulnerable-app.com
recaptcha-response=anything%26secret%3d6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
URL解码后实际内容:
recaptcha-response=anything&secret=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
6.3 漏洞触发过程
- 漏洞应用构造的请求:
POST /recaptcha/api/siteverify HTTP/1.1 Host: www.google.com Content-Type: application/x-www-form-urlencoded recaptcha-response=anything&secret=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe&secret=真实secret - Google API只处理第一个
secret参数(测试用值) - 返回验证成功响应,绕过实际验证
7. Google的修复方案
Google在API层面修复此漏洞:
- 当请求包含多个同名参数时,直接返回错误
- 无需Web应用程序进行修改
8. 防御建议
8.1 对开发人员的建议
-
避免使用字符串连接构造URL
- 使用字典存储键值对
- 使用标准库进行URL编码
正确示例(Python):
import urllib.parse params = { 'response': CaptchaResponse, 'secret': Secret } encoded_params = urllib.parse.urlencode(params) url = "https://www.google.com/recaptcha/api/siteverify?" + encoded_params -
使用最新版reCAPTCHA API
8.2 对安全测试人员的建议
- 测试所有接收用户输入并构造HTTP请求的功能
- 特别关注参数顺序和重复参数的处理
- 对reCAPTCHA实现进行专门测试
9. 漏洞影响范围
- 约60%的reCAPTCHA实现存在HTTP参数污染漏洞
- 其中约5-10%使用"response在前,secret在后"的顺序
- 综合影响约3%的使用reCAPTCHA的网站
10. 时间线
- 2018-01-29: 漏洞报告提交
- 2018-01-30: Google初步回应
- 2018-02-01: Google确认漏洞
- 2018-02-15: 颁发500美元奖金
- 2018-03-25: Google发布安全补丁
11. 总结
该漏洞展示了:
- 即使是Google这样的安全专家也可能在API设计中存在隐患
- HTTP参数污染漏洞的实际危害取决于具体上下文
- 安全开发实践(如避免字符串连接构造URL)的重要性
- 上游修复可以高效解决广泛存在的安全问题