模块:
xmall-common
核心类:
cn.exrick.common.utils.GeetestLib
问题描述:
核心问题:在极验(Geetest)二次验证逻辑中,enhencedValidateRequest 方法将用户可控的输入(challenge, validate, seccode 以及 data Map 中的属性)直接通过 String.format 拼接到 POST 请求体中。
由于系统未对这些参数进行 URL 编码(URL Encoding),攻击者可以通过在输入中构造特殊字符(如 &、=),在发往极验服务器的下游请求中注入额外的参数,或篡改原有的参数逻辑。
漏洞触发路径
- Source:
UserController.login 或 MemberController.register 接收前端传来的 challenge, validate, seccode。
- Transmission: 这些 tainted data 被传递给
GeetestLib.enhencedValidateRequest。
- Sanitization (Fail): 仅调用了
resquestIsLegal 进行非空检查,完全没有对特殊字符进行转义或编码。
- Sink:
- 第 230 行:
String.format("challenge=%s&validate=%s...", challenge, ...) 将原始字符串嵌入格式化字符串。
- 第 232-238 行:通过字符串拼接(
+)加入 userId、ipAddress 等。
- 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);
}
模块:
xmall-common核心类:
cn.exrick.common.utils.GeetestLib问题描述:
核心问题:在极验(Geetest)二次验证逻辑中,
enhencedValidateRequest方法将用户可控的输入(challenge,validate,seccode以及dataMap 中的属性)直接通过String.format拼接到 POST 请求体中。由于系统未对这些参数进行 URL 编码(URL Encoding),攻击者可以通过在输入中构造特殊字符(如
&、=),在发往极验服务器的下游请求中注入额外的参数,或篡改原有的参数逻辑。漏洞触发路径
UserController.login或MemberController.register接收前端传来的challenge,validate,seccode。GeetestLib.enhencedValidateRequest。resquestIsLegal进行非空检查,完全没有对特殊字符进行转义或编码。String.format("challenge=%s&validate=%s...", challenge, ...)将原始字符串嵌入格式化字符串。+)加入userId、ipAddress等。readContentFromPost将拼接好的param字符串作为application/x-www-form-urlencoded类型的 Body 发送。代码片段分析