SQL-injections for dummies
Что это? Способ несанкционированного доступа к данным, хранящимся в БД, основанный на внедрении в запрос произвольного SQL- кода.
Пример $id = $_REQUEST['id']; $res = mysql_query("SELECT * FROM news WHERE id_news = $id"); SELECT * FROM news WHERE id_news = 5 SELECT * FROM news WHERE id_news = -1 OR 1=1
Пример $search_text = $_REQUEST['search_text']; $res = mysql_query("SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news WHERE news_caption LIKE('%$search_text%')"); SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news WHERE news_caption LIKE('%Test%') ')+and+(news_id_author='1 SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news WHERE news_caption LIKE('%') AND (news_id_author='1%')
Причины Отсутствие необходимой обработки входящих запросов Отсутствие обработки ошибок Отсутствие ограничений прав
Последствия Компрометация пользовательских данных Дамп БД Внедрение бэкдора Доступ к хостовой ОС Подмена данных Внедрение данных
Основные типы UNION query Error-based Stacked queries Blind injections
UNION query SQL injection $res = mysql_query("SELECT id_news, header, body, author FROM news WHERE id_news = ". $_REQUEST['id']); -1 UNION SELECT 1, username, password, 1 FROM admin SELECT id_news, header, body, author FROM news WHERE id_news = -1 UNION SELECT 1, username, password, 1 FROM admin
Error-based SQL injection Инъекция заведомо некорректного запроса с целью получения ошибки для определения типа и версии используемой СУБД. 1. Определение уязвимостей, специфичных для данной версии. 2. Определение особенностей СУБД. 3. Определение дальнейшего вектора атаки
Stacked queries SQL injection Если веб-приложение поддерживает последовательные запросы - в уязвимый параметр HTTP-запроса добавляется точка с запятой (;) и следом внедряемый SQL- запрос. SELECT id_news, header, body, author FROM news WHERE id_news = -1; SELECT username,password FROM admin
Blind SQL-injection Time-based 1. К уязвимому запросу добавляется синтаксически верный SQL-запрос 2. Замеряется время обработки запроса 3. Замеряется изменение времени обработки при изменении запроса Boolean-based
Тестирование Выполняется: Программистами на основании code review DBA и/или QA – проверка настроек БД, прав пользователей, имен таблиц и т.д. QA: 1. Тестирование вручную – на основании знаний о системе и выполняемых ею функций 2. Автоматизированные тестирование – с использованием сканеров для определения потенциально опасных функций и/или возможности эксплуатации определенных функций
Автоматизация Проблема: Поиск производится по «шаблону» - большое количество ложных срабатываний. Следствие: эффективность тестирования «общими» сканерами стремится к 0. Варианты решения: 1. Ручное тестирование 2. Ревъю кода 3. Использование узкоспециализированных либо «самописных» средств
SQLmap Преимущества: минимальное количество ложных срабатываний возможность эксплуатации встроенными средствами развернутая информация об уязвимости простота в использовании бесплатность Недостатки: Необходимость предварительного ручного тестирования (поиск потенциальных слабостей) Необходимость минимальных технических навыков Требуется понимание принципов инъекций и их использования
Методы защиты Обработка вводимых данных Ограничение прав Логгеры, триггеры Else…
Links:
Q&A