Voltar ao início

Fazendo uma Web Shell através de um SQL Injection

Aprendi esta técnica com dois caras tops na área de Hacking Brasileiro: Rafa do @hackingnaweboficial e Kadu (@carlos.crowsec) da Crowsec.

Se você caiu de paraquedas aqui, é bem provável que saiba o que significa SQL Injection, mas basicamente é uma vulnerabilidade que permite que um usuário injete trechos de código SQL em uma consulta que está sendo realizada no lado do servidor, permitindo que esse usuário acesse informações do banco de dados que não deveria ter acesso. Essa é uma explicação básica sobre o assunto.

Vamos a um exemplo simples: suponha que eu tenha um campo de pesquisa dentro de um sistema de E-commerce, semelhante ao que está sendo mostrado na imagem.

Esse campo de pesquisa que é mostrado para o usuário tem a seguinte query SQL em um sistema que utiliza PHP:

select * from Produtos where nome like '%<php $pesquisa ?>%';

Onde a variável em PHP $pesquisa é o que o usuário adicionou no campo de pesquisa.

Você concorda que se o usuário escrever no campo de pesquisa o seguinte input "teste' or 1=1 - --" (sem as aspas duplas), o sistema listaria todos os produtos da tabela?

Se você respondeu que sim, você já compreendeu onde quero chegar. Mas se não, vamos chegar na compreensão agora.

Pense comigo: se a variável $pesquisa possui esse conteúdo "teste' or 1=1 - --" (sem as aspas duplas), o resultado final da query antes de ser executada seria esse:

select * from Produtos where nome like '%teste' or 1=1 - --%';

Você concorda comigo que se essa query for executada dessa forma, o resultado seria a listagem de todos os produtos do banco? Isso acontece simplesmente pelo fato do "or 1=1" que foi injetado pelo usuário.

Essa é uma demonstração simples e que comprova que é possível a injeção de SQL nesse campo de pesquisa, devido à falta de tratamento correto dos dados enviados pelo usuário.

Mas como isso poderia ser explorado para enviar uma Web Shell?

Existem vários métodos de exploração em um SQL Injection, como Union Based, Error Based, Time Based, Boolean Based, Stacked Queries entre outros. Parece improvável conseguir uma web shell através disso.

Porém, existe uma função no MySQL chamada "into outfile", que permite gravar o resultado final de uma query em um arquivo. Acho que você já começou a entender onde quero chegar. Hehehe.

Se um invasor conseguir injetar uma query SQL que inclua a função "into outfile", ele pode gravar um arquivo PHP que contenha uma Web Shell no servidor alvo. Para isso, basta que o invasor tenha permissão de escrita no diretório onde deseja salvar o arquivo.

Um exemplo de query SQL que poderia ser utilizada para injetar uma Web Shell utilizando Union Based seria:

' union select '<?php echo system($_GET["cmd"]); ?>' into outfile '/var/www/html/shell.php' --

Explicando essa query, o 'union' é usado para juntar duas "queries". O conteúdo entre os pontos de interrogação é um código PHP que irá executar o comando que o invasor quiser passar através da variável "cmd". E, por fim, a função "into outfile" está gravando o resultado final da query em um arquivo chamado "shell.php" no diretório "/var/www/html/".

Se o invasor executar essa query no campo de pesquisa do sistema vulnerável, ele conseguirá salvar a Web Shell no servidor alvo. E, a partir daí, poderá executar comandos no servidor remotamente, sem precisar acessá-lo diretamente.

Para acessar a Web Shell, basta acessar o arquivo "shell.php" no diretório em que foi salvo no servidor alvo. E, através dele, o invasor poderá realizar diversas ações no servidor, como por exemplo: listar arquivos, enviar arquivos para o servidor, executar comandos no servidor, entre outras. Um exemplo seria acessar "shell.php" e enviar como parâmetro "cmd", definido no SQL injection, o comando "id" do Linux, caso o servidor seja Linux.

https://siteexemplo.com/shell.php?cmd=id

SQL Injection é uma vulnerabilidade bastante comum em sistemas web e pode causar danos graves caso não seja tratada corretamente. É importante que desenvolvedores e administradores de sistemas estejam cientes dessa vulnerabilidade e tomem medidas preventivas para evitá-la.

Nesse artigo, vimos um exemplo simples de como é possível explorar essa vulnerabilidade para enviar uma Web Shell ao servidor alvo. É importante ressaltar que essa técnica deve ser utilizada apenas para fins educativos e para testes de segurança em sistemas autorizados, jamais para invasões em sistemas alheios sem autorização.