TypeORM SQL注入漏洞分析:repository.save和repository.update的安全风险

TypeORM在0.3.26之前版本存在SQL注入漏洞,攻击者可通过精心构造的请求在repository.save或repository.update方法中执行恶意SQL代码,导致数据泄露和未授权修改。

漏洞概述

TypeORM在0.3.26之前版本存在SQL注入漏洞,攻击者可通过精心构造的请求在repository.saverepository.update方法中执行恶意SQL代码。

受影响版本

  • 受影响版本:< 0.3.26
  • 已修复版本:0.3.26

漏洞详情

漏洞代码示例

1
2
3
4
5
6
7
8
const { username, city, name} = req.body;
const updateData = {
    username,
    city,
    name,
    id:userId
}; // 开发者意图只允许更新上述三个字段
const result = await userRepo.save(updateData);

正常负载示例

1
username=myusername&city=Riga&name=Javad

1
{"username":"myusername","phone":12345,"name":"Javad"}

生成的SQL查询:

1
2
3
4
5
UPDATE `user` 
SET `username` = 'myusername', 
    `city` = 'Riga', 
    `name` = 'Javad' 
WHERE `id` IN (1);

恶意负载示例

1
username=myusername&city[name]=Riga&city[role]=admin

1
{"username":"myusername","city":{"name":"Javad","role":"admin"}}

生成的含注入列的SQL查询:

1
2
3
4
5
UPDATE `user` 
SET `username` = 'myusername', 
    `city` = `name` = 'Javad', 
    `role` = 'admin' 
WHERE `id` IN (1);

根本原因

该漏洞的根本原因是TypeORM使用mysql2时未为stringifyObjects选项指定值。在mysql和mysql2中,此选项默认为false。该选项随后作为false传递给SQLString库,导致sqlstring使用objectToValues以异常方式解析对象。

安全评分

  • CVSS总体评分:8.9(高危)
  • 攻击向量:网络
  • 攻击复杂度:低
  • 所需权限:无
  • 用户交互:无

参考链接

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计