Введение
Всем привет, сегодня я расскажу о достаточно простой, но интересной на мой взгляд уязвимости. Итак, давайте по порядку. Суть заключается во внедрении команд ОС в поле ввода. Важно отметить разницу между инъекцией кода и инъекцией команды. При инъекции кода хакер вставляет свой код, который в дальнейшем воспроизводится приложением или программой, тогда как командная инъекция может использовать преимущества среды приложения, в которой выполняются системные команды. Эти понятия схожи, но то, что командная инъекция основана на нормальном поведении приложения, часто облегчает ее использование.
Терминология
Внедрение команд ОС - это одна из разновидностей внедрения кода. Её особенностью является выполнение несанкционированных команд операционной системы на удалённом сервере через уязвимое приложение.
Если в отношении пользовательского ввода не осуществляется должная проверка, то приложение может быть уязвимы к данной атаке. Используя эту уязвимость, хакер может формировать ввод таким образом, что он будет содержать команды операционной системы, которые будут выполняться с привилегиями уязвимого приложения.
Используя данную уязвимость, мы можем получить доступ к:
Главная причина появления уязвимости к инъекциям команд/аргументов состоит в отсутствии корректной валидации входных данных.
Самый общий подход заключается в проверке входных данных на наличие разделителей команд и аргументов. Также необходимо убедиться в том, что внешние данные не приведут к подмене исходной команды.
Эксплуатация
Для примера, поиграем в Codeby Games и решим задачку под названием "Калькулятор" из категории "Веб" =)
Прежде, чем начать, нам нужно узнать как ввести нашу команду так, чтобы сервер воспринял её именно как команду, а не текст. Для этого используются специальные символы, вот некоторые из них:
Для ОС Windows:
И также для ОС Unix:
По-хорошему, мы должны были узнать ОС через nmap, но я заранее знал, что там Linux Находим специальные символы для Unix-систем и пробуем в них команды. Как видим на скриншоте - результат есть.
Таким не хитрым образом мы сможем добыть флаг, просто вводя стандартные команды ОС Linux в окно ввода.
Важно заметить, что сам Codeby говорит нам о том, что они подключили WAF. Поэтому некоторые символы не работают.
Видеорешение этой задачки есть на канале D3L1F3R:
Литература
Всем привет, сегодня я расскажу о достаточно простой, но интересной на мой взгляд уязвимости. Итак, давайте по порядку. Суть заключается во внедрении команд ОС в поле ввода. Важно отметить разницу между инъекцией кода и инъекцией команды. При инъекции кода хакер вставляет свой код, который в дальнейшем воспроизводится приложением или программой, тогда как командная инъекция может использовать преимущества среды приложения, в которой выполняются системные команды. Эти понятия схожи, но то, что командная инъекция основана на нормальном поведении приложения, часто облегчает ее использование.
Внедрение команд ОС - это одна из разновидностей внедрения кода. Её особенностью является выполнение несанкционированных команд операционной системы на удалённом сервере через уязвимое приложение.
Если в отношении пользовательского ввода не осуществляется должная проверка, то приложение может быть уязвимы к данной атаке. Используя эту уязвимость, хакер может формировать ввод таким образом, что он будет содержать команды операционной системы, которые будут выполняться с привилегиями уязвимого приложения.
Используя данную уязвимость, мы можем получить доступ к:
- Файлам паролей операционной системы.
- Конфигурационным файлам операционной системы.
- Исходному коду приложения.
Главная причина появления уязвимости к инъекциям команд/аргументов состоит в отсутствии корректной валидации входных данных.
Самый общий подход заключается в проверке входных данных на наличие разделителей команд и аргументов. Также необходимо убедиться в том, что внешние данные не приведут к подмене исходной команды.
- Можно использовать функцию escapeshellcmd(), которая будет экранировать символы, которыми пользователь может воспользоваться для эксплуатации Command injection.
- Белые списки. Белые списки более безопасны т.к. с их помощью разрешается для использования только определенный набор символов. Все остальные символы запрещены. Использование черных списков не рекомендуется т.к. злоумышленники все равно найдут способ его обойти. Если все же есть необходимость использования именно черного списка, то в этом случае необходимо тщательно фильтровать применение таких символов как: {} () <> & * '| = ; [] $ - # ~! . ”% / \: +,`
- Используйте средства защиты веб-приложения, например, WAF.
Эксплуатация
Для примера, поиграем в Codeby Games и решим задачку под названием "Калькулятор" из категории "Веб" =)
Прежде, чем начать, нам нужно узнать как ввести нашу команду так, чтобы сервер воспринял её именно как команду, а не текст. Для этого используются специальные символы, вот некоторые из них:
Для ОС Windows:
&
&&
|
||
; (это универсальный символ)
И также для ОС Unix:
`command`
$(command)
; (это универсальный символ)
Пробуем каждый из них и смотрим на результат.По-хорошему, мы должны были узнать ОС через nmap, но я заранее знал, что там Linux Находим специальные символы для Unix-систем и пробуем в них команды. Как видим на скриншоте - результат есть.
Таким не хитрым образом мы сможем добыть флаг, просто вводя стандартные команды ОС Linux в окно ввода.
Важно заметить, что сам Codeby говорит нам о том, что они подключили WAF. Поэтому некоторые символы не работают.
Видеорешение этой задачки есть на канале D3L1F3R:
Литература
"ЗАЩИТА WEB-ПРИЛОЖЕНИЙ ОТ УЯЗВИМОСТИ COMMAND EXECUTION" / Беликов Георгий Витальевич, Крылов Илья Дмитриевич, Селищев Валерий Анатольевич
Последнее редактирование модератором: