Источник: https://github.com/AnaktaCTF/CTF/blob/main — WEB/OS_Injection.md

Суть уязвимости

Эта уязвимость позволяет злоумышленникам выполнять произвольные команды на сервере. Возникает когда, приложение использует входные данные и использует их в системных командах.

Примеры

Пусть приложение будет проверять доступность какого либо хоста. И это будет делать с помощью команды ping:

import os
hostname = input("Enter hostname")
os.system(f"ping {hostname}")

Если в поле hostname передать ; whoami;, то сервер вернет результат выполнения команды whoami

Последствия

  • Полный контроль над системой
  • Утечка данных
  • Атака на другие системы
  • DoS (Denial of Service)

Виды

  1. Basic Command Injection
    Простое добавление операторов ' ; ' ' ?? ' или ' || ', для связи нескольких команд
  2. Blind Command Injection
    Результат не отображается, но его можно определить косвенно (задержки, ошибки и тп)
  3. Out-of-Band Command Injection
    Использование других каналов для отправки команд.

Методы борьбы

  1. Использование безопасных API
  • Вместо выполнения команд через shell используйте API, которые предоставляют безопасные способы выполнения действий. Например, для Python используйте subprocess.run() с параметром shell=False
  1. Экранирование и валидация данных
  2. Использование списка разрешённых данных
  • Если возможно, используйте белые списки значений, которые можно вводить, и разрешайте только проверенные и допустимые команды.
  1. Минимизация прав доступа
  2. Журналирование и мониторинг
  3. Изоляция и контейнеризация

Материалы

  1. https://portswigger.net/web-security/os-command-injection - треннировачные лабы
  2. https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Command%20Injection/README.md - payloads