SQL-injections for “dummies” Что это? Способ несанкционированного доступа к данным, хранящимся в БД, основанный на внедрении в запрос произвольного SQLкода. Пример $id = $_REQUEST['id']; $res = mysql_query("SELECT * FROM news WHERE id_news = $id"); http://site.com/news.php?id=5 SELECT * FROM news WHERE id_news = 5 http://site.com/news.php?id=-1+OR+1=1 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%')"); http://site.com/news.php?search_text=qwerty 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 1. 2. 3. Time-based К уязвимому запросу добавляется синтаксически верный SQL-запрос Замеряется время обработки запроса Замеряется изменение времени обработки при изменении запроса Boolean-based Тестирование Выполняется: Программистами на основании code review DBA и/или QA – проверка настроек БД, прав пользователей, имен таблиц и т.д. QA: 1. Тестирование вручную – на основании знаний о системе и выполняемых ею функций 2. Автоматизированные тестирование – с использованием сканеров для определения потенциально опасных функций и/или возможности эксплуатации определенных функций Автоматизация Проблема: Поиск производится по «шаблону» - большое количество ложных срабатываний. Следствие: эффективность тестирования «общими» сканерами стремится к 0. Варианты решения: 1. Ручное тестирование 2. Ревъю кода 3. Использование узкоспециализированных либо «самописных» средств SQLmap Преимущества: минимальное количество ложных срабатываний возможность эксплуатации встроенными средствами развернутая информация об уязвимости простота в использовании бесплатность Недостатки: Необходимость предварительного ручного тестирования (поиск потенциальных слабостей) Необходимость минимальных технических навыков Требуется понимание принципов инъекций и их использования Методы защиты Обработка вводимых данных Ограничение прав Логгеры, триггеры Else… Links: http://en.wikipedia.org/wiki/SQL_injection http://sqlmap.sourceforge.net http://mwgrasp.oni.cc http://antichat.ru https://www.owasp.org http://www.mavitunasecurity.com/netsparker Q&A