JPA 中是不是可能进行 SQL 注入攻击?

Posted

技术标签:

【中文标题】JPA 中是不是可能进行 SQL 注入攻击?【英文标题】:Are SQL injection attacks possible in JPA?JPA 中是否可能进行 SQL 注入攻击? 【发布时间】:2011-03-27 08:28:12 【问题描述】:

我正在使用 Java EE 6 和 JSF-2.0 构建一个 Java Web 应用程序,并使用持久性 API 进行所有数据库操作。

后端是 mysql,但我使用 EJB-QL 中的 EntityManager 函数和命名查询进行所有操作。在这种情况下是否可能进行 SQL 注入攻击?

【问题讨论】:

【参考方案1】:

只有当您像这样在 SQL/JPQL 字符串中内联用户控制的变量时才有可能:

String sql = "SELECT u FROM User u WHERE id=" + id;

如果您不这样做并且仅使用参数化/命名查询,那么您是安全的。

【讨论】:

如果使用em.persist(user);,其中user由错误用户填充? 这是否意味着以下查询是 SQL 注入证明? @Query("SELECT * from table where id = :userID") 用户 getUser (@Param("userID") String userID )【参考方案2】:

是的,这是可能的。这取决于您实施的方式。 看看Preventing injection in JPA query language。

【讨论】:

我也建议查看 SANS 文章,它有更多示例/介绍:software-security.sans.org/developer-how-to/…【参考方案3】:

如果您的 JPA 提供程序处理所有输入参数以处理注入攻击,那么您应该被覆盖。我们在 EclipseLink 中做瘦。

正如之前的海报所提到的,将您自己的 JPQL 或 SQL(用于本机查询)拼凑在一起可能会让您暴露。

我建议使用带参数的命名查询而不是连接字符串来构建 JPQL/SQL。

道格

【讨论】:

【参考方案4】:

如果您从冒犯/实用的角度提出问题,如果 JPQL 语句是根据用户输入构建的,请考虑以下用户输入:

blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42

如果受害者使用 >= 2.1 的 JPA 实现,并且后端数据库是 Oracle,则类似上述的内容可能会充当布尔 SQL 注入来告诉您数据库用户是否以“A”开头。

【讨论】:

以上是关于JPA 中是不是可能进行 SQL 注入攻击?的主要内容,如果未能解决你的问题,请参考以下文章

让你彻底明白sql注入攻击

QLDB/PartiQL 中是不是可能存在 SQL 注入攻击

20155324《网络对抗技术》web安全基础实践

SQL注入基础知识

求教谁给讲讲SQL注入攻击的步骤

SQL注入攻击的常见方式及测试方法