Slide 1

Slide 1 text

Заголовок ptsecurity.com Эвристические методы защиты приложений Руководитель группы исследований технологий защиты Positive Technologies Денис Колегов

Slide 2

Slide 2 text

Заголовок • Руководитель группы исследований технологий защиты Позитив Текнолоджис • Доцент, к.т.н., доцент кафедры защиты информации и криптографии ТГУ • https://twitter.com/dnkolegov • [email protected] # whoami

Slide 3

Slide 3 text

Заголовок • Введение • Теория WAF • Методы защиты веб-приложений • Аутентификация веб-форм • Обнаружение инъекций • Встроенное распознавание • Виртуальный патчинг # План

Slide 4

Slide 4 text

Заголовок • Учебно-демонстрационный межсетевой экран веб-приложений • Shockfish WAF • https://github.com/PositiveTechnologies/shockfish • Shockfish.js Client-side WAF • https://github.com/PositiveTechnologies/shockfish.js # Shockfish

Slide 5

Slide 5 text

Заголовок Введение

Slide 6

Slide 6 text

Заголовок Веб-приложение – клиент-серверное приложение, в котором клиентом является веб-браузер, сервером – веб-сервер, а протоколом взаимодействия между ними – веб-протокол Базовый состав • Веб-браузер • Веб-сервер / Сервер приложений • СУБД Определение

Slide 7

Slide 7 text

Заголовок Огромное количество технологий и их реализаций Простота использования Доступность и распространенность Низкий порог входа • Для разработчиков • Для пентестеров / баг-хантеров • Для злоумышленников Особенности

Slide 8

Slide 8 text

Заголовок Необходимо построить многоуровневую защиту В принципе невозможно устранить уязвимость в самом приложении • Legacy • Third-party Необходимый механизм защиты отсутствует или сложно реализуем • Защита от подбора паролей • Управление доступом • Защита от нежелательной автоматизации Необходимо немедленно устранить обнаруженную уязвимость до ее реального устранения в исходном коде А что если …?

Slide 9

Slide 9 text

Заголовок В 1990-х годах активно используется принцип внешнего монитора безопасности Текущий подход: разрабатывать приложения защищенными, а не полагаться на внешние механизмы защиты Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума Как правильно защищать приложения?

Slide 10

Slide 10 text

Заголовок Теория WAF

Slide 11

Slide 11 text

Заголовок • 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

Slide 12

Slide 12 text

Заголовок Классический WAF

Slide 13

Slide 13 text

Заголовок Развертывание: • Bridge • Router • Reverse proxy • Embedded • Out-of band (SPAN/RSPAN) Доставка: • Hardware integrated • Appliance • Claud • Software-only (software, web-server module, middleware, … ) • Software integrated (RASP) Классификация

Slide 14

Slide 14 text

Заголовок Detective • Первичная валидация данных (методы, длина запроса, длина и число заголовков, …) • Обнаружение инъекций Mitigative - ослабление атак, от которых трудно защититься • Проверка на соответствие RFC • Аутентификация сообщений • Шифрование URL или скрытых полей • Маскирование данных • Блокирование IP-адреса или завершение сессии Предотвращение (prevention) – предотвращение использования обнаруженных уязвимостей • Виртуальный патчинг Механизмы защиты

Slide 15

Slide 15 text

Заголовок WAF Data-flow Model

Slide 16

Slide 16 text

Заголовок • Валидация HTTP-запроса (метод, длина запросов, количество заголовков и т.д.) • Нормализация HTTP-запроса (HTTP Parameter Pollution & Contamination) • Обнаружение инъекций (SQLi, LDAP, XPath и т.д.) • Парсинг данных (XML, JSON, AMF и т.д.) • Проверка репутации IP Обработка запросов

Slide 17

Slide 17 text

