Этап 1: Определение уязвимого места.
Для начала введите любой критерий поиска и добавьте кавычку. Если сайт выдает ошибку 500, это указывает на уязвимость. Закрыв оставшуюся часть запроса комментарием, вы сможете восстановить работу сайта. Точка входа будет находиться между кавычкой и комментарием.
Обратите внимание, что комментарии могут различаться в зависимости от используемой СУБД. Например, для MySQL используется "#", а для SQLite — " -- ".
Этап 2: Определение количества запрашиваемых значений.
Далее необходимо определить, сколько значений приложение извлекает из базы данных.Запрос к базе данных, который извлекает сущности новостей, обычно использует оператор * (ALL). Это означает, что результатом запроса будут строки, содержащие все три поля: id, title, text.
Однако со стороны пользователя запрос не виден, поэтому невозможно сразу определить количество извлекаемых полей.
Для этого используется команда order by <x>. Она используется для сортировки и может помочь определить количество полей.
Подставьте в точку входа конструкцию:
Код:
ORDER BY X
где x — предполагаемое количество полей.
Таким образом, перебирая значения x до получения ошибки, вы можете определить интересующее вас количество полей.
Этап 3: Определение отображения.
После определения количества запрашиваемых полей необходимо узнать, какие поля на странице отображают результаты каких полей.Например, если вы знаете, что количество запрашиваемых полей равно трем, можно использовать конструкцию:
Код:
union select 1,2,3 –
Это означает, что на страницу выводятся значения полей 2 и 3, что будет важно для следующего этапа.
Этап 4: Определение структуры базы данных.
На этом этапе необходимо получить общее представление о структуре базы данных.Это тесно связано с целью, поскольку дальнейшие действия будут зависеть от того, что вы хотите сделать (например, извлечь данные, удалить таблицу).
Предположим, что ваша цель — извлечь данные обо всех пользователях и удалить таблицу с пользователями.
Сначала нужно выяснить, в какой таблице хранятся данные о пользователях.
Для этого можно использовать различные методы, которые зависят от используемой СУБД.
Например, если приложение использует SQLite, можно использовать встроенную функцию sqlite_version(), которая характерна только для этой СУБД.
Подставьте функцию вместо поля 2:
Код:
test’ union select 1,sqlite_version(),3 --
Это позволяет сделать два вывода: приложение использует SQLite, и вы можете использовать поля 2 и 3 для вывода нужных данных.
К сожалению, в отличие от других СУБД, SQLite не содержит системных таблиц с информацией о базах данных. Однако есть системная таблица sqlite_master, которая содержит информацию о других таблицах.
Чтобы извлечь имена таблиц, используйте следующий SQL-запрос:
Код:
SELECT name FROM sqlite_master;
Код:
test’ union select 1,name,3 from sqlite_master --
Однако администратор может ограничить доступ к этим таблицам, поэтому иногда приходится действовать методом проб и ошибок.
Предположим, что таблица с пользователями называется "user".
Добавьте в конец своего union предполагаемое имя таблицы:
Код:
union select 1,2,3 from user --
Попробуйте другое имя таблицы, например "Users".
Если запрос выполняется без ошибок, значит такая таблица существует.
Далее можно перейти к извлечению данных пользователей.
Для этого можно использовать метод проб и ошибок или вычислить поля через метаданные.
Вспомните таблицу с метаданными. Поле "sql" содержит команду для создания таблицы, в том числе и имена полей.
Попробуйте вывести в заголовок имя таблицы (name), а в описание — команду из поля "sql":
Код:
test’ union select 1,name,sql from sqlite_master --
После получения необходимой информации можно перейти к финальному этапу — извлечению данных пользователей:
Код:
test‘ union select 1,name,password from Users --
Теперь можно перейти к удалению таблицы с пользователями:
Код:
test’; drop table Users --