Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HibernateHQL注入示例_Java_Hibernate - Fatal编程技术网

Java HibernateHQL注入示例

Java HibernateHQL注入示例,java,hibernate,Java,Hibernate,昨天在Github上搜索了一些存储库,我发现了一些有趣的东西:一个Java项目(我不想提及存储库的名称,但我已经通知了它的所有者)包含了HQL查询的错误处理,这可能导致SQL/HQL注入。代码如下:(注意,username和password来自用户) 我认为很明显,这个查询是可注入的。我真的不知道如何利用这个易受攻击的查询,因为即使我们注入用户名 密码仍处于选中状态。使用的数据库是MySql(如果有帮助)。 所以我的问题是:如何利用这一点?是的,所以…一旦启动hibernate会话,就可以使用q

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

我认为很明显,这个查询是可注入的。我真的不知道如何利用这个易受攻击的查询,因为即使我们注入
用户名
密码
仍处于选中状态。使用的数据库是MySql(如果有帮助)。

所以我的问题是:如何利用这一点?

是的,所以…一旦启动hibernate会话,就可以使用query获取数据。现在您已经编写了客户机表的查询

例如

用户名=“ABC”

1) 您从用户名为'ABC'的客户端进行的查询将从用户名为确切ABC的客户端获取数据。 如果它找到多个相同的用户名,它还将返回所有

2) 它将存储在列表中。0条或多条记录将存储在列表中

3) 然后无论出现什么记录,它都只使用

Client Client=(Client)clients.get(0)

4) 它使用客户机对象记录密码检查预期密码,该密码可能会通过方法调用保存在某个变量中

5) 若它不匹配,那个么它将返回false boolean标志,否则代码将继续执行经过身份验证的客户端


希望您能找到答案。

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

一些示例注入在下面的章节中进行了解释

类似的问题之前已经被问过了

这个问题的答案解释了如何扫描密码(散列)的字符。e、 g.如果对于Oracle数据库,
username
的值为:

admin' AND SUBSTR(password, 0, 1) = 'A
那么如果

  • 密码(散列)的第一个字符不是“A”->客户端列表为空,并且
    clients.get(0)
    方法调用抛出
    IndexOutOfBoundsException
  • 密码(散列)的第一个字符是“A”,但提供的密码是false->用户未通过身份验证
  • 密码(散列)的第一个字符是“A”,并且提供的密码正确->用户已通过身份验证
  • 黑客可以重复查询中的每个x和z

    SUBSTR(password, x, x + 1) = z
    
    在上述查询中,直到结果始终为案例2。其中用户未经身份验证。通过这种方式,他可以找到用户
    admin
    的密码哈希,并可以破解他的密码


    其他漏洞也有可能,我不打算列出所有漏洞…

    uhm。。。你的问题是什么?一种可能的利用它的方法?是的,我更新了描述;是的,这将返回所有客户端,但仍然会检查第一个客户端的密码,并且无法按原样利用此漏洞。如果驱动程序允许,您可以附加一个更新,以根据需要更改密码。这通常是允许的吗?在我看来,“所有令人讨厌的东西”并不能真正回答这个问题。问题是“在这种特殊情况下,可以做什么?”此外,bobby-tables.com上几乎没有攻击性的东西。你是对的,但当时我没有感觉OP已经做了大量的研究,我将不得不花一些时间设置HQL环境来测试我将说的话。对于注入,HQL似乎比SQL更具限制性,但注入仍然是可能的。我将更新我的答案,以参考一些相关链接。@FedericoklezCulloca漫画中的肮脏内容。您构造了一个由4部分组成的SQL用户名:一个随机名称,字符串';要关闭查询,所有要注入的SQL查询,字符串——忽略原始查询的其余部分,因此注入的查询在语法上是正确的。您的新答案非常好。我会接受的。谢谢。我认为问题更多的是“给定此代码,我如何利用它?”而不是“我如何修复此问题?”是的,因此……一旦启动hibernate会话,您就可以使用query获取数据。现在您已经编写了客户端表的查询。再次,您似乎回答了一个完全不同的问题。它是描述性的,您是对的。只是你在回答一个不同的问题。
    SUBSTR(password, x, x + 1) = z