Заголовок Обнаружение утечек данных: • stack traces • debug information • application errors Обнаружение недостатков конфигураций: • отсутствие заголовков безопасности • небезопасная политика CSP • небезопасная конфигурация SSL/TLS Обработка ответов

Slide 18

Slide 18 text

Заголовок Корреляция запросов и ответов HTTP: • обнаружение отражения параметров запроса в ответе (Reflected XSS, Open Redirect, HTTP Response Splitting) • обнаружение успешной эксплуатации уязвимости (например, наличие вектора Path Traversal в запросе и содержимого файла /etc/passwd в ответе) • User tracking – ассоциирование запросов и ответов с учетными записями пользователей защищаемого веб-приложения Обработка транзакций

Slide 19

Slide 19 text

Заголовок • 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 и т.д.) Поведенческий анализ

Slide 20

Slide 20 text

Заголовок Теория • Теория формальных языков • LangSec Практика • Модель черного ящика • Множество технологий • Отсутствие стандартов • Развитие клиентских частей веб-приложений Источники ограничений

Slide 21

Slide 21 text

Заголовок Входные данные – формальный язык WAF – универсальный распознаватель (recognizer) языков атак на веб- приложения Можно распознать эквивалентный или менее мощный язык Теория формальных языков Грамматика Распознаватель Типа 0 Машина Тьюринга Контекстно-зависимая Линейно-ограниченный автомат Недетерминированная контекстно-свободная Недетерминированный автомат с магазинной памятью Детерминированная контекстно-свободная Недетерминированный автомат с магазинной памятью Регулярная Конечный автомат LangSec: Language-theoretic security

Slide 22

Slide 22 text

Заголовок Недостаточное (неэффективное) распознавание (insufficient recognition) • распознавание КС-языка с помощью регулярного выражения Различимость парсеров (parser differentials) • одни и те же входные данные распознаются парсерами по-разному Входные данные сложнее чем детерминированный контекстно- свободный язык Проблемы M. Patterson, S. Bratus, etc. The Seven Turrets of Babel: A Taxonomy of LangSec Errors and How to Expunge Them

Slide 23

Slide 23 text

Заголовок Предположение. Язык инъекций КС-языка является как минимум КЗ-языком • ' or '1 ' = '1 Язык инъекций как минимум содержит цепочки (вектора) целевого языка, а значит является КС-языком • select * from foo where id = • (select ((1))) При этом префикс и постфикс являются контекстно-зависимыми Проблемы

Slide 24

Slide 24 text

Заголовок Веб-приложение для WAF – это просто последовательность запросов и / или ответов Непонимание контекста Непонимание логики взаимодействия • Боты • Взлом аккаунта • Злоупотребления (abuse / misuse) Модель черного ящика

Slide 25

Slide 25 text

Заголовок • 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 Множество технологий

Slide 26

Slide 26 text

Заголовок Минута из жизни WAF

Slide 27

Slide 27 text

Заголовок Минута из жизни 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

Slide 28

Slide 28 text

Заголовок Минута из жизни 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

Slide 29

Slide 29 text

Заголовок Минута из жизни WAF GET /app?pageId= 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

Slide 30

Slide 30 text

Заголовок Минута из жизни WAF GET /app?pageId= 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

Slide 31

Slide 31 text

Заголовок Минута из жизни WAF GET /app?pageId=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 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

Slide 32

Slide 32 text

Заголовок Минута из жизни WAF GET /app?pageId=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 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

Slide 33

Slide 33 text

Заголовок Минута из жизни 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

Slide 34

Slide 34 text

Заголовок Минута из жизни 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 = alert(1) Исходный код

Slide 35

Slide 35 text

Заголовок Минута из жизни 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 alert(1)

Slide 36

Slide 36 text

Заголовок Минута из жизни 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 window.opener.delete_user_data({"status":0,"token":"ItHumYWI[...snip..]","oauthstate":"1234","tokenid":"ToKeN1234 ","tokenexp":"0","gid":"401223423..","url":"http://example.com"});

