Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемАндрей Горетов
1 Практические аспекты сетевой безопасности Уязвимости в веб-приложениях Часть I: SQLi
2 Making things clear Недостатки (weakness) и уязвимости переполнение буфера в ls – не уязвимость! Атака: цели: технические и нетехнические технологический шпионаж, причинение вреда репутации повышение привилегий, нарушение работоспособности уязвимость –> техническая цель атаки – арность 1 к N нетехническая цель –> метод атаки – арность 1 к N уязвимости client-side и уязвимости server-side атаки на клиента и атаки на сервер софистика: XSS в интерфейсе администратора
3 Уязвимости в ПО Уязвимость – свойство ПО => адаптируем существующие подходы к анализу ПО надо различать методы обнаружения и методы эксплуатации уязвимостей Классификация подходов к анализу свойств ПО по возможностям оператора-аналитика доступ только к внешним интерфейсам ПО доступ к внутреннему представлению ПО по состоянию объекта анализа анализ во время выполнения анализ без выполнения статический анализ, динамический анализ и тестирование черного ящика
4 Тестирование черного ящика Что мы можем делать? получать «нормальные» HTTP-запросы переходить по ссылкам, заполнять формы и т.п. манипулировать полученными HTTP-запросами проигрывать их as-is, меняя порядок, от лица другого userа изменять методы и заголовки запросов; изменять URL удалять и добавлять параметры, дублировать параметры модифицировать значения параметров Что доступно для анализа? код и заголовки HTTP-ответа тело ответа время ответа
5 Типичные причины уязвимостей Некорректная обработка входных данных полное доверие заголовки, cookies, скрытые поля и т.п. проверка на стороне клиента проверка на основе черных списков ошибки при реализации белых списков нормализация данных (например, кривой HTML ) Небезопасные настройки в т.ч. пароли по умолчанию
6 SQL injection Терминология SQL injection – это название атаки недостаток: возможность внедрения операторов SQL причина: некорректная обработка входных данных Определение пользователь может изменить структуру SQL-запроса Возможные последствия нарушение конфиденциальности/целостности данных нарушение доступности (DROP DATABASE …) нарушение целостности приложения (в т.ч. операций) повышение привилегий на сервере
7 Наглядный пример SELECT * FROM DB WHERE uname=John AND cardtype=2 SELECT * FROM DB WHERE uname=John AND cardtype=2 OR 1
8 Работа с СУБД: типичный workflow Получение данных из HTTP-запроса Обработка данных на корректность Формирование SQL-запроса DML-запросы, SELECT Получение результата SQL-запроса и/или обработка исключительных ситуаций SELECT одной записи, многих записей Формирование HTTP-ответа в ответ попадает выборка из СУБД ответ зависит от успешности запроса ответ не зависит от результата SQL-запроса
9 Пример $username = $_POST["username"]; $password = $_POST["password"]; $query = "SELECT * FROM authuser WHERE uname='$username' AND passwd=MD5('$password')"; $result = mysql_query($query); if ($row = mysql_fetch_array($result, MYSQL_BOTH)) { uid = $row["uid"]; //login successful } else { //report error } mysql_free_result($result); First & Second order SQLi
10 Методы обнаружения Вызвать ошибку (синтаксическую или runtime) ошибка показывается ошибка не показывается надо различать страницы: успешный запрос, неуспешный корректный запрос, некорректный запрос Изменить размер выборки and 1=1 vs and 1=0 или or 1=1 vs and 1=1 Вызвать задержку MySQL sleep(); MSSQL WAITFOR DELAY; heavy queries Вызвать события out-of-band ping, запрос файлов по HTTP, DNS
11 Demo: обнаруживаем SQLi
bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация " title="Основные контрмеры Предотвращение использование prepared statement $stmt = $dbh->prepare("INSERT INTO TAB(name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация " class="link_thumb"> 12 Основные контрмеры Предотвращение использование prepared statement $stmt = $dbh->prepare("INSERT INTO TAB(name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация последствий реализация least privilege для подключений к СУБД вынесение сервера СУБД на отдельный узел контроль целостности приложения bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация "> bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация последствий реализация least privilege для подключений к СУБД вынесение сервера СУБД на отдельный узел контроль целостности приложения"> bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация " title="Основные контрмеры Предотвращение использование prepared statement $stmt = $dbh->prepare("INSERT INTO TAB(name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); $name = 'one'; $value = 1; $stmt->execute(); Минимизация ">
13 Типичный workflow эксплуатации Определить доступные базы Узнать имена таблиц в каждой базе Узнать количество, имена и тип столбцов Узнать содержимое каждой таблицы Обычно в СУБД есть системные таблицы с мета-информацией
14 Demo: мета-информация в MySQL
15 MySQL (>= 5.0) Получение схемы: SELECT schema_name FROM information_schema.schemata SELECT table_name FROM information_schema.tables WHERE table_schema = … SELECT column_name FROM information_schema.columns WHERE table_schema = … AND table_name … SELECT column_name FROM schema_name.table_name Получение общего числа записей: SELECT count(*) FROM … WHERE … Получение записей по одной (0
16 Методы эксплуатации (1 из 2) Ошибка СУБД выводится в HTTP-ответ вызывать runtime-ошибки SELECT name, desc FROM names WHERE uid = 1 UNION (SELECT count(*), concat(string,floor(rand(0)*2)) AS x FROM table GROUP BY x) string может быть version() или (SELECT schema_name FROM information_schema.schemata LIMIT j,1) самостоятельное исследование: почему rand(0)? Выборка выводится в HTTP-ответ использовать UNION SELECT name, desc FROM names WHERE uid = 1 UNION SELECT, schema_name FROM information_schema.schemata
17 Demo: Proof of Concept
18 Методы эксплуат ации (2 из 2) Ни ошибка, ни выборка не выводится в ответ задавать вопросы да/нет ловим задержку или различие в страницах Определение целого (метод бисекции): SELECT * FROM users WHERE uid = 1 and (SELECT count(*) FROM information_schema.schemata) < 1000 –– Определение строки: SELECT * FROM users WHERE uid = 1 and (SELECT length(column) FROM table LIMIT j,1) < 100 –– SELECT * FROM users where uid = 1 and (SELECT substr(column,i,1) FROM table LIMIT j,1) > 'a' -- Автоматизация: sqlMap, Toolza
19 Demo: автоматизация!
20 Домашнее задание Максимально далеко пройти в лабораторной работе от Дмитрия Евтеева задания ищите на Установить HacMe Bank v2 и найти там SQLi какие технические цели можно достичь, используя эту уязвимость? Перечислите их и опишите методы Ссылки: Книга «SQL Injection Attacks and Defense» Блог Reinersа: Блог Дмитрия Евтеева:
21 Вопросы?
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.