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.
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:
Dúvidas ou sugestões? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits
Sobre o Autor
0 Comentários