Вчера, просматривая некоторые репозитории на Github, я нашел кое-что интересное: один проект Java (я не буду упоминать имя репозитория, но я уже уведомил его владельца) содержал плохую обработку запросов HQL, что могло привести к SQL / Инъекции HQL. Код был следующий: (обратите внимание, что username и password исходят от пользователя)
Query query = session.createQuery("from Client where username = '" + username + "'");
List clients = query.list();
Client client = (Client) clients.get(0);
if (!validPassword(client.getPassword(), password)) {
return false;
}
//client is authenticated....
Думаю, очевидно, что этот запрос является инъекционным. Я действительно не знаю, как можно использовать этот уязвимый запрос, потому что даже если мы введем username,
password все еще проверяется. Использовалась база данных MySql (если это помогает) .
Итак, мой вопрос: как это можно использовать?
да, обновил описание.
Строка username = "имя или 1 = 1";
да, это вернет всех клиентов, но все же пароль первого клиента проверяется, и это не может быть использовано как есть.
если драйвер позволяет, вы можете добавить обновление, которое изменяет пароль на все, что вам нужно. Это вообще разрешено?
столы для бобби ...




Да, так ... как только вы запустили сеанс гибернации, вы можете получать данные с помощью запроса. Теперь вы написали запрос для таблицы Client.
Например,
username = "ABC"
1) Ваш запрос от клиента, где username = 'ABC' будет извлекать данные от клиента, имя пользователя которого является точным ABC. Если он нашел несколько одинаковых имен пользователей, он также вернет все.
2) Будет сохранено в списке. 0 или более записей будут сохранены в списке.
3) Какие бы записи ни приходили, он извлекает только первую запись, используя
Клиент client = (Клиент) clients.get (0);
4) он проверяет пароль записи клиентского объекта с ожидаемым паролем, который, возможно, предполагается сохранить в некоторой переменной через вызов метода.
5) если он не совпадает, он возвращается с ложным логическим флагом, иначе код продолжит выполнение аутентифицированного клиента.
Надеюсь, ты получил ответ.
Я думаю, что вопрос скорее в том, "учитывая этот код, как я могу его использовать?" вместо "как мне это исправить?"
Да, так ... как только вы запустили сеанс гибернации, вы можете получать данные с помощью запроса. Теперь вы написали запрос для таблицы Client.
Опять же, похоже, вы отвечаете на совершенно другой вопрос.
Это является описательное, вы правы. Просто вы отвечаете на другой вопрос.
Несмотря на то, что HQL более ограничивает инъекции, чем SQL, его все же можно использовать.
Некоторые примеры инъекций объяснены на https://blog.h3xstream.com/2014/02/hql-for-pentesters.html.
Подобный вопрос уже задавался ранее на https://security.stackexchange.com/questions/24265/hql-injection-example
Ответ на этот вопрос объясняет, как можно сканировать символы пароля (хеша). например если для базы данных Oracle значение username равно:
admin' AND SUBSTR(password, 0, 1) = 'A
Тогда если
clients.get(0) выдает IndexOutOfBoundsExceptionХакер может повторить запрос для каждого x и z в
SUBSTR(password, x, x + 1) = z
в приведенном выше запросе до тех пор, пока результат всегда не будет 2. когда пользователь не аутентифицирован. Таким образом он сможет узнать хэш пароля пользователя admin и, возможно, сможет взломать его пароль.
Возможны и другие эксплойты, я не буду перечислять их все ...
"всякие гадости", на мой взгляд, не отвечают на этот вопрос. Вопрос в том, «что можно было сделать в данном конкретном случае?» Кроме того, на bobby-tables.com очень мало оскорбительных материалов.
Вы правы, но тогда у меня не было ощущения, что OP провел много исследований, и мне придется потратить некоторое время на настройку среды HQL, чтобы проверить, что я скажу. Кажется, что HQL более ограничивает, чем SQL, для инъекций, но инъекции все же возможны. Я обновлю свой ответ, чтобы сослаться на некоторые соответствующие ссылки.
@FedericoklezCulloca, гадости на bobby-tables.com есть в мультфильме. Вы создаете имя пользователя SQL из 4 частей: случайное имя, строка '); чтобы закрыть запрос, все SQL-запросы, которые вы хотите внедрить, строка - чтобы игнорировать оставшуюся часть исходного запроса, чтобы ваш внедренный запрос был синтаксически правильным.
ваш новый ответ великолепен. Я приму это. Спасибо.
ммм ... какой у тебя вопрос? Возможный способ его использования?