Este artigo explica como testar se um website está seguro contra a injeção SQL usando a ferramenta de teste de penetração SQLMAP.

O que é SQL Injection?

SQL Injection é uma técnica de injeção de código onde um atacante executa consultas SQL maliciosas que controlam o banco de dados de uma aplicação web. Com o conjunto certo de consultas, um usuário pode obter acesso a informações armazenadas em bancos de dados. SQLMAP testa se um parâmetro ‘GET’ é vulnerável a SQL Injection.
Por exemplo, Considere o seguinte segmento de código php:

$variable = $_POST;mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");

Se o usuário digitar “valor”); tabela DROP TABLE;-” como o input, a consulta torna-se

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

o que é indesejável para nós, pois aqui o input do usuário é compilado diretamente junto com a consulta sql pré-escrita. Assim o usuário será capaz de inserir uma consulta sql necessária para manipular o banco de dados.

Onde você pode usar SQLMAP?

Se você observar uma url web que é do formulário http://testphp.vulnweb.com/listproducts.php?cat=1, onde o parâmetro ‘GET’ está em negrito, então o site pode estar vulnerável a este modo de injeção SQL, e um atacante pode ser capaz de obter acesso à informação no banco de dados. Além disso, SQLMAP funciona quando é baseado em php.

Um simples teste para verificar se o seu website é vulnerável seria substituir o valor no parâmetro get request por um asterisco (*). Por exemplo,

http://testphp.vulnweb.com/listproducts.php?cat=* 

Se isto resultar em um erro como o erro dado acima, então podemos conclusivamente dizer que o website é vulnerável.

Installing sqlmap

SQLMAP vem pré – instalado com kali linux, que é a escolha preferida da maioria dos testadores de penetração. Entretanto, você pode instalar o sqlmap em outros sistemas baseados no debian linux usando o comando

 sudo apt-get install sqlmap 

Usage

Neste artigo, faremos uso de um website que foi projetado com vulnerabilidades para fins de demonstração:

 http://testphp.vulnweb.com/listproducts.php?cat=1 

Como você pode ver, há um parâmetro de requisição GET (cat = 1) que pode ser alterado pelo usuário modificando o valor do cat. Portanto, este site pode ser vulnerável à injeção SQL deste tipo.
Para testar isso, usamos SQLMAP. Para ver o conjunto de parâmetros que podem ser passados, digite no terminal,

 sqlmap -h 

Os parâmetros que vamos usar para a SQL Injection básica são mostrados na figura acima. Juntamente com estes, usaremos também os parâmetros -dbs e -u, cujo uso foi explicado no Passo 1.
Usar SQLMAP para testar um website para vulnerabilidade de SQL Injection:

  1. Passo 1: Listar informações sobre os bancos de dados existentes
    Então, em primeiro lugar, temos que entrar na url web que queremos verificar juntamente com o parâmetro -u. Também podemos usar o parâmetro -tor se quisermos testar o site usando proxies. Agora, tipicamente, queremos testar se é possível ter acesso a uma base de dados. Por isso usamos a opção -dbs para o fazer. O -dbs lista todas as bases de dados disponíveis.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs 

    Obtemos a seguinte saída mostrando-nos que existem duas bases de dados disponíveis. Às vezes, a aplicação irá dizer-lhe que identificou a base de dados e perguntar-lhe se quer testar outros tipos de bases de dados. Você pode ir em frente e digitar ‘Y’. Além disso, pode perguntar se você quer testar outros parâmetros de vulnerabilidades, digite ‘Y’ aqui pois queremos testar completamente a aplicação web.

    Observamos que são duas bases de dados, acuart e information_schema

  2. Passo 2: Listar informação sobre Tabelas presentes em uma base de dados em particular
    Para tentar acessar qualquer uma das bases de dados, temos que modificar ligeiramente nosso comando. Agora usamos -D para especificar o nome do banco de dados que queremos acessar, e uma vez que tenhamos acesso ao banco de dados, gostaríamos de ver se podemos acessar as tabelas. Para isso, usamos o comando -tables query. Vamos acessar a base de dados acuart.
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart --tables 

    Tables

    Na figura acima, vemos que 8 tabelas foram recuperadas. Então agora definitivamente sabemos que o site é vulnerável.

  3. Passo 3: Listar informações sobre as colunas de uma determinada tabela

    Se quisermos ver as colunas de uma determinada tabela, podemos usar o seguinte comando, no qual usamos -T para especificar o nome da tabela, e -colunas para consultar os nomes das colunas. Vamos tentar acessar a tabela ‘artistas’.

     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 -D acuart -T artists --columns 

    Colunas

  4. Passo 4: Descarregar os dados das colunas
    Simplesmente, podemos acessar a informação em uma coluna específica usando o seguinte comando, onde -C pode ser usado para especificar vários nomes de colunas separados por uma vírgula, e a consulta -dump recupera os dados
     sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1-D acuart -T artists -C aname --dump 

    Da figura acima, podemos ver que acessamos os dados da base de dados. Da mesma forma, em sites tão vulneráveis, podemos literalmente explorar através das bases de dados para extrair informações

Prevenir Injeção SQL

InjeçãoSQL pode ser geralmente evitada usando Prepared Statements . Quando usamos uma instrução preparada, estamos basicamente usando um modelo para o código e analisando o código e a entrada do usuário separadamente. Ele não mistura a consulta introduzida pelo usuário e o código. No exemplo dado no início deste artigo, o input inserido pelo usuário é inserido diretamente no código e eles são compilados juntos, e por isso somos capazes de executar código malicioso. Para instruções preparadas, basicamente enviamos a consulta sql com um espaço reservado para a entrada do usuário e então enviamos a entrada do usuário real como um comando separado.
Considerar o seguinte segmento de código php.

$db = new PDO('connection details');$stmt = db->prepare("Select name from users where id = :id");$stmt->execute(array(':id', $data));

Neste código, a entrada do usuário não é combinada com a instrução preparada. Eles são compilados separadamente. Portanto, mesmo que código malicioso seja inserido como entrada do usuário, o programa irá simplesmente tratar a parte maliciosa do código como uma string e não como um comando.

Nota: Esta aplicação deve ser usada apenas para fins de teste
Artigo relacionado
Injeção e mitigação SQL básica

Referece:stackoverflow.com

Este artigo é contribuído por Deepak Srivatsav. Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando contribute.geeksforgeeks.org ou enviar seu artigo por e-mail para [email protected]. Veja o seu artigo que aparece na página principal do GeeksforGeeks e ajude outros Geeks.

.

Deixe uma resposta

O seu endereço de email não será publicado.