Slide 37

Slide 37 text

Заголовок Минута из жизни 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 window.opener.delete_user_data({"status":0,"token":"ItHumYWI[...snip..]","oauthstate":"1234","tokenid":"ToKeN1234 ","tokenexp":"0","gid":"401223423..","url":"http://example.com"});

Slide 38

Slide 38 text

Заголовок Минута из жизни WAF GET /app?page=1&page=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 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

Slide 39

Slide 39 text

Заголовок Минута из жизни WAF GET /app?page=1&page=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 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

Slide 40

Slide 40 text

Заголовок Минута из жизни 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

Slide 41

Slide 41 text

Заголовок Минута из жизни 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

Slide 42

Slide 42 text

Заголовок Минута из жизни 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

Slide 43

Slide 43 text

Заголовок Минута из жизни 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

Slide 44

Slide 44 text

Заголовок Эвристические методы защиты

Slide 45

Slide 45 text

Заголовок • Аутентификация веб-форм • Обнаружение инъекций • Встроенное распознавание • Виртуальный патчинг Методы защиты

Slide 46

Slide 46 text

Заголовок Аутентификация веб-форм

Slide 47

Slide 47 text

Заголовок В чем проблема? POST /update HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded price=100&role=user&quantity=1&[email protected]

Slide 48

Slide 48 text

Заголовок • CSRF • SSRF • Injections (SQLi, XSS, LDAPi, …) • Access control attacks (IDOR) • Business logic attacks Форма одна, атак много…

Slide 49

Slide 49 text

Заголовок Пример

Slide 50

Slide 50 text

Заголовок «Подписи запросов» 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 Механизм защиты

Slide 51

Slide 51 text

Заголовок Client ← Server: p, h(k, p) Client → Server: p', h(k, p) Server: h(k, p) = h(k, p') Параметры: • h – функция HMAC • p – значение параметра • k – секретный ключ сервера Элементарный протокол

Slide 52

Slide 52 text

Заголовок Элементарный протокол POST /update HTTP/1.1 Host: server.com Content-Type: application/x-www-form-urlencoded price=100

Slide 53

Slide 53 text

Заголовок Содержание в формах большого количества полей Различное представление форм для различных клиентов Наличие в формах опциональных элементов • Checkbox • Option • Radio Идентификация защищаемых форм в HTTP-ответах Идентификация скрытых элементов форм в HTTP-запросах Ввод данных на стороне клиента Сложности на практике

Slide 54

Slide 54 text

Заголовок Client ← Server: p, h(k, p) Client → Server: p', h(k, p) Server: h(k, p) = h(k, p') Как использовать этот протокол если значение p формируется в браузере на основе ввода пользователя? Ввод данных на стороне клиента

Slide 55

Slide 55 text

Заголовок 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)

Slide 56

Slide 56 text

Заголовок 1. Построение Authentication Base String (ABS) • Method • URL • Идентификатор сессии • Параметры • Имя • [Значение] • [Тип] Метод вычисления токена

Slide 57

Slide 57 text

Заголовок 2. Построение контейнеров формы • Контейнер скрытых полей - HFC HFC = {hp1_name , …, hpM_name } • Контейнер опциональных полей - OFC OFC = { {op1_name , op1_value1 , …, op1_valueN1 }, …, {opL_name , opL_value1 , …, opL_valueNL } } Метод вычисления токена

Slide 58

Slide 58 text

Заголовок 3. Вычисление подписи signature = HMAC(k, HFC · OFC · HMAC(k, ABS, time)) • k – секретный ключ • time – текущее значение времени Метод вычисления токена

Slide 59

Slide 59 text

Заголовок 1. Парсинг входящего HTTP-запроса 2. Проверка метода запроса 3. Проверка наличия токена 4. Для POST-запроса по полученному URL выполняется поиск политики 5. Если политика найдена, то распаковываются данные из токена 6. Проверка опциональных и скрытых полей, если они есть 7. Формирование ABS и его проверка Метод проверки токена

