gpt4 book ai didi

java - Hibernate HQL注入(inject)示例

转载 作者:行者123 更新时间:2023-11-30 02:03:32 26 4
gpt4 key购买 nike

昨天在 Github 上搜索一些存储库时,我发现了一些有趣的东西:一个 Java 项目(我不会提及存储库的名称,但我已经通知了它的所有者)包含对 HQL 查询的错误处理,这可能会导致导致 SQL/HQL 注入(inject)。代码如下:(请注意,用户名密码来自用户)

  Query query = session.createQuery("from Client where username = '" + username + "'");
List clients = query.list();
Client client = (Client) clients.get(0);
if (!validPassword(client.getPassword(), password)) {
return false;
}
//client is authenticated....

我认为很明显这个查询是可注入(inject)的。我真的不知道如何利用这个易受攻击的查询,因为即使我们注入(inject)用户名,仍然检查密码。使用的数据库是MySql(如果有帮助的话)。
所以我的问题是:如何利用它?

最佳答案

尽管 HQL 对注入(inject)的限制比 SQL 更严格,但它仍然可以被利用。

一些示例注入(inject)的解释见 https://blog.h3xstream.com/2014/02/hql-for-pentesters.html

之前已经在 https://security.stackexchange.com/questions/24265/hql-injection-example 上提出过与此类似的问题。

此问题的答案解释了如何扫描密码(哈希)的字符。例如如果对于 Oracle 数据库,username 的值为:

admin' AND SUBSTR(password, 0, 1) = 'A

那么如果

  1. 密码(哈希)的第一个字符不是“A” -> 客户端列表为空,并且 clients.get(0) 方法调用抛出 IndexOutOfBoundsException
  2. 密码(哈希)的第一个字符是“A”,但提供的密码为 false -> 用户未经过身份验证
  3. 密码(哈希)的第一个字符是“A”并且提供的密码正确 -> 用户已通过身份验证

黑客可以对中的每个 x 和 z 重复查询

SUBSTR(password, x, x + 1) = z

在上面的查询中,直到结果始终是情况 2,其中用户未经过身份验证。这样他就可以找到用户 admin 的密码哈希,并可能破解他的密码。

其他漏洞利用也是可能的,我不会列出所有这些......

关于java - Hibernate HQL注入(inject)示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com