Hibernate SQL注入

3

我正在审核一个项目,发现可以在查询中注入数据。该项目使用Hibernate,在这段代码中使用了Session.createSqlQuery().list()

SQL语句类似于:“SELECT * FROM tablename ORDER BY column XXXXXX

XXXXXX可以通过Fiddler进行修改。所以我尝试了

SELECT * FROM tablename ORDER BY column DESC; truncate table tablename;

很遗憾(对于我的注入尝试而言),它不起作用,我得到了以下错误:

您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式:'truncate table tablename'

我的问题是,既然他们正在使用createSQLQuery,那么他们是否安全免受注入攻击。如果他们没有,你能否给我一个例子来突出这个问题。

我尝试使用%08(退格字符),认为我将能够删除先前的查询字符,例如(它没有工作;))

谢谢。


经过一些研究,似乎我无法利用这个安全漏洞修改数据,但是使用ORDER BY (CASE WHEN ...)可以“扫描”表和数据。


非常好的问题,看起来HQL和SQL都无法避免注入攻击,但是你可以避免它,阅读这篇文章:http://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-hibernate - Zeus
1个回答

0

列名是使用参数化语句指定的还是只是将文本串联起来的?

例如,在 perl::DBI 中,驱动程序支持以下语法:

$dbh->do("SELECt * FROM asdf ORDER BY ?", undef, $order_by);

这里的 ? 是一种参数化语句形式,可以自动清理输入。


这两个链接(http://stackoverflow.com/questions/16807399/sql-injection-prevention-with-hibernate?rq=1 和 https://dev59.com/5G445IYBdhLWcg3w9O7R?rq=1)提到JDBC驱动程序将Hibernate命令视为参数化查询。我得亲自试一下才能确定。 - cs_alumnus
谢谢,但你的例子是针对使用参数化查询的人,而这不是这里的情况。 - Michael Laffargue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接