Сергей Мороз — SQL-injections
Download
Report
Transcript Сергей Мороз — SQL-injections
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