Типы SQL-инъекций (SQLi)

Типы SQL-инъекций (SQLi)

Этичный Хакер

SQL-инъекция - это атака, в которой используется вредоносный код SQL для манипулирования внутренними базами данных с целью получения информации, которая не предназначалась для показа. Данные могут включать конфиденциальные корпоративные данные, списки пользователей или конфиденциальные данные потребителей. В этой статье приведены типы SQL-инъекций с их примерами. SQL-инъекции-ЛАБОРАТОРИИ (платформа для изучения SQL-инъекций), демонстрирующие, как вы можете выполнять каждый тип SQL-инъекций.

Типы SQL-инъекций:

 

1. SQL-инъекции на основе ошибок:

SQL-инъекции на основе ошибок получают информацию о структуре базы данных из сообщений об ошибках, выдаваемых сервером базы данных. В редких случаях злоумышленник может перечислить всю базу данных, используя только SQL-инъекцию на основе ошибок.

Пример:

В лабораториях SQL-инъекций, если вы введете ?id=1 в URL-адрес и нажмете enter, вам будут предоставлены имя пользователя и пароль.

 

Но если мы введем ?id=1’, это выдаст ошибку.

 

Теперь эта ошибка поможет нам найти внутренний запрос.

Если мы удалим первую и последнюю кавычки из "1" LIMIT 0,1", то она станет "1" LIMIT 0,1.

1' - это наши входные данные, и одинарная кавычка после этого ввода указывает на то, что наши входные данные заключены в одинарные кавычки. Это означает, что запрос, который был выполнен обратно в базе данных, был следующим:

Запрос:

select * from table_name where id='1

что синтаксически неверно. Теперь мы исправим этот запрос, указав input ?id=1' -+ .

-+ закомментирует все, что последует за ним. Итак, наш внутренний запрос будет следующим:

Запрос:

select * from table_name where id='1' --+'

и снова мы получаем имя пользователя и пароль.

 

Теперь мы можем вставить запрос между предложением и -+ для извлечения данных из базы данных.

2. SQL-инъекции на основе объединения:

SQL-инъекции на основе объединения используют оператор UNION SQL для объединения результатов двух или более запросов SELECT в один результат, который впоследствии возвращается как часть HTTP-ответа.

Запрос:

SELECT EMP_ID, EMP_DOJ FROM EMP 
UNION SELECT dept_ID, dept_Name FROM dept;

Этот SQL-запрос создаст единый результирующий набор с двумя столбцами, включая значения из столбцов EMP EMP_ID и EMP_DOJ и столбцов dept dept_ID и dept_Name.

Для того чтобы запрос ОБЪЕДИНЕНИЯ функционировал, необходимо удовлетворить две важные потребности:

  • Каждый запрос должен возвращать одинаковое количество столбцов.
  • Типы данных должны быть одинаковыми, т.е. они не изменяются после выполнения запроса.

Чтобы определить количество столбцов, требуемых при атаке объединения SQL-инъекций, мы введем последовательность предложений ORDER BY и увеличим предоставленный индекс столбца, пока не будет обнаружена ошибка.

?id=1' order by 1 --+ no error
?id=1' order by 2 --+ no error
?id=1' order by 3 --+ no error
?id=1' order by 4 --+ we get error

Это демонстрирует, что в запросе отсутствует четвертый столбец. Итак, теперь мы знаем, что запрос в серверной части состоит из трех столбцов.

Теперь мы будем использовать оператор UNION, чтобы объединить два запроса и иметь возможность обнаруживать уязвимые столбцы.

Запрос:

id=1‘ UNION SELECT 1,2,3 --+

Проблем нет, но мы получаем результирующий набор первого запроса; чтобы получить результат второго запроса select на экране, мы должны сделать результирующий набор первого запроса ПУСТЫМ. Это может быть достигнуто путем предоставления идентификатора, который не существует (отрицательный идентификатор).

Запрос:

?id=-1‘ UNION SELECT 1,2,3 --+

Это демонстрирует, что мы получаем значения из столбцов 2 и 3 в качестве выходных данных. В результате мы можем использовать эти два столбца для извлечения информации о базе данных и из нее.

Запрос:

?id=-1‘ UNION SELECT 1,version(),database() --+

Это предоставит базу данных, которую мы используем в настоящее время, а также текущую версию базы данных, используемой в серверной части.

3. Слепые логические SQL-инъекции:

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

Пример:

В лабораториях SQL-инъекций, если мы введем ?id=1 в URL-адрес браузера, запрос, который будет отправлен в базу данных, будет:

Запрос:

SELECT * from table_name WHERE id=1

Он выведет “вы находитесь в” желтым шрифтом на веб-странице, как видно на изображении.

 

Когда злоумышленник пытается использовать запятую (‘) ?id=1’, чтобы прервать этот запрос, он не сможет найти уведомление об ошибке, используя любой другой метод. Кроме того, если злоумышленник попытается ввести неверный запрос, как показано на рисунке, желтый текст исчезнет.

 

Затем злоумышленник использует слепую SQL-инъекцию, чтобы убедиться, что запрос на внедрение возвращает результат true или false.

?id=1' И 1=1 --+

Теперь база данных проверяет, равно ли 1 1 для заданного условия. Если запрос является законным, он возвращает TRUE; как видно на скриншоте, у нас есть текст желтого цвета “вы в”, указывающий, что наш запрос действителен.

 

В результате это подтверждает, что веб-приложение уязвимо для слепой SQL-инъекции. Мы получим информацию о базе данных, используя условия true и false.

Теперь мы введем следующий запрос, который задаст вопрос, равна ли длина строки базы данных 1, и он ответит возвращением TRUE или FALSE через текст “вы находитесь внутри”.

?id=1' И (длина (база данных())) = 1 --+

Как вы можете видеть на изображении, текст снова исчезает, указывая, что он вернул FALSE для ответа НЕТ, длина строки базы данных не равна 1.

Когда мы проверяем длину строки, равную 8, она возвращает yes, и снова появляется желтый текст “вы находитесь внутри”.

 

4. Слепые инъекции SQL на основе времени:

Основанная на времени SQL-инъекция работает, отправляя SQL-запрос в базу данных и заставляя его ждать заданный промежуток времени (в секундах) перед ответом. Время ответа покажет злоумышленнику, является ли результат запроса истинным или ЛОЖНЫМ.

В зависимости от результата HTTP-ответ будет либо отложен, либо возвращен немедленно. Даже если данные из базы данных не возвращаются, злоумышленник может определить, возвращала ли используемая полезная нагрузка значение true или false. Поскольку злоумышленник должен перечислять базу данных посимвольно, эта атака часто происходит медленно (особенно на больших базах данных).

And SLEEP(10) if sleep then Vulnerable
OR SLEEP(10) if sleep then vulnerable

Report Page