Slide 60

Slide 60 text

Заголовок • Нельзя защитить формы, динамически сгенерированные на стороне клиента средствами JavaScript • Нельзя защитить формы, отправленные средствами JavaScript • Необходимо различать запросы, отправленные средствами веб-форм от запросов AJAX • Сложно защитить формы, отправляемые на сервер методом GET Ограничения метода

Slide 61

Slide 61 text

Заголовок • Защита приложения от анализа • Уменьшение поверхности атак на приложение • Противодействие средствам автоматизации • Предотвращение использования известных эксплойтов Результаты

Slide 62

Slide 62 text

Заголовок Пример: исходная форма

Slide 63

Slide 63 text

Заголовок Пример: описание языка Регулярный язык: \d+

Slide 64

Slide 64 text

Заголовок Пример: генерация токена 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)

Slide 65

Slide 65 text

Заголовок Пример: новая форма

Slide 66

Slide 66 text

Заголовок Пример: аутентичный запрос 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 protected]&token=2341234123…

Slide 67

Slide 67 text

Заголовок Пример: атака 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 protected]&token=

Slide 68

Slide 68 text

Заголовок Пример: атака повтора 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…

Slide 69

Slide 69 text

Заголовок Пример: атака на бизнес-логику 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 protected]&token=2341234123…

Slide 70

Slide 70 text

Заголовок Пример: атака 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…

Slide 71

Slide 71 text

Заголовок Пример: атака 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 protected]&token=2341234123…

Slide 72

Slide 72 text

Заголовок Пример: атака 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=&role=user&token=2341234123…

Slide 73

Slide 73 text

Заголовок Обнаружение инъекций

Slide 74

Slide 74 text

Заголовок 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

Slide 75

Slide 75 text

Заголовок Основной признак инъекции

Slide 76

Slide 76 text

Заголовок Алгоритм формирования выходных данных DOUTPUT на основе входных данных DINPUT уязвим к атаке инъекции, если дерево разбора (parse tree) для DOUTPUT зависит от DINPUT Признак уязвимости к инъекции

Slide 77

Slide 77 text

Заголовок Пример http://example.com/foo.html#1 http://example.com/foo.html#1;alert(1); var input = location.hash.slice(1); document.write("var foo = "+ input +"; "); var foo = 1;alert(1); <script> <script> var foo = 1; <script>

Slide 78

Slide 78 text

Заголовок Пример var foo = 1; var foo = 1; alert(1);

Slide 80

Slide 80 text

Заголовок Нормализация

Slide 81

Slide 81 text

Заголовок Нормализация – процесс преобразования данных к виду, понимаемому защищаемым веб- приложением Цель – устранение недостатка типа Differential Parsing Кодирование • URL decoding • Null-byte string termination • BASE64 decoding • HTML entities decoding • Double encoding Парсинг • URL Path • HTTP Parameters • Hostname Нормализация

Slide 82

Slide 82 text

Заголовок Пример 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

Slide 83

Slide 83 text

Заголовок Пример 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 #

Slide 84

Slide 84 text

Заголовок Обработка Path

Slide 85

Slide 85 text

Заголовок HTTP Parameter Pollution

Slide 86

Slide 86 text

Заголовок HTTP Parameter Contamination

Slide 87

Slide 87 text

Заголовок Основные принципы нормализации • приведение обрабатываемых данных к такому же формату и виду, к каким приведет его защищаемое веб-приложение • эквивалентный парсинг 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 Нормализация

Slide 88

Slide 88 text

Заголовок Negative Security Model

Slide 89

Slide 89 text

Заголовок Лексический подход (регулярные выражения) Лексико-сигнатурный подход • Libinjection (Nick Galbreath) Синтаксический подход (parsing-based) • Dejector (Patterson, Hansen) • Libdetection (Wallarm) • Waf.js (Positive Technologies) • Indexed syntax graph (Shape Security) Negative Security Model

