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"
Переходя в лабораторию нас приветствует страница какого-то онлайн-магазина с возможностью войти в аккаунт
Для начала попробуем войти в админ панель используя комбинацию
Как видим, пароль, который мы ввели неверный.
Данное сообщение об ошибке является неуязвимым потому, что исходя из смысла мы не можем точно знать, какие конкретно введенные данные были введены неправильно - может мы ввели неправильно пароль, а может и сам логин.
Итак, давайте, как в прошлый раз, начнем с ввода в поле логина одинарную кавычку и посмотрим, как на это отреагирует приложение:
Нажав на кнопку получим сообщение:
Как мы помним из прошлой статьи - произошла ошибка синтаксиса в SQL-Запросе - это является очень хорошим индикатором того, что приложение уязвимо к SQL-инъекциям.
Можно предположить как примерно будет выглядеть SQL-запрос при логине:
SELECT username FROM users WHERE login='falcon' and password='bytes123'
Это только предположение и нам нужно его проверить, но так бы выглядел самый простой запрос в БД, где проверяется
Если пользователь с таким логином и паролем есть в бд - она выведет его имя пользователя, в противном случае - запрос заблокируется
Читая подобный SQL-запрос попробуем узнать, как можно проигнорировать пункт с вводом пароля.
Теперь давайте на основе опыта из прошлой статьи заставим БД проигнорировать ввод пароля. В качестве логина попробуем ввести:
SELECT username FROM users WHERE login='admin'-- and password='bytes123'
Таким образом мы закрыли одинарную кавычку и проигнорировали остаток запроса.
Пробуем ввести такой логин в приложение:
Скорее всего в приложении нету пользователя с юзернеймом admin
Попробуем ввести полное имя в поле логина:
Вводим любой пароль и пробуем залогиниться:
Вуаля! Мы смогли обойти пароль администратора, и лаборатория нас поздравляет с решением квеста.
На связи был админ канала Falcon Bytes.