Введение
SQL-инъекция - это популярная техника, используемая атакующими для эксплойта веб-приложений путем создания вредоносного ввода и выполнения произвольных SQL-инструкций в бэкенд-базе данных. В этом лабораторном занятии (LabEx) мы настроим среду для SQL-инъекции, используя sqli-labs с Docker, и проведем практические эксперименты, чтобы понять принципы и методы эксплойта уязвимостей SQL-инъекции.
Определение точек инъекции
Добро пожаловать в наш вводный курс по тестированию веб-безопасности, в котором мы сосредоточимся на выявлении потенциальных уязвимостей SQL-инъекции. SQL-инъекция - это распространенная и потенциально разрушительная уязвимость безопасности в веб-приложениях, но с правильными знаниями вы можете научиться выявлять и предотвращать ее.
Что такое SQL-инъекция?
SQL-инъекция - это техника, при которой атакующий вставляет вредоносный SQL-код в запрос к базе данных веб-приложения. Если веб-приложение не корректно очищает пользовательский ввод, это может привести к утечке данных, потере данных или другим серьезным проблемам.
Определение потенциальных точек SQL-инъекции
Веб-приложения, взаимодействующие с базой данных, часто имеют URL-адреса, содержащие параметры. Эти параметры могут быть потенциально эксплуатируемыми, если они не корректно очищены. Например, вы можете увидеть URL-адрес, который выглядит следующим образом:
http://some-website.com/page.php?id=XX
В этом URL-адресе id - это параметр, который взаимодействует с базой данных. Любая веб-страница, использующая такие параметры, может быть потенциально уязвима к SQL-инъекции, если ввод не корректно очищен.
Тестирование на наличие SQL-инъекции: метод одинарной кавычки
Одним простым способом проверить наличие уязвимостей SQL-инъекции является использование метода одинарной кавычки. Вот как это делается:
- Добавьте одинарную кавычку (
') к значению параметра в URL-адресе. Например, вы можете изменить URL-адрес так, чтобы он выглядел следующим образом:http://some-website.com/page.php?id=1' - Если веб-страница возвращает ошибку после нажатия клавиши 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. Вот как это делается:
- Введите
http://some-website.com/page.php?id=x and 1=1в адресную строку браузера. Если страница загружается как обычно, перейдите к следующему шагу. - Теперь попробуйте
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'. Вот как это делается:
- Введите
http://some-website.com/page.php?id=x' and '1'='1в адресную строку браузера. Если страница загружается как обычно, перейдите к следующему шагу. - Теперь попробуйте
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, специально разработанное с умышленными уязвимостями, что делает его идеальным инструментом для изучения безопасности веб-приложений.
Скачайте Docker-образ sqli-labs: Docker-образ sqli-labs доступен для скачивания на Docker Hub. Используйте следующую команду в терминале для его загрузки:
docker pull acgpiano/sqli-labsЗапустите 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-инъекции, которые часто встречаются в веб-приложениях, если не реализована правильная очистка входных данных.