我们的开发人员在处理用户登录时留下了惊喜。即:
// 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 和表单中都提供了密码数据,所以他们会签出。