💀 Command Injection: Когда сервер выполняет ваши команды
Кратко: Command Injection — уязвимость, позволяющая выполнить произвольную команду операционной системы на сервере через веб-приложение. Вместо ping 8.8.8.8 злоумышленник пишет ping 8.8.8.8; id и получает вывод uid=33(www-data) gid=33(www-data). Сервер слепо подставляет пользовательский ввод в системную команду. Это почти всегда Remote Code Execution (RCE) и полная компрометация сервера.
▫️ Как это работает Плохой PHP-код: $ip = $_GET['ip']; system("ping -c 1 " . $ip);
Пользователь шлёт site.com/ping?ip=8.8.8.8. Сервер выполняет ping -c 1 8.8.8.8. Злоумышленник шлёт site.com/ping?ip=8.8.8.8; id. Сервер выполняет ping -c 1 8.8.8.8; id. Утилита ping отрабатывает, затем выполняется id — сервер возвращает вывод uid=33(www-data) gid=33(www-data). Атакующий получил возможность выполнять любые команды на сервере.
▫️ Символы — ключи к взлому · ; — разделитель команд (Windows и Linux) · && — логическое И (выполнить следующую команду, если предыдущая успешна) · || — логическое ИЛИ (выполнить, если предыдущая провалилась) · | — пайп (передать вывод первой команды на вход второй) · \команда\ (обратные кавычки) — подстановка вывода (устаревший синтаксис) · $(команда) — современная подстановка вывода
▫️ Способы эксплуатации 1. Прямое исполнение — проще всего. Вставляем команду после разделителя. ; cat /etc/passwd — читаем пароли. 2. Обход фильтров (Blacklist) — разработчик запретил ;, |, &. Используем (символ новой строки). В URL: ping?ip=8.8.8.8 id. Некоторые парсеры пропускают как разделитель команд. 3. Обход пробелов — cat /etc/passwd можно заменить на ${IFS}cat${IFS}/etc/passwd (IFS — разделитель полей в bash). Или на cat