2013-10-11 2 views
3

Я проверяю проект, и я нашел способ ввода данных в запрос. Проект использует Hibernate и этот кусок кода Session.createSqlQuery(), а затем .list()Hibernate SQL Injection

SQL-то вроде: «SELECT * FROM tablename ORDER BY column XXXXXX»

XXXXXX может быть изменен с помощью Fiddler. Так что я попытался

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

К сожалению (ну только для моей попытки инъекции) это не работает, и я получаю:

У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «усечение таблицы имя_таблицы»

Мой вопрос, так как они используют createSQLQuery, они безопасны от инъекции. Если это не так, не могли бы вы привести мне пример, чтобы подчеркнуть эту проблему.

Я попытался с помощью% 08 (Backspace характер), думая, я бы смог удалить предыдущие символы запроса, например (он не работает;))

Спасибо.


После некоторых исследований я, кажется, не будет иметь возможность изменять данные с этой дырой в безопасности, однако использование ORDER BY (CASE WHEN ...) позволит «сканировать» таблицы и данные.

+0

Очень хороший вопрос, похоже, что HQL и SQL оба не защищены от инъекций, но вы можете избежать этого, прочитайте статью здесь http://software-security.sans.org/developer-how-to/fix -sql-injection-in-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 обрабатывают команды спящего режима в качестве параметризованных запросов. Я бы попробовал это, чтобы быть уверенным. –

+0

Спасибо, но ваши примеры относятся к людям, использующим параметризованные запросы, что здесь не так. –