Slide 90

Slide 90 text

Заголовок Лексический подход

Slide 91

Slide 91 text

Заголовок Использование регулярных выражений (конечных автоматов) для распознавания регулярного языка атак Имеется L – регулярный язык атак, заданный регулярными выражениями R Если входное слово принадлежит языку L, т. е. допускается регулярным выражением из R, то входное слово – атака Лексический подход

Slide 92

Slide 92 text

Заголовок Лексический подход (?:\/[^\?\/]+\.(?: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)\b\W*?=|[^\w\x80-\xFF]*?[\!\&\|][^\w\x80- \xFF]*?\()|\)[^\w\x80-\xFF]*?\([^\w\x80-\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

Slide 93

Slide 93 text

Заголовок Лексический подход Reflected File Download

Slide 94

Slide 94 text

Заголовок Лексический подход SQL Injection # Detect SQL Comment Sequences (/\*!?|\*/|[';]--|--[\s\r\n\v\f]|(?:--[^-]*?-)|([^\-&])#.*?[\s\r\n\v\f]|;?\\x00) # SQL Hex Evasion Methods (?i:(?:\A|[^\d])0x[a-f\d]{3,}[a-f\d]*)+ # String Termination/Statement Ending Injection Testing (^[\"'`´’‘;]+|[\"'`´’‘;]+$) # SQL Operators (?i:(\!\=|\&\&|\|\||>>|<<|>=|<=|<>|<=>|\bxor\b|\brlike\b|\bregexp\b|\bisnull\b)|(?:not\s+between\s+0\s+and)|(?:is\s+null)|(like\s+ null)|(?:(?:^|\W)in[+\s]*\([\s\d\"]+[^()]*\))|(?:\bxor\b|<>|rlike(?:\s+binary)?)|(?:regexp\s+binary)) # SQL Tautologies (?i:([\s'\"`´’‘\(\)]*?)\b([\d\w]++)([\s'\"`´’‘\(\)]*?)(?:(?:=|<=>|r?like|sounds\s+like|regexp)([\s'\"`´’‘\(\)]*?)\2\b|(?:!=|<=|>=|<>|<|>|\^|is\s +not|not\s+like|not\s+regexp)([\s'\"`´’‘\(\)]*?)(?!\2)([\d\w]+)\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)e\W*\(| information_schema|pg_(catalog|toast)|northwind|tempdb))

Slide 95

Slide 95 text

Заголовок Лексический подход 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 ct\b(?:.{1,100}?\b(?:(?:length|count|top)\b.{1,100}?\bfrom|from\b.{1,100}?\bwhere)|.*?\b(?:d(?:ump\b.*\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(?:nion\b.{1,10 0}?\bselect|tl_(?:file|http))|d(?:b(?:a_users|ms_java)|elete\b\W*?\bfrom)|group\b.*\bby\b.{1,100}?\bhaving|open(?:rowset|owa_util|query)|load\b\W* ?\bdata\b.*\binfile|(?:n?varcha|tbcreato)r|autonomous_transaction)\b|i(?:n(?:to\b\W*?\b(?:dump|out)file|sert\b\W*?\binto|ner\b\W*?\bjoin)\b|(?:f(?: \b\W*?\(\W*?\bbenchmark|null\b)|snull\b)\W*?\()|print\b\W*?\@\@|cast\b\W*?\()|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*\(|llation\W* \(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_inaddr\b|\bsys_context\b|'(?:s(?:qloledb|a)|msdasql|dbo)'))

Slide 96

Slide 96 text

Заголовок Регулярные выражения – определение языка атак Правила – определение контекста и логики Правила • Условия • Ограничения • Контекст • Источники • Корреляции • Реакции Правила

Slide 97

Slide 97 text

Заголовок Пример правил 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

Slide 98

Slide 98 text

Заголовок Пример правил: 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;

Slide 99

Slide 99 text

Заголовок • Использует бальную систему (scoring) • Не использует сигнатуры Пример правил: NAXSI

Slide 100

Slide 100 text

Заголовок Пример правил: 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}"

Slide 101

Slide 101 text

Заголовок Пример правил: 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" } } ] } }

Slide 102

Slide 102 text

Заголовок Лексико-сигнатурный подход

Slide 103

Slide 103 text

Заголовок Предложил Nick Galbreath в 2012 для обнаружения SQL-инъекций Позднее данный подход был адаптирован для обнаружения XSS Реализован в библиотеке libinjection Основные идеи • Токенизация в соответствии с универсальной грамматикой лексера в 3-х контекстах • Строится свертка токенов • Строка из первых пяти токенов ищется в базе сигнатур • База сигнатур строится по популярным векторам атак Лексико-сигнатурный подход

Slide 104

Slide 104 text

Заголовок Пример input = 42" or "1"="1" -- 1

Slide 105

Slide 105 text

Заголовок Пример input = 42" or "1"="1" -- Context AS_IS = 42" or "1"="1" -- 1

Slide 106

Slide 106 text

Заголовок Пример 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

Slide 107

Slide 107 text

Заголовок Пример 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 Сигнатура

Slide 108

Slide 108 text

Заголовок Пример 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

Slide 109

Slide 109 text

Заголовок Пример input = 42" or "1"="1" -- 2

Slide 110

Slide 110 text

Заголовок Пример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2

Slide 111

Slide 111 text

Заголовок Пример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2 ('s', ' \'42" or "1"="1" --'): string Токены

Slide 112

Slide 112 text

Заголовок Пример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2 ('s', ' \'42" or "1"="1" --'): string Токены s Сигнатура

Slide 113

Slide 113 text

Заголовок Пример input = 42" or "1"="1" -- Context SINGLE_QUOTE = '42" or "1"="1" -- 2 ('s', ' \'42" or "1"="1" --'): string Токены s Сигнатура

Slide 114

Slide 114 text

Заголовок Пример input = 42" or "1"="1" -- 3

Slide 115

Slide 115 text

Заголовок Пример input = 42" or "1"="1" -- Context DOUBLE_QUOTES = "42" or "1"="1" -- 3

Slide 116

Slide 116 text

Заголовок Пример 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 Токены

Slide 117

Slide 117 text

Заголовок Пример 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

Slide 118

Slide 118 text

Заголовок Пример 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

Slide 119

Slide 119 text

Заголовок &(1)U &(1)o &(1o( &(1of &(1os &(1ov &(f() &(nof &(nos &(nov &(s)U Примеры сигнатур https://github.com/client9/libinjection/blob/master/src/fingerprints.txt

Slide 120

Slide 120 text

Заголовок Фрагмент ядра libinjection libinjection: src/libinjection_sqli.c

Slide 121

Slide 121 text

Заголовок Пример использования Shockfish: shockfish/protectors/sqli.py

Slide 122

Slide 122 text

Заголовок Ложные срабатывания • 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

Slide 123

Slide 123 text

Заголовок Неизвестные контексты Michael Stepankin. Advanced Web Application Fuzzing

Slide 124

Slide 124 text

Заголовок Синтаксический подход

Slide 125

Slide 125 text

Заголовок Впервые применение парсеров для обнаружения инъекций было описано в работе Роберта Хансена и Мередит Паттерсон «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 Синтаксический подход

Slide 126

Slide 126 text

Заголовок Ленивые – эвристическое использование готовых парсеров • DOMPurify • DOMSanitizer Грамматические • libdetection (Wallarm) • libdejection (PT AF, DBFW) • libprotection (PT AI) В идеале необходимо использовать парсеры целевых компьютерных систем, для предотвращения уязвимостей типа «parser differentials» Новые методы

Slide 127

Slide 127 text

Заголовок Строка s - инъекция для языка L(G), если в построенном дереве разбора s по грамматике G содержится хотя бы одна опасная инструкция • 11111 • alert(1) Базовая идея – с использованием готового парсера построить дерево разбора; если дерево разбора содержит запрещенные узлы-нетерминалы, то исходная строка является инъекцией Характеристики подхода • Возможность использования готовых парсеров • Универсальность • Эвристичность • Различимость парсеров Ленивый метод

Slide 128

Slide 128 text

Заголовок Пример: DOM-based XSS http://ex.com/foo.html#1 var input = location.hash.slice(1); document.write("var foo = "+ input +";"); var foo = 1; <script> Program ExpressionStatement Literal

Slide 129

Slide 129 text

Заголовок Пример: DOM-based XSS http://ex.com/foo.html#1;alert(1) var input = location.hash.slice(1); document.write("var foo = "+ input +";"); var foo = 1;alert(1); <script> Program ExpressionStatement Literal ExpressionStatement CallExpression Identifier Literal

Slide 130

Slide 130 text

Заголовок Запрещенные нетерминалы (опасные конструкции) в простейшем случае задаются перечнем типов узлов Для уменьшения числа ложных срабатываний могут быть использованы дополнительные проверки на основе родительских или дочерних узлов Что делать, когда дерево разбора не может быть построено? ""};alert(1);var f={t:" Поиск вредоносного кода

Slide 131

Slide 131 text

Заголовок Вход: строка S, контекст CTX Выход: является ли S инъекцией в контексте CTX? 1. Построить tokens – список токенов s в CTX 2. Построить дерево разбора для S в CTX 3. Если в дереве есть запрещенные узлы, то S – инъекция 4. Иначе удалить из S следующий токен 5. Если S – непустая строка, то перейти на шаг 2 Метод поиска с левым приведением

Slide 132

Slide 132 text

Заголовок 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

Slide 133

Slide 133 text

Заголовок 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.

Slide 134

Slide 134 text

Заголовок Пример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " 1

Slide 135

Slide 135 text

Заголовок Пример nodes = {CallExpression} input = "});alert(1);var f=({t:" context = " tokens = {"", }, ), ;, alert, (, 1, ), ;, var, f, =, (, {, t, :, "} 2

Slide 136

Slide 136 text

Заголовок Пример 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

Slide 137

Slide 137 text

Заголовок Пример 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

Slide 138

Slide 138 text

Заголовок Пример 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

Slide 139

Slide 139 text

Заголовок Пример 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

Slide 140

Slide 140 text

Заголовок Пример 7 Program EmptyStatement ExpressionStatement alert CallExpression … arguments 1 nodes = {CallExpression} vector = ;alert(1);var f =({t:"

Slide 141

Slide 141 text

Заголовок Примеры обнаруживаемых векторов 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

Slide 142

Slide 142 text

Заголовок Толерантность к ошибкам )},{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 ''; } return ''; "… the solution might work for some older versions of Chrome, while for others, a different vector would be needed…"

Slide 143

Slide 143 text

Заголовок Толерантность к ошибкам nodes = {CallExpression} input = )},{0:prompt(1 Program ExpressionStatement SequenceExpression … ObjectExpression Identifier CallExpression name: x

Slide 144

Slide 144 text

Заголовок Используем толерантный к ошибкам парсер (Acorn loose parser) Это приводит к неизбежному росту числа ложных срабатываний • CallExpression: 123(1+1) Ограничиваются правила толерантности парсера Толерантность к ошибкам А. Перцев, Д. Колегов. Эвристический метод обнаружения DOM-based XSS с использованием толерантных синтаксических анализаторов

Slide 145

Slide 145 text

Заголовок Встроенное распознавание

Slide 146

Slide 146 text

Заголовок DOM и DOMParser DOMParser – интерфейс для парсинга и сериализации DOM var s = ''; var p = new DOMParser(); var d = p.parseFromString(s, 'text/html'); console.log(d.body.innerHTML); // IE 10 // // FF // // Chrome //

Slide 147

Slide 147 text

Заголовок "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

Slide 148

Slide 148 text

Заголовок DOMPurify DOMPurify: src/purify.js

Slide 150

Slide 150 text

Заголовок 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) =

Slide 151

Slide 151 text

Заголовок Нормализация DOMSanitizer: src/sanitizer.js

Slide 152

Slide 152 text

Заголовок Виртуальный патчинг

Slide 153

Slide 153 text

Заголовок Виртуальный патч – то, что предотвращает использование обнаруженной уязвимости к атаке • SAST • DAST Особенности • Использование механизма правил, а не сигнатур • Возможно использование сложных алгоритмов защиты (CSRF, IDOR) Виртуальный патчинг Ryan Barnett. WAF Virtual Patching Challenge

Slide 154

Slide 154 text

Заголовок Знать как не должно быть: необходимые и достаточные условия наличия уязвимости Знать как есть: доказать наличие этих условий в анализируемом коде защищаемого приложения Устранить хотя бы одно из необходимых условий путем изменения исходного кода защищаемого приложения Как сгенерировать патч В. Кочетков. Автоматическая генерация патчей для уязвимого исходного кода

Slide 155

Slide 155 text

Заголовок Знать как не должно быть: необходимые и достаточные условия наличия уязвимости Знать как есть: доказать наличие этих условий в защищаемом приложении Сделать невозможным выполнение хотя бы одного из необходимых условий путем изменения запросов к защищаемому приложению Как сгенерировать виртуальный патч

Slide 156

Slide 156 text

Заголовок • Средствами xAST выполняется поиск уязвимостей веб- приложения • По найденным уязвимостям создается отчет • Отчет содержит перечень найденных уязвимостей и автоматически сгенерированные эксплойты • По полученным эксплойтам генерируются сигнатуры и итоговые правила виртуальных патчей Метод защиты

Slide 157

Slide 157 text

Заголовок Пример 1: исходный код // page.php

Slide 158

Slide 158 text

Заголовок Пример 1: эксплойт // page.php
http://example.com/blog/page.php?name= Эксплоит:

Slide 159

Slide 159 text

Заголовок Пример 1: отчет { "path": "/blog/page.php", "source": "/opt/app/www/blog/page.php", "type": "XSS", "exploit": "\r\nGET /blog/page.php/id= HTTP/1.1\r\nHost: example.com\r\n", "params": { "param": { "src": "REQUEST_GET_ARGS", "payload": "", "name": "id", "dependencies": {"dependency": [ "%3C", "%3E" ]} }}}

Slide 160

Slide 160 text

Заголовок Пример 1: правило { "and": [ { "REQUEST_PATH": "/blog/page.php" }, { "REQUEST_GET_ARGS:id": { "regex": "[<>]" } } ] }

Slide 161

Slide 161 text

Заголовок Пример 2: исходный код // page.php

Slide 162

Slide 162 text

Заголовок Пример 2: эксплойт http://example.com/blog/page.php?type=&name=$1 Эксплоит: // page.php

Slide 163

Slide 163 text

Заголовок • Виртальный патчинг здесь неэффективен • Из-за неизвестного преобразования нет возможности сообщить WAF информацию о том, какие значения должны принимать оба параметра запроса для атаки • Более того, из-за неизвестного преобразования не сработают и все другие подходы Метод защиты

Slide 164

Slide 164 text

Заголовок Материалы

Slide 165

Slide 165 text

Заголовок Книги

Slide 166

Slide 166 text

Заголовок 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

Slide 167

Slide 167 text

Заголовок ptsecurity.com Спасибо! Спасибо!