ORM 注入
ORM 注入 是什么?
ORM 注入针对使用对象关系映射器(ORM)的应用的注入攻击,通过动态查询、批量赋值或原生 SQL 逃逸接口篡改数据访问。
ORM 注入发生在攻击者可控的输入,经由 Hibernate、Entity Framework、SQLAlchemy、ActiveRecord、Sequelize、Prisma、Django ORM 等的动态查询 API 进入数据层时。典型脆弱模式包括:HQL/JPQL 字符串拼接、ActiveRecord 的 where(string) 内插、Sequelize 的 Op.literal、SQLAlchemy 的格式化 text()、对未授权字段的批量赋值,以及来自 JSON API 的不安全排序/过滤参数。其影响从传统 SQL 注入延伸到授权绕过和权限提升,尤其在控制逻辑放在 ORM 层时。防御措施:使用参数化的查询构造器;为可排序/过滤的字段维护严格白名单;显式声明可写属性(strong parameters);对不可信输入避免使用原生 SQL 逃逸接口。
● 示例
- 01
Rails 应用使用 User.where("name = '#{params[:q]}'"),从 ORM 暴露 SQL 注入。
- 02
Sequelize 端点接受攻击者可控的 order 参数并直接传入 Op.literal。
● 常见问题
ORM 注入 是什么?
针对使用对象关系映射器(ORM)的应用的注入攻击,通过动态查询、批量赋值或原生 SQL 逃逸接口篡改数据访问。 它属于网络安全的 攻击与威胁 分类。
ORM 注入 是什么意思?
针对使用对象关系映射器(ORM)的应用的注入攻击,通过动态查询、批量赋值或原生 SQL 逃逸接口篡改数据访问。
ORM 注入 是如何工作的?
ORM 注入发生在攻击者可控的输入,经由 Hibernate、Entity Framework、SQLAlchemy、ActiveRecord、Sequelize、Prisma、Django ORM 等的动态查询 API 进入数据层时。典型脆弱模式包括:HQL/JPQL 字符串拼接、ActiveRecord 的 where(string) 内插、Sequelize 的 Op.literal、SQLAlchemy 的格式化 text()、对未授权字段的批量赋值,以及来自 JSON API 的不安全排序/过滤参数。其影响从传统 SQL 注入延伸到授权绕过和权限提升,尤其在控制逻辑放在 ORM 层时。防御措施:使用参数化的查询构造器;为可排序/过滤的字段维护严格白名单;显式声明可写属性(strong parameters);对不可信输入避免使用原生 SQL 逃逸接口。
如何防御 ORM 注入?
针对 ORM 注入 的防御通常结合技术控制与运营实践,详见上方完整定义。
ORM 注入 还有哪些其他名称?
常见的别称包括: HQL 注入, JPQL 注入。
● 相关术语
- attacks№ 1084
SQL 注入
一种代码注入攻击,将攻击者控制的 SQL 语句植入数据库查询,以读取、篡改或破坏数据。
- attacks№ 743
NoSQL 注入
通过篡改 NoSQL 数据库的操作符、JSON 结构或查询 DSL 来绕过业务逻辑或窃取数据的注入攻击。
- attacks№ 1106
存储过程滥用
利用具有特权或实现不安全的数据库存储过程执行任意 SQL、操作系统命令,或从数据库层进行权限提升。
- vulnerabilities№ 653
批量赋值漏洞
应用将客户端提交的请求字段盲目绑定到内部对象属性,导致攻击者能写入本不应控制的字段的漏洞。
- appsec№ 538
输入校验
在应用处理数据前,服务端检查所有不可信输入是否符合预期的类型、长度、范围、格式和取值集合。