May 4

SQLi - Обходим логин

Приветствую! На связи админ канала Falcon Bytes! В предыдущей статье я постарался объяснить, как работают типичные SQL инъекции на практике и примерах. В этой статье я продолжу объяснение этой темы.

Представьте себе приложение, которое позволяет пользователям входить в систему, используя имя пользователя и пароль. Если пользователь отправляет имя пользователя falcon и пароль bytes, приложение проверяет учетные данные, выполняя следующий SQL-запрос:

SELECT * FROM users WHERE username = 'falcon' AND password = 'bytes'

Если запрос возвращает сведения о пользователе, вход в систему успешен. В противном случае оно отклоняется.

В этом случае злоумышленник может войти в систему под любым пользователем без необходимости ввода пароля. Они могут сделать это, используя последовательность комментариев SQL. --чтобы убрать проверку пароля из WHEREпредложение запроса. Например, отправив имя пользователя administrator'--и пустой пароль приводит к следующему запросу:

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

Этот запрос возвращает пользователя, чей usernameявляется administratorи успешно регистрирует злоумышленника под этим пользователем.

Как и в прошлой статье, мы использовали лабораторию от Portswigger для тестирования уязвимостей без вреда для себя и других ресурсов. Более подробно про регистрацию вы можете прочитать в этой статье.

Эта лаборатория содержит уязвимость SQL-инъекции в функции входа в систему.

Наша цель: Войти в админ панель ресурса

Для доступа в тестовую лабораторию, переходим по ссылке и нажимаем на кнопку "ACCESS THE LAB"

Анализ

Переходя в лабораторию нас приветствует страница какого-то онлайн-магазина с возможностью войти в аккаунт

Для начала попробуем войти в админ панель используя комбинацию

login: admin

password: admin

Получаем ответ от сервера:

Как видим, пароль, который мы ввели неверный.

Данное сообщение об ошибке является неуязвимым потому, что исходя из смысла мы не можем точно знать, какие конкретно введенные данные были введены неправильно - может мы ввели неправильно пароль, а может и сам логин.

Итак, давайте, как в прошлый раз, начнем с ввода в поле логина одинарную кавычку и посмотрим, как на это отреагирует приложение:

Нажав на кнопку получим сообщение:

Как мы помним из прошлой статьи - произошла ошибка синтаксиса в SQL-Запросе - это является очень хорошим индикатором того, что приложение уязвимо к SQL-инъекциям.

Можно предположить как примерно будет выглядеть SQL-запрос при логине:

SELECT username FROM users WHERE login='falcon' and password='bytes123'

Это только предположение и нам нужно его проверить, но так бы выглядел самый простой запрос в БД, где проверяется

логин: falcon

пароль: bytes

Если пользователь с таким логином и паролем есть в бд - она выведет его имя пользователя, в противном случае - запрос заблокируется

Читая подобный SQL-запрос попробуем узнать, как можно проигнорировать пункт с вводом пароля.

Теперь давайте на основе опыта из прошлой статьи заставим БД проигнорировать ввод пароля. В качестве логина попробуем ввести:

admin'--

в запрос:

SELECT username FROM users WHERE login='admin'-- and password='bytes123'

Таким образом мы закрыли одинарную кавычку и проигнорировали остаток запроса.

Пробуем ввести такой логин в приложение:

И получаем неудачу.

Скорее всего в приложении нету пользователя с юзернеймом admin

Попробуем ввести полное имя в поле логина:

administrator'--

Вводим любой пароль и пробуем залогиниться:

Вуаля! Мы смогли обойти пароль администратора, и лаборатория нас поздравляет с решением квеста.

На связи был админ канала Falcon Bytes.

Удачи!