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