Skip to content

GeetestLib 存在未编码用户输入导致的 HTTP 参数注入漏洞 (CWE-74) #102

@weaver4VD

Description

@weaver4VD
模块:

xmall-common

核心类:

cn.exrick.common.utils.GeetestLib

问题描述:

核心问题:在极验(Geetest)二次验证逻辑中,enhencedValidateRequest 方法将用户可控的输入(challenge, validate, seccode 以及 data Map 中的属性)直接通过 String.format 拼接到 POST 请求体中。

由于系统未对这些参数进行 URL 编码(URL Encoding),攻击者可以通过在输入中构造特殊字符(如 &=),在发往极验服务器的下游请求中注入额外的参数,或篡改原有的参数逻辑。

漏洞触发路径
  1. Source: UserController.loginMemberController.register 接收前端传来的 challenge, validate, seccode
  2. Transmission: 这些 tainted data 被传递给 GeetestLib.enhencedValidateRequest
  3. Sanitization (Fail): 仅调用了 resquestIsLegal 进行非空检查,完全没有对特殊字符进行转义或编码。
  4. Sink:
    • 第 230 行:String.format("challenge=%s&validate=%s...", challenge, ...) 将原始字符串嵌入格式化字符串。
    • 第 232-238 行:通过字符串拼接(+)加入 userIdipAddress 等。
  5. Execution: readContentFromPost 将拼接好的 param 字符串作为 application/x-www-form-urlencoded 类型的 Body 发送。
代码片段分析
// GeetestLib.java
public int enhencedValidateRequest(String challenge, String validate, String seccode, HashMap<String, String> data) {
    // ...
    // 漏洞点 1:直接格式化拼接,未进行 URLEncoder.encode()
    String param = String.format("challenge=%s&validate=%s&seccode=%s&json_format=%s",  
                                  challenge, validate, seccode, this.json_format);
    
    // 漏洞点 2:直接字符串拼接
    if (userId != null){
        param = param + "&user_id=" + userId; 
    }
    // ...
    // 发送带有注入数据的请求
    response = readContentFromPost(postUrl, param);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions