WebSecurity 

Часть 4

SQLi

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Open Web Application Security Project

  • A1 Внедрение кода
  • A2 Некорректная аутентификация и управление сессией
  • A3 Межсайтовый скриптинг
  • A4 Нарушение контроля доступа
  • A5 Небезопасная конфигурация
  • A6 Утечка чувствительных данных
  • A7 Недостаточная защита от атак (NEW)
  • A8 Подделка межсайтовых запросов
  • A9 Использование компонентов с известными уязвимостями
  • A10 Незащищенный API (NEW)

Пример SQLi

https://vulnurable_site.com/index.php?login=admin&password=123456


$login = $_GET["login"];
$password = $_GET["password"];

$query = "SELECT * FROM articles WHERE login = '$login' AND password = '$password'";


SELECT * FROM articles WHERE login = 'admin' AND password = '123456'

Пример SQLi

Как этим можно воспользоваться?


$login = $_GET["login"];
$password = $_GET["password"];

$query = "SELECT * FROM articles WHERE login = '$login' AND password = '$password'";


SELECT * FROM articles WHERE login = 'admin'; --' AND password = '1'

SELECT * FROM articles WHERE login = 'admin';

https://vulnurable_site.com/index.php?login=admin';%20--&password=1

5 основных классов

SQL-инъекций

  • UNION query SQL injection
  • Error-based SQL injection
  • Stacked queries SQL injection
  • Boolean-based blind SQL injection
  • Time-based blind SQL injection

1. UNION query SQL injection

Классический вариант внедрения SQL-кода, когда в уязвимый параметр передается выражение, начинающееся с «UNION ALL SELECT». Эта техника работает, когда веб-приложения напрямую возвращают результат вывода команды SELECT на страницу: с использованием цикла for или похожим способом, так что каждая запись полученной из БД выборки последовательно выводится на страницу. Sqlmap может также эксплуатировать ситуацию, когда возвращается только первая запись из выборки (Partial UNION query SQL injection).

2. Error-based SQL injection

В случае этой атаки сканер заменяет или добавляет в уязвимый параметр синтаксически неправильное выражение, после чего парсит HTTP-ответ (заголовки и тело) в поиске ошибок DBMS, в которых содержалась бы заранее известная инъецированная последовательность символов и где-то «рядом» вывод на интересующий нас подзапрос. Эта техника работает только тогда, когда веб-приложение по каким-то причинам (чаще всего в целях отладки) раскрывает ошибки DBMS.

3. Stacked queries SQL injection

Сканер проверяет, поддерживает ли веб-приложение последовательные запросы, и, если они выполняются, добавляет в уязвимый параметр HTTP-запроса точку с запятой (;) и следом внедряемый SQL-запрос. Этот прием в основном используется для внедрения SQL-команд, отличных от SELECT, например для манипуляции данными (с помощью INSERT или DELETE). Примечательно, что техника потенциально может привести к возможности чтения/записи из файловой системы, а также выполнению команд в ОС. Правда, в зависимости от используемой в качестве бэк-энда системы управления базами данных, а также пользовательских привилегий.

4. Boolean-based blind SQL injection

Реализация так называемой слепой инъекции: данные из БД в «чистом» виде уязвимым веб-приложением нигде не возвращаются. Прием также называется дедуктивным. Sqlmap добавляет в уязвимый параметр HTTP-запроса синтаксически правильно составленное выражение, содержащее подзапрос SELECT (или любую другую команду для получения выборки из базы данных). Для каждого полученного HTTP-ответа выполняется сравнение headers/body страницы с ответом на изначальный запрос — таким образом, утилита может символ за символом определить вывод внедренного SQL-выражения.

4. Boolean-based blind SQL injection

В качестве альтернативы пользователь может предоставить строку или регулярное выражение для определения «true»-страниц (отсюда и название атаки). Алгоритм бинарного поиска, реализованный в sqlmap для выполнения этой техники, способен извлечь каждый символ вывода максимум семью HTTP-запросами. В том случае, когда вывод состоит не только из обычных символов, сканер подстраивает алгоритм для работы с более широким диапазоном символов (например для unicode’а).

5. Time-based blind SQL injection

Полностью слепая инъекция. Точно так же как и в предыдущем случае, сканер «играет» с уязвимым параметром. Но в этом случае добавляет подзапрос, который приводит к паузе работы DBMS на определенное количество секунд (например, с помощью команд SLEEP() или BENCHMARK()). Используя эту особенность, сканер может посимвольно извлечь данные из БД, сравнивая время ответа на оригинальный запрос и на запрос с внедренным кодом. Здесь также используется алгоритм двоичного поиска. Кроме того, применяется специальный метод для верификации данных, чтобы уменьшить вероятность неправильного извлечения символа из-за нестабильного соединения.

LOAD data INFILE '/etc/passwd' INTO TABLE test2 FIELDS TERMINATED BY ',' ENCLOSED BY '"'

Различия СУБД

Работа с файловой системой

Различия СУБД

SQL Injection

Различия СУБД

Выполнение команд на сервере

EXEC xp_cmdshell 'ipconfig /all';

Рейтинг наиболее популярных атак

SQLi сканеры

Базы

Коллекция из нескольких типов списков, используемых в процессе оценки безопасности, собранные в одном месте. Типы списков включают в себя имена пользователей, пароли, URL, чувствительные шаблоны данных, Fuzzing полезные нагрузки, веб-оболочки, и многое другое.

https://github.com/danielmiessler/SecLists

Фишки SQLMAP

  • Доступ к БД
  • Брут-форс
  • Инъекция заданных пользователем функций
  • Доступ к файловой системе
  • Доступ к оперативной системе
  • Доступ к регистру Windows
  • ...

Защита от SQLi

  • Параметризированные SQL-параметры

    • на Delphi — свойство TQuery.Params;
    • на Perl — через DBI::quote или DBI::prepare;

    • на Java — через класс PreparedStatement;

    • на C# — свойство SqlCommand.Parameters;
    • на PHP — MySQLi (при работе с MySQL), PDO.
  • WAF (не является серебряной пулей, можно обходить)

  • Не городить велосипеды типа mysql_real_escape_string() или addslashes()

  • Не показывать ошибки БД пользователю

  • Периодически сканируйте свой код

  • Разделять привилегии пользователей БД

  • Шифровать секретные данные в БД с солью

WAF

WAF

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

WAF

Cloudflare Pricing

Где потренироваться?

  • https://google-gruyere.appspot.com
  • http://www.dvwa.co.uk/
  • http://www.itsecgames.com/
  • https://www.hacksplaining.com
  • https://habrahabr.ru/company/pentestit/blog/261569/
  • https://habrahabr.ru/company/pt/blog/138779/
  • https://www.checkmarx.com/2015/04/16/15-vulnerable-sites-to-legally-practice-your-hacking-skills/​

Полезные ссылки

  • https://habrahabr.ru/post/148151/
  • https://kali.tools/?p=816
  • https://www.ptsecurity.com/upload/corporate/ru-ru/download/PT-devteev-Advanced-SQL-Injection.pdf
  • https://xakep.ru/2011/12/06/57950/
  • https://forum.antichat.ru/threads/43966/
  • https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
  • http://phpfaq.ru/mysql/slashes
  • https://habrahabr.ru/company/pt/blog/269165/
  • https://www.anti-malware.ru/reviews/web_application_firewall_market_overview_russia

Вопросы?

To be continued ...

Web Security Part 4

By James Jason

Web Security Part 4

  • 769