2013-10-11 95 views
3

我正在審計一個項目,我發現了一種在查詢中注入數據的方法。 該項目使用Hibernate和這段代碼Session.createSqlQuery()然後.list()Hibernate SQL注入

的SQL是這樣的:「SELECT * FROM tablename ORDER BY column XXXXXX

XXXXXX可以使用招進行修改。所以,我想

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

不幸的是(也只爲我注射的嘗試),它不工作,我越來越:

您的SQL語法錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「截斷表的表名」

我的問題是,因爲他們使用createSQLQuery,他們是從注射安全。如果他們不是,你能舉個例子來強調這個問題。

我試着用08%(退格字符)想我將能夠刪除以前的查詢字符,例如(它沒有工作;))

感謝。


一些研究似乎我將無法與這個安全漏洞來修改數據,但是使用ORDER BY (CASE WHEN ...)將允許「掃描」表和數據之後。

+0

非常好的問題,看起來像HQL和SQL都不是安全的從注入,但你可以避免它,讀取這裏的文章http://software-security.sans.org/developer-how-to/fix -sql -injection-java-hibernate – Zeus

回答

0

是使用參數化語句指定列名還是僅連接文本?

例如:在Perl :: DBI,驅動程序支持以下語法:

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

的?有一種參數化語句的形式可以自動清理輸入。

+0

列名是「硬編碼」。我只能添加一些東西。 –

+0

http://stackoverflow.com/questions/16807399/sql-injection-prevention-with-hibernate?rq=1 和 http://stackoverflow.com/questions/4606505/prevention-against-sql-injection-in -hibernate?rq = 1 表明JDBC驅動程序將hibernate命令視爲參數化查詢。我必須嘗試確定。 –

+0

謝謝,但您的示例引用了使用參數化查詢的人員,這裏不是這種情況。 –