【问题标题】:JPA Query leave SQL Injection intentionallyJPA Query 故意离开 SQL 注入
【发布时间】:2021-03-11 18:17:12
【问题描述】:

Hi Stack,我需要一些帮助。

我正在构建一个故意易受攻击的本地应用程序。而且我需要一个参数不进行验证,因为该应用程序将供开发人员测试 SQL 注入和 XSS 等安全漏洞。我正在努力寻找一种方法,使用本地 DB JPA UserRespository 使查询易受 SQL 注入攻击,但它允许我的唯一查询如下。

@Repository
public interface UserRespository extends CrudRepository<User,Long>{
  
    @Query(value="SELECT * FROM USERS WHERE name = :name", nativeQuery=false)
   User VulnerableQuery(String name);

}

所以我实际上无法触发 SQL 注入。有人知道其他方法吗?

【问题讨论】:

  • SQL 注入在暴露持久层的任何一个上进行测试。在 Spring 的情况下,您通常将持久层暴露在 Controller 中,例如REST 端点。它在那里,您可以在其中测试 SQL 注入,而不是在存储库(持久层)类中。
  • 嗨 Victor 我知道问题是 JPA 只允许基于自己的构建查询。我实际上可以直接连接用户名,因为它不允许我
  • 尝试将您认为会造成破坏的任何内容发送到 REST 端点。如果您已经在 Spring 中使用 JPA 和 POJO,那么这是 Big Dogs 的任务,而不是新手的任务。 JPA+Hibernate 和 Spring 是坚如磐石,让 SQL 注入攻击通过。
  • 您可以直接在代码中编写本机查询。在这里查看答案:stackoverflow.com/questions/41661193/…
  • 不,JPA 没有问题。 JPA 正在尽最大努力防止 SQL 注入,但您仍然可以对其进行测试以找到漏洞,就像它一样,无需在存储库级别删除任何内容。 JPA 将任何 JPQL 查询转换为普通的普通 SQL。因此,如果 JPA 中存在漏洞,您可以尽力找到它。谁知道呢,也许你发现了一个漏洞。

标签: java spring-boot spring-data-jpa


【解决方案1】:

如果你使用这样的原生查询?:

@Query(value="SELECT * FROM USERS WHERE name = :?1", nativeQuery=true)

【讨论】:

  • 不,这仍然将名称作为参数传递。要引入漏洞,您需要使用连接的旧、困难、愚蠢的方式构建查询。
  • 不,参数(这个东西::?1)是防注入的。看到这个:stackoverflow.com/questions/52791121/…
猜你喜欢
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2015-03-18
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多