SlideShare a Scribd company logo
Итак
вам нужен парсер
или
Опыт разработки модуля межсетевого
экранирования для
Брославский Олег Колегов Денис
Intro
…
короче говоря,
мы решили парсить MySQL
…
Intro
???
Intro
Совместная работа PT Application Firewall Research Team
Принимали участие:
• Брославский Олег
• Гречнев Сергей
• Колегов Денис
• Кочуркин Иван
• Олексов Никита
• Решетников Сергей
• Худяшов Иван
SQL Injections
SELECT * FROM users WHERE email = '$email' AND password = md5('$password');
“Did you really name your son Robert'); DROP TABLE Students; -- ?”
© Exploits of a Mom (xkcd #327)
SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
Impact
Обнаруженные
SQL-инъекции в
CMS WordPress
за 2017 год
WAF
Client WAF Web Server
“That’s not a bug, that’s unintended user behavior“
- some developer
… makes your system 99,96%secure …
WAF SQLi detection
• Лексический подход (регулярные выражения)
(?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_l
ock))?|n(?:et6?_(aton|ntoa)|s(?:ert|tr)|terval)?|f(null)?)|u(?:n(?:compress(?:ed_length)?|ix_timestamp|hex)|tc_(date|time|timestamp)|p(?:dat
exml|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|pa
d|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|eat
es)t|et_(format|lock))|o(?:(?:ld_passwo)?rd|ct(et_length)?)|we(?:ek(day|ofyear)… <Еще несколько тысяч символов>
• Лексико-сигнатурный подход (libinjection)
-6270" UNION ALL SELECT 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594,
5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594,
5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594#
AND "JWWQ"="JWWQ
sUk1,1,1,1,1,1,1,1,&
• Подходы, основанные на машинном обучении
Impact
Michael Stepankin. Advanced Web Application Fuzzing
WAF + DBFW
Client WAF Web Server DBFW Database
SELECT * FROM users
WHERE email = 'xxx'
AND password = md5('xxx') OR 1=1; -- 1');
?name=xxx&password=xxx')+OR+1=1;+--+1
SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
Advanced SQL Analysis
select and
* password
from =
users md5
where (
email “HI”
= )
“xxx“ ;
select md5
* (
from “xxx”
users )
where OR
email 1
= =
“xxx” 1
and ;
password <COMMENT>
16 ≠ 20
SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
SELECT * FROM users WHERE email = 'xxx' AND password = md5(‘HI');
Подсчёт токенов
[expression]
[expression]
or
[expression]
email = xxx
[expression]
password =
and
[expression]
1 = 1
email password whereusers
[expression]
md5 xxx
[where][fields] [from]select
[select]
Анализ синтаксического дерева
Advanced SQL Analysis
Кроме того, анализ синтаксического дерева позволяет:
Анализ
синтаксиса
Анализ
семантики
построение
«узкоспециализированной»
грамматики веб-приложения
построение «профиля»
SQL-запросов веб-приложения
управление доступом для
пользователей веб-приложения
SQL Parsing
Parser
Syntax analysis Protectors
Protector 1
…
Protector N
Concrete
syntax tree
MySQL
Query
Existing Parsers
• Локальные runtime-specific варианты
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
• Официальная YACC-грамматика MySQL
(https://github.com/twitter/mysql)
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
• Официальная YACC-грамматика MySQL
(https://github.com/twitter/mysql)
• ANTLR3-грамматика для MySQL Workbench
(https://github.com/mysql/mysql-workbench)
Existing Parsers
• Локальные runtime-specific-варианты
• Коммерческие решения
(http://www.sqlparser.com)
• Реализации движков БД на конкретном
языке (e.g. https://github.com/youtube/vitess)
• Официальная YACC-грамматика MySQL
(https://github.com/twitter/mysql)
• ANTLR3-грамматика для MySQL Workbench
(https://github.com/mysql/mysql-workbench)
© Standards (xkcd #927)
ANLTR
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis Semantic analysis
…
Protector 1
…
Protector N
CST AST
Abstract syntax
analysis
Query
ANTLR Runtimes
Proof Of Concept
Python 2.7
Возраст рантайма ~ 2 года (июль 2015)
Количество разработчиков 12 человек
Количество коммитов 78
Proof Of Concept
Python 2.7
• Возраст рантайма ~ 2 года
476,33
0
100
200
300
400
500
600
Q/Sec
Python 2.7
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Proof Of Concept
С++
Возраст рантайма ~ 1 год (март 2016)
Количество разработчиков 33 человека
Количество коммитов 336
Proof Of Concept
Python 2.7
• Возраст рантайма ~ 2 года
C++11
• Возраст рантайма ~ 1 года
476,33
11052,3
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Proof Of Concept
476,33
11052,3
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Python 2.7
• Возраст рантайма ~ 2 года
C++11
• Возраст рантайма ~ 1 года
Proof Of Concept
476,33
11052,3
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Python 2.7
• Возраст рантайма ~ 2 года
C++11
• Возраст рантайма ~ 1 года
Positive Grammar
(!) Не зависит от рантайма
https://habrahabr.ru/company/pt/blog/339336/
https://github.com/antlr/grammars-v4/tree/master/mysql
Release Fail!
• У нас нет свободных С++
разработчиков
Release Fail!
• У нас нет свободных С++
разработчиков
• С++11 не поддерживается у нас в
стеке
Release Fail!
• У нас нет свободных С++
разработчиков
• С++11 не поддерживается у нас в
стеке
• Кажется, C++11 не получится
втянуть на Debian Wheezy
Test Them All
Python 3.5
Возраст рантайма ~ 2 года
Количество разработчиков 12 человек
Количество коммитов 77
Test Them All
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Python 3.5
• Возраст рантайма
~ 2 года
¯_(ツ)_/¯
476,33
11052,3
449,95
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11 Python 3.5
Test Them All
PyPy
Возраст рантайма Официально не поддерживается
Количество разработчиков -
Количество коммитов -
476,33
11052,3
449,95
996,26
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11 Python 3.5 PyPy
Test Them All
Минимальный
приемлемый результат
• 10 000 запросов/секунду
PyPy
• Официально не поддерживается
Time To Go
Время добавить Go!
Time To Go
Golang
Возраст рантайма ~ 2 года (декабрь 2015)
Количество разработчиков 15 человек
Количество коммитов 213
Time To Go
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Golang
• Возраст рантайма
~ 11 месяцев
476,33
11052,3
449,95
996,26
372,6
0
2000
4000
6000
8000
10000
12000
Q/Sec
Python 2.7 C++11 Python 3.5 PyPy Golang
Test Them All
С#
Возраст рантайма ~ 2 года (июнь 2015)
Количество разработчиков 13 человек
Количество коммитов 83
Test Them All
Минимальный
приемлемый результат
• 10 000 запросов/секунду
C#
• Возраст рантайма
~ 11 месяцев
476,33
11052,3
449,95 996,26 372,6
35543,7
0
5000
10000
15000
20000
25000
30000
35000
40000
Q/Sec
Python 2.7 C++11 Python 3.5 PyPy Golang C#
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
Remaining Runtimes
The Last One
Java
Возраст рантайма ~ 7 лет (январь 2010)
Количество разработчиков 28 человек
Количество коммитов 1600
476,33
11052,3
449,95 996,26 372,6
35543,7
72446,72
0
10000
20000
30000
40000
50000
60000
70000
80000
Q/Sec
Python 2.7 C++11 Python 3.5 PyPy Golang C# Java
Java Comeback
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Java
• Возраст рантайма
~ 7 лет
God Please Not Java
The Chosen One
Kotlin
Возраст рантайма Официально не поддерживается
Количество разработчиков -
Количество коммитов -
476,33
11052,3
449,95 996,26 372,6
35543,7
72446,72
60946,21
0
10000
20000
30000
40000
50000
60000
70000
80000
Q/Sec
Python 2.7 C++11 Python 3.5 PyPy Golang C# Java Kotlin
Kotlin Performance
Минимальный
приемлемый результат
• 10 000 запросов/секунду
Kotlin
• Полностью совместим с Java
Final Results
ANTLR Runtime Query Mode (q/sec) File Mode (MiB/sec)
Python 2.7 466.28 13.4
Python 3.5 449.95 19.3
Python 3.6 419.17 16.5
PyPy 996.26 22.02
Golang 372.60 x
CPP 11052.30 11.0
C# 35543.7 3.09
Java 72446.72 51.04
Kotlin 60946.21 35.59
Desired State
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis Semantic analysis
…
Protector 1
…
Protector N
CST AST
Abstract syntax
analysis
Query
Desired State
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis Semantic analysis
…
Protector 1
…
Protector N
CST AST
Abstract syntax
analysis
Query
Universal Syntax Tree
MySql parser
AST
TsqlParser
PlqlParser
Syntax analysis
…
CST AST
Abstract syntax
analysis
Query
Universal Syntax Tree
MySql parser
MySQL
visitor
TsqlParser
PlqlParser
…
CST USTQuery
TsqlSQL
visitor
PlqlSQL
visitor
Usage Unification
MySql parser
MySQL
visitor
TsqlParser
PlqlParser
…
CST USTQuery
TsqlSQL
visitor
PlqlSQL
visitor
Backend 1
Backend 1
Backend n
Usage Unification
MySql parser
MySQL
visitor
TsqlParser
PlqlParser
…
CST USTQuery
TsqlSQL
visitor
PlqlSQL
visitor
Backend 1
Backend 1
Backend n
IDL Codegenerator Runtime
Artifacts
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
We Need More Artifacts!
IDL CodeGenerator Runtime
Artifacts
Positive
IDL
Aule
Вдохновлён
Web IDL
/PositiveTechnologies/aule
Art Of Architecture
Parser
Art Of Architecture
Parser
Protector 1
…
Protector N
Art Of Architecture
Parser
Protector 1
…
Protector N
Aule
Art Of Architecture
Parser
Protector 1
…
Protector N
Interceptor
Aule
Art Of Architecture
Thank you!
ptsecurity.com

More Related Content

PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PDF
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
PDF
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
PPTX
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
PDF
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
PDF
Всему своё время / Роман Ивлиев (Банки.ру)
PPTX
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Всему своё время / Роман Ивлиев (Банки.ру)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)

What's hot (20)

PDF
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
PDF
Хайлоад и безопасность в мире DevOps: совместимы ли? / Юрий Колесов (security...
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Zabbix и правильное обнаружение проблем - Алексей Владышев @ RootConf 2015
PDF
NoSQL — неспроста ли это "ЖЖЖ"?
PPT
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
PPTX
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
PPTX
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
PDF
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
PDF
Антон Галицын
PDF
Хорошо поддерживаемое приложение
PPTX
Оптимизация производительности нагруженных веб-систем на Java
PDF
Uawebchallenge.yandex.tank
PPTX
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
PDF
Remote Highload
PDF
Тестирование аварий. Андрей Губа. Highload++ 2015
PDF
Подходы к сигнатурному статическому анализу
PDF
Database First! О распространённых ошибках использования РСУБД
PDF
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
PDF
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
Хайлоад и безопасность в мире DevOps: совместимы ли? / Юрий Колесов (security...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Zabbix и правильное обнаружение проблем - Алексей Владышев @ RootConf 2015
NoSQL — неспроста ли это "ЖЖЖ"?
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
Антон Галицын
Хорошо поддерживаемое приложение
Оптимизация производительности нагруженных веб-систем на Java
Uawebchallenge.yandex.tank
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Remote Highload
Тестирование аварий. Андрей Губа. Highload++ 2015
Подходы к сигнатурному статическому анализу
Database First! О распространённых ошибках использования РСУБД
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
Ad

Similar to So Your WAF Needs a Parser (20)

PDF
Software Analytics in frontend
PDF
Вадим Мадисон "Опыт разработки через микросервисы"
PDF
PPTX
Миграция JIRA - безобразие или безрассудство
PDF
My Open Source (Sept 2017)
PPTX
Codeception Introduction
PPTX
Codeception UATestingDays
PDF
D2D Pizza JS Илья Беда "Куда мы все катимся?"
PDF
Денис Иванов
PPT
Макс Лапшин Erlyvideo
PPTX
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
PDF
Обзор перспективных баз данных для highload / Юрий Насретдинов
PDF
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
PPTX
Михаил Боднарчук Современное функциональное тестирование с Codeception
KEY
Erlyvideo — сервер потокового видео.
PDF
М. Боднарчук Современное функциональное тестирование с Codeception
PPT
Easy authcache 2 кэширование для pro. Родионов Игорь
PPTX
What's new in Visual Studio 2012
PDF
InterSystems Community and Projects in CIS November 2015
PPTX
Alexei Sintsov - "Between error and vulerability - one step"
Software Analytics in frontend
Вадим Мадисон "Опыт разработки через микросервисы"
Миграция JIRA - безобразие или безрассудство
My Open Source (Sept 2017)
Codeception Introduction
Codeception UATestingDays
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Денис Иванов
Макс Лапшин Erlyvideo
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
Обзор перспективных баз данных для highload / Юрий Насретдинов
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Михаил Боднарчук Современное функциональное тестирование с Codeception
Erlyvideo — сервер потокового видео.
М. Боднарчук Современное функциональное тестирование с Codeception
Easy authcache 2 кэширование для pro. Родионов Игорь
What's new in Visual Studio 2012
InterSystems Community and Projects in CIS November 2015
Alexei Sintsov - "Between error and vulerability - one step"
Ad

More from yalegko (14)

PDF
SD-WAN Internet Census
PDF
WebGoat.SDWAN.Net in Depth
PDF
[ISC] Docker + Swarm
PDF
How to Open School For Young Hackers
PDF
How to make school CTF
PPTX
AOP and Inversion of Conrol
PDF
White-Box HMAC. Make your cipher secure to white-box attacks.
PDF
White box cryptography
PDF
How to admin
PPTX
ИИ: Этические аспекты проблемы выбора
PPTX
Covert timing channels using HTTP cache headers
PPTX
Covert timing channels using HTTP cache headers
PPTX
Include and extend in Ruby
PPTX
Not a children in da web
SD-WAN Internet Census
WebGoat.SDWAN.Net in Depth
[ISC] Docker + Swarm
How to Open School For Young Hackers
How to make school CTF
AOP and Inversion of Conrol
White-Box HMAC. Make your cipher secure to white-box attacks.
White box cryptography
How to admin
ИИ: Этические аспекты проблемы выбора
Covert timing channels using HTTP cache headers
Covert timing channels using HTTP cache headers
Include and extend in Ruby
Not a children in da web

So Your WAF Needs a Parser

  • 1. Итак вам нужен парсер или Опыт разработки модуля межсетевого экранирования для Брославский Олег Колегов Денис
  • 4. Intro Совместная работа PT Application Firewall Research Team Принимали участие: • Брославский Олег • Гречнев Сергей • Колегов Денис • Кочуркин Иван • Олексов Никита • Решетников Сергей • Худяшов Иван
  • 5. SQL Injections SELECT * FROM users WHERE email = '$email' AND password = md5('$password'); “Did you really name your son Robert'); DROP TABLE Students; -- ?” © Exploits of a Mom (xkcd #327) SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1');
  • 7. WAF Client WAF Web Server “That’s not a bug, that’s unintended user behavior“ - some developer … makes your system 99,96%secure …
  • 8. WAF SQLi detection • Лексический подход (регулярные выражения) (?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_l ock))?|n(?:et6?_(aton|ntoa)|s(?:ert|tr)|terval)?|f(null)?)|u(?:n(?:compress(?:ed_length)?|ix_timestamp|hex)|tc_(date|time|timestamp)|p(?:dat exml|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|pa d|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|eat es)t|et_(format|lock))|o(?:(?:ld_passwo)?rd|ct(et_length)?)|we(?:ek(day|ofyear)… <Еще несколько тысяч символов> • Лексико-сигнатурный подход (libinjection) -6270" UNION ALL SELECT 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594, 5594# AND "JWWQ"="JWWQ sUk1,1,1,1,1,1,1,1,& • Подходы, основанные на машинном обучении
  • 9. Impact Michael Stepankin. Advanced Web Application Fuzzing
  • 10. WAF + DBFW Client WAF Web Server DBFW Database SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1'); ?name=xxx&password=xxx')+OR+1=1;+--+1
  • 11. SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1'); Advanced SQL Analysis select and * password from = users md5 where ( email “HI” = ) “xxx“ ; select md5 * ( from “xxx” users ) where OR email 1 = = “xxx” 1 and ; password <COMMENT> 16 ≠ 20 SELECT * FROM users WHERE email = 'xxx' AND password = md5('xxx') OR 1=1; -- 1'); SELECT * FROM users WHERE email = 'xxx' AND password = md5(‘HI'); Подсчёт токенов [expression] [expression] or [expression] email = xxx [expression] password = and [expression] 1 = 1 email password whereusers [expression] md5 xxx [where][fields] [from]select [select] Анализ синтаксического дерева
  • 12. Advanced SQL Analysis Кроме того, анализ синтаксического дерева позволяет: Анализ синтаксиса Анализ семантики построение «узкоспециализированной» грамматики веб-приложения построение «профиля» SQL-запросов веб-приложения управление доступом для пользователей веб-приложения
  • 13. SQL Parsing Parser Syntax analysis Protectors Protector 1 … Protector N Concrete syntax tree MySQL Query
  • 14. Existing Parsers • Локальные runtime-specific варианты
  • 15. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com)
  • 16. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess)
  • 17. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql)
  • 18. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql) • ANTLR3-грамматика для MySQL Workbench (https://github.com/mysql/mysql-workbench)
  • 19. Existing Parsers • Локальные runtime-specific-варианты • Коммерческие решения (http://www.sqlparser.com) • Реализации движков БД на конкретном языке (e.g. https://github.com/youtube/vitess) • Официальная YACC-грамматика MySQL (https://github.com/twitter/mysql) • ANTLR3-грамматика для MySQL Workbench (https://github.com/mysql/mysql-workbench) © Standards (xkcd #927)
  • 20. ANLTR MySql parser AST TsqlParser PlqlParser Syntax analysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  • 22. Proof Of Concept Python 2.7 Возраст рантайма ~ 2 года (июль 2015) Количество разработчиков 12 человек Количество коммитов 78
  • 23. Proof Of Concept Python 2.7 • Возраст рантайма ~ 2 года 476,33 0 100 200 300 400 500 600 Q/Sec Python 2.7 Минимальный приемлемый результат • 10 000 запросов/секунду
  • 24. Proof Of Concept С++ Возраст рантайма ~ 1 год (март 2016) Количество разработчиков 33 человека Количество коммитов 336
  • 25. Proof Of Concept Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду
  • 26. Proof Of Concept 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года
  • 27. Proof Of Concept 476,33 11052,3 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Минимальный приемлемый результат • 10 000 запросов/секунду Python 2.7 • Возраст рантайма ~ 2 года C++11 • Возраст рантайма ~ 1 года
  • 28. Positive Grammar (!) Не зависит от рантайма https://habrahabr.ru/company/pt/blog/339336/ https://github.com/antlr/grammars-v4/tree/master/mysql
  • 29. Release Fail! • У нас нет свободных С++ разработчиков
  • 30. Release Fail! • У нас нет свободных С++ разработчиков • С++11 не поддерживается у нас в стеке
  • 31. Release Fail! • У нас нет свободных С++ разработчиков • С++11 не поддерживается у нас в стеке • Кажется, C++11 не получится втянуть на Debian Wheezy
  • 32. Test Them All Python 3.5 Возраст рантайма ~ 2 года Количество разработчиков 12 человек Количество коммитов 77
  • 33. Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду Python 3.5 • Возраст рантайма ~ 2 года ¯_(ツ)_/¯ 476,33 11052,3 449,95 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Python 3.5
  • 34. Test Them All PyPy Возраст рантайма Официально не поддерживается Количество разработчиков - Количество коммитов -
  • 35. 476,33 11052,3 449,95 996,26 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду PyPy • Официально не поддерживается
  • 36. Time To Go Время добавить Go!
  • 37. Time To Go Golang Возраст рантайма ~ 2 года (декабрь 2015) Количество разработчиков 15 человек Количество коммитов 213
  • 38. Time To Go Минимальный приемлемый результат • 10 000 запросов/секунду Golang • Возраст рантайма ~ 11 месяцев 476,33 11052,3 449,95 996,26 372,6 0 2000 4000 6000 8000 10000 12000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang
  • 39. Test Them All С# Возраст рантайма ~ 2 года (июнь 2015) Количество разработчиков 13 человек Количество коммитов 83
  • 40. Test Them All Минимальный приемлемый результат • 10 000 запросов/секунду C# • Возраст рантайма ~ 11 месяцев 476,33 11052,3 449,95 996,26 372,6 35543,7 0 5000 10000 15000 20000 25000 30000 35000 40000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang C#
  • 48. The Last One Java Возраст рантайма ~ 7 лет (январь 2010) Количество разработчиков 28 человек Количество коммитов 1600
  • 49. 476,33 11052,3 449,95 996,26 372,6 35543,7 72446,72 0 10000 20000 30000 40000 50000 60000 70000 80000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang C# Java Java Comeback Минимальный приемлемый результат • 10 000 запросов/секунду Java • Возраст рантайма ~ 7 лет
  • 51. The Chosen One Kotlin Возраст рантайма Официально не поддерживается Количество разработчиков - Количество коммитов -
  • 52. 476,33 11052,3 449,95 996,26 372,6 35543,7 72446,72 60946,21 0 10000 20000 30000 40000 50000 60000 70000 80000 Q/Sec Python 2.7 C++11 Python 3.5 PyPy Golang C# Java Kotlin Kotlin Performance Минимальный приемлемый результат • 10 000 запросов/секунду Kotlin • Полностью совместим с Java
  • 53. Final Results ANTLR Runtime Query Mode (q/sec) File Mode (MiB/sec) Python 2.7 466.28 13.4 Python 3.5 449.95 19.3 Python 3.6 419.17 16.5 PyPy 996.26 22.02 Golang 372.60 x CPP 11052.30 11.0 C# 35543.7 3.09 Java 72446.72 51.04 Kotlin 60946.21 35.59
  • 54. Desired State MySql parser AST TsqlParser PlqlParser Syntax analysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  • 55. Desired State MySql parser AST TsqlParser PlqlParser Syntax analysis Semantic analysis … Protector 1 … Protector N CST AST Abstract syntax analysis Query
  • 56. Universal Syntax Tree MySql parser AST TsqlParser PlqlParser Syntax analysis … CST AST Abstract syntax analysis Query
  • 57. Universal Syntax Tree MySql parser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor
  • 58. Usage Unification MySql parser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor Backend 1 Backend 1 Backend n
  • 59. Usage Unification MySql parser MySQL visitor TsqlParser PlqlParser … CST USTQuery TsqlSQL visitor PlqlSQL visitor Backend 1 Backend 1 Backend n IDL Codegenerator Runtime Artifacts
  • 60. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts
  • 61. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 62. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 63. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 64. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 65. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 66. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL
  • 67. We Need More Artifacts! IDL CodeGenerator Runtime Artifacts Positive IDL Aule Вдохновлён Web IDL /PositiveTechnologies/aule
  • 70. Art Of Architecture Parser Protector 1 … Protector N Aule
  • 71. Art Of Architecture Parser Protector 1 … Protector N Interceptor Aule