Введение
SQL-инъекция (SQL injection) — это критическая уязвимость веб-безопасности, которая позволяет злоумышленнику вмешиваться в запросы, которые приложение отправляет к своей базе данных. Хотя многие примеры фокусируются на уязвимостях в параметрах URL (GET-запросы), формы, отправляющие данные через POST-запросы, также являются распространенными целями.
В этой лаборатории вы научитесь использовать sqlmap — мощный инструмент для тестирования на проникновение с открытым исходным кодом — для автоматизации процесса обнаружения и эксплуатации уязвимостей SQL-инъекций. В частности, вы сосредоточитесь на целевой веб-форме, которая использует метод POST для отправки данных. Вы узнаете, как перехватывать POST-данные и передавать их sqlmap для выполнения комплексного сканирования.
Определение веб-формы, использующей метод POST
На этом шаге вы запустите простой веб-сервер и определите веб-форму, использующую метод HTTP POST. POST-запросы предназначены для отправки данных на сервер с целью создания или обновления ресурса, что делает их распространенным методом для отправки форм входа, комментариев или любого другого пользовательского контента.
Сначала давайте проверим, что наше примерное веб-приложение запущено. Мы можем использовать curl для получения основной страницы.
Выполните следующую команду в вашем терминале:
curl http://localhost:8000
Вы должны увидеть HTML-исходный код простой страницы входа. Найдите тег <form> в выводе.
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h2>Login Form</h2>
<form action="login.php" method="POST">
<label for="username">Username:</label><br />
<input type="text" id="username" name="username" /><br />
<label for="password">Password:</label><br />
<input type="password" id="password" name="password" /><br /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>
Обратите внимание на атрибут method="POST" внутри тега <form>. Это указывает браузеру отправлять данные формы с помощью POST-запроса на скрипт login.php. Определение этого является первым шагом в подготовке нашего сканирования sqlmap. Вы также можете открыть браузер Firefox с рабочего стола и перейти по адресу http://localhost:8000, чтобы визуально просмотреть форму.
Перехват строки POST-данных с помощью инструментов разработчика браузера
На этом шаге вы научитесь перехватывать строку данных, отправляемую POST-запросом. sqlmap нуждается в этих данных, чтобы знать, какие параметры тестировать на SQL-инъекцию. Самый простой способ получить эту информацию — использовать встроенные инструменты разработчика вашего браузера.
- Откройте браузер Firefox из док-панели приложений слева в вашей среде LabEx.
- Перейдите по адресу
http://localhost:8000. - Нажмите
F12или щелкните правой кнопкой мыши на странице и выберите "Inspect" (Проверить), чтобы открыть Инструменты разработчика. - Нажмите на вкладку Network (Сеть) в панели Инструментов разработчика.
- На странице входа введите некоторые тестовые данные в поля формы. Например, используйте
testдля имени пользователя иtestдля пароля. - Нажмите кнопку Login (Войти).
- На вкладке Network вы увидите новую запись для
login.php. Щелкните по ней. - Откроется новая панель. Найдите вкладку с названием Request (Запрос) или Payload (Полезная нагрузка). Здесь вы найдете данные формы, которые были отправлены на сервер. Они будут выглядеть следующим образом:
username=test&password=test
Эта строка, username=test&password=test, — это именно то, что нам нужно для sqlmap. Она содержит имена параметров (username, password) и значения, которые вы отправили.
Для следующего шага сохраним эту строку данных в файл в вашем каталоге ~/project. Это не строго необходимо для использования sqlmap, но является хорошей практикой для отслеживания ваших находок.
echo 'username=test&password=test' > ~/project/post_data.txt
Использование флага --data для указания POST-параметров
На этом шаге вы составите базовую команду sqlmap с использованием флага --data. Этот флаг необходим, чтобы указать sqlmap отправлять POST-запрос и какие данные включить в тело запроса.
Базовый синтаксис для POST-сканирования в sqlmap выглядит следующим образом:
sqlmap -u "TARGET_URL" --data="POST_DATA_STRING"
-u "TARGET_URL": Указывает URL, который обрабатывает данные формы. В нашем случае этоhttp://localhost:8000/login.php.--data="POST_DATA_STRING": Предоставляет строку данных, которую вы получили на предыдущем шаге.
Давайте выполним команду, чтобы увидеть, как sqlmap обрабатывает эту информацию. Мы будем использовать строку данных, которую нашли ранее. Эта команда еще не выполнит полное сканирование; она лишь поможет нам подтвердить, что sqlmap правильно определяет POST-параметры.
Выполните следующую команду в вашем терминале:
sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test"
sqlmap запустится и покажет некоторую начальную информацию. Он правильно определит, что запрос является POST-запросом, и найдет параметры username и password. Затем он спросит, хотите ли вы их протестировать.
[INFO] POST parameter 'username' is dynamic
[INFO] POST parameter 'password' is dynamic
[WARNING] POST parameter 'password' looks like a password field. Do you want to mask its value in further requests? [Y/n] n
[INFO] testing connection to the target URL
sqlmap identified the following injection points with a total of 5 HTTP(s) requests:
---
Parameter: username (POST)
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (subquery)
Payload: username=-1695' OR 1 GROUP BY CONCAT(0x71787a7a71,(SELECT (CASE WHEN (1695=1695) THEN 1 ELSE 0 END)),0x7170766b71,FLOOR(RAND(0)*2)) HAVING MIN(0)#&password=test
Parameter: password (POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: username=test&password=test' AND 2195=2195 AND 'zxcv'='zxcv
---
[INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'
[*] ending @ ...
Вы можете нажать n на вопрос о маскировании пароля, и тогда sqlmap продолжит работу. Для этого шага вы можете позволить ему завершиться или нажать Ctrl+C, чтобы выйти после того, как увидите, что параметры были определены. Главное — понять, как работает флаг --data.
Выполнение сканирования на целевом URL с POST-данными
На этом шаге вы выполните полное сканирование цели. Чтобы сделать процесс более плавным и неинтерактивным, мы добавим еще несколько флагов к нашей команде sqlmap.
-p "username": Этот флаг указываетsqlmapсосредоточить свои тестовые усилия только на параметреusername. Это может сэкономить много времени, если вы подозреваете, что конкретный параметр уязвим.--batch: Этот флаг автоматизирует процесс, указываяsqlmapиспользовать ответ по умолчанию для всех интерактивных вопросов, которые он обычно задает. Это очень полезно для выполнения автоматических сканирований.
Теперь давайте объединим все в финальную команду. Мы нацеливаемся на URL login.php, предоставляем POST-данные, указываем параметр username для тестирования и запускаем в пакетном режиме.
Выполните следующую команду в вашем терминале:
sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test" -p "username" --batch
sqlmap начнет комплексное сканирование параметра username. Поскольку наш уязвимый скрипт использует функцию sleep() для имитации задержки базы данных, sqlmap, скорее всего, будет использовать методы слепых инъекций на основе времени. Такой тип сканирования может занять несколько минут, поскольку sqlmap необходимо отправить несколько запросов и измерить время ответа для каждого, чтобы подтвердить уязвимость.
По мере выполнения вы увидите вывод, похожий на этот:
...
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[INFO] POST parameter 'username' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...
Позвольте сканированию завершиться. Оно подтвердит, что параметр username уязвим.
Анализ результатов POST-SQL-инъекции
На этом шаге вы проанализируете вывод sqlmap, чтобы понять обнаруженную уязвимость. После завершения сканирования из предыдущего шага sqlmap представит сводку своих результатов.
Окончательный вывод будет выглядеть примерно так:
---
Parameter: username (POST)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: username=test' AND (SELECT 6113 FROM (SELECT(SLEEP(5)))bYjb) AND 'TEST'='TEST&password=test
---
[INFO] the back-end DBMS is 'MySQL >= 5.0.12'
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'
Давайте разберем этот результат:
- Parameter: username (POST): Это подтверждает, что уязвимость была найдена в параметре
usernamePOST-запроса. - Type: time-based blind: Это тип SQL-инъекции. "Blind" (слепой) означает, что приложение не возвращает ошибки базы данных в своих ответах. "Time-based" (на основе времени) означает, что
sqlmapподтвердил уязвимость, внедряя команды, вызывающие задержку по времени (например,SLEEP(5)), и измеряя время ответа сервера. - Payload: Здесь показан фактический вредоносный ввод, который
sqlmapиспользовал для подтверждения уязвимости.
sqlmap также сохраняет всю информацию о сеансе, включая журналы и результаты, в каталог. Местоположение указано в выводе, обычно ~/.sqlmap/output/. Вы можете изучить этот каталог, чтобы найти подробные журналы сканирования.
Давайте перечислим содержимое каталога с результатами для нашей цели:
ls -l ~/.sqlmap/output/localhost:8000
Вы увидите такие файлы, как log и session.sqlite. Файл log содержит полную запись сканирования, которая полезна для детального анализа и составления отчетов.
total 24
-rw-r--r-- 1 labex labex 15589 Dec 6 15:30 log
-rw-r--r-- 1 labex labex 8192 Dec 6 15:30 session.sqlite
-rw-r--r-- 1 labex labex 0 Dec 6 15:29 target.txt
Теперь вы успешно определили и подтвердили уязвимость POST-SQL-инъекции с помощью sqlmap.
Резюме
В этой лабораторной работе вы научились использовать sqlmap для проверки уязвимостей SQL-инъекций в веб-формах, использующих метод POST. Вы успешно идентифицировали POST-форму, захватили необходимую строку данных с помощью инструментов разработчика браузера и использовали флаг --data в sqlmap для указания POST-параметров. Наконец, вы выполнили сканирование с использованием флагов --batch и -p для автоматизации и проанализировали результаты, подтвердив уязвимость слепой SQL-инъекции на основе времени. Этот процесс является фундаментальным навыком для тестирования безопасности веб-приложений.


