HQL 注入示例

信息安全 爪哇 注射
2021-09-06 06:12:12

我们的开发人员在处理用户登录时留下了惊喜。即:

// java
List users = hibernate.find("from Users where username = '"+formUsername+"'";
if (users.length==0) { return BAD_USER; }
if (!checkPassword(users.get(0).getPassword(), formPassword)) {
  return BAD_USERNAME_PASSWORD_COMBO;
}
// continue to mark session as authenticated

现在,显然可以注入查询。但那是 HQL 语言。如果是SQL,并且我知道数据库的结构,我可以挂一个“联合”操作,并且可以登录任何帐户。但我不太明白我可以在这里挂上什么样的恶意 HQL,才能真正让坏事发生。

是的,我们已经将这段代码替换为使用参数,但我只是好奇在这种情况下可以做什么。我见过的 HQL 示例是关于添加“OR”运算符的,在这种情况下这无济于事。

此外,底层数据库是 postgres,因此任何 postgres 函数都是公平的游戏。

附言

有一个关于工会将如何提供帮助的问题。给定(id,username,password)的表结构,SQL查询如下:

select id, username, password from users where username = ...

我可以注入:

' union select 1, 'root', 'synthetic_password

完整执行的 SQL 将变为:

select id, username, password from users where username = '' union select 1, 'root', 'synthetic_password'

第一个 select 不会返回任何记录,第二个将返回 JAVA 代码将从中读取并填充其 bean 的记录。然后它会比较密码,但由于我在注入的 SQL 和表单中都提供了密码数据,所以他们会签出。

1个回答

例如,您可以枚举任何用户哈希/密码:

插入以下内容作为用户名:

admin' AND substring(password,0,1) == char(64) AND '1' = '1

检查“密码”列中的第一个字符是否为小写 a。