Command Injection

Command Injection é uma falha de segurança que ocorre quando a aplicação envia comandos para o sistema operacional, juntamente com os dados dos usuários (enviados por formulários, HTTP headers, cookies etc) sem nenhum tipo de validação.

Dessa forma, a aplicação web desprovida de validações daquilo que os usuários enviam, podem ser atacadas por usuários maliciosos que irão injetar comandos de sistema operacional através do parâmetro vulnerável.

Durante o ataque, os comandos enviados serão executados utilizando-se dos privilégios que a aplicação web possuir. Normalmente as aplicações web executam com privilégios de servidor web (Apache, Tomcat etc).

Se o servidor web for Apache, o atacante terá os provilégios do Apache.

Abaixo, através do campo de texto do formulário, é possível executar comandos de sistema operacional para listar arquivos de diretórios, criar e até mesmo apagar diretórios:

 <?php

 //Se vier via POST...
 if($_SERVER["REQUEST_METHOD"] === 'POST') {
   $cmd = $_POST["cmd"];
	 
   echo "<pre>";
 
  //Executa o comando de sistema digitado no campo tipo text do formulário HTML
  $comando = system($cmd, $retorno);
  echo "</pre>";
 }
 
 ?>

 <form method="post">
  <input type="text" name="cmd">
  <button type="submit">Enviar</button>
</form>

No mesmo campo de texto também é possível injetar comandos para parar o serviço do Apache:

dir C:\ && D:/xampp/xampp_stop.exe

Para evitar a injeção de comandos permitido pelos códigos acima, precisamos tratar os dados dinâmicos que são passados através do campo de texto:

<?php

 if($_SERVER["REQUEST_METHOD"] === 'POST') {
	 
   /* Quando for digitado um comando, como a \, |, &, substitui por & 
   para anular o comando e transformá-lo em uma string comum (escapeshellcmd) */
   $cmd = escapeshellcmd($_POST["cmd"]);
	 
   var_dump($cmd); //Mostra a string gerada pela função escapeshellcmd()
	 
   /* Se o comando "dir C:\ && D:/xampp/xampp_stop.exe", por exemplo, for injetado, será
   gerada a string "dir C:^\ ^&^& D:/xampp/xampp_stop.exe", anulando a injeção de comando */
	 
   echo "<pre>";
 
   $comando = system($cmd, $retorno);
   echo "</pre>";
 }

?>

<form method="post">
 <input type="text" name="cmd">
 <button type="submit">Enviar</button>
</form> 

Se o comando “dir C:\ && D:/xampp/xampp_stop.exe” for injetado acima, o mesmo será anulado e gerada a string “dir C:^\ ^&^& D:/xampp/xampp_stop.exe” evitando a paralização do serviço do Xampp e a derrubada do servidor.

Sempre quando você for executar comandos do tipo system(), shell_exec ou exec, nunca receba dados dinâmicos! Caso não tenha alternativas, utilize o método escapeshellcmd() para anular as injeções de comandos.

QUER APRENDER PHP ORIENTADO A OBJETOS OU APERFEIÇOAR O QUE JÁ SABE?

Então conheça o curso online que já ajudou milhares de pessoas a aprender a programar e desenvolver seus próprios projetos do ZERO e usando orientação a objetos de uma forma fácil de entender.

CLIQUE NA IMAGEM ABAIXO E SAIBA MAIS:

CLIQUE AQUI E SAIBA MAIS

Dúvidas ou sugestões? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits

Tags: | |

Sobre o Autor

Benedito Silva Júnior
Benedito Silva Júnior

Bacharel em Sistemas de Informação pelo Instituto Paulista de Pesquisa e Ensino IPEP. Apaixonado por tecnologias e games do tempo da vovó!

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *