Teste de penetração Python - SQLi Web Attack

A injeção de SQL é um conjunto de comandos SQL que são colocados em uma string de URL ou em estruturas de dados para recuperar uma resposta que desejamos dos bancos de dados que estão conectados aos aplicativos da web. Esse tipo de ataque geralmente ocorre em páginas da Web desenvolvidas em PHP ou ASP.NET.

Um ataque de injeção de SQL pode ser feito com as seguintes intenções -

  • Para modificar o conteúdo dos bancos de dados

  • Para modificar o conteúdo dos bancos de dados

  • Para realizar diferentes consultas que não são permitidas pelo aplicativo

Este tipo de ataque funciona quando os aplicativos não validam as entradas adequadamente, antes de passá-las para uma instrução SQL. As injeções são normalmente colocadas em barras de endereço, campos de pesquisa ou campos de dados.

A maneira mais fácil de detectar se um aplicativo da web é vulnerável a um ataque de injeção de SQL é usar o caractere "'" em uma string e ver se ocorre algum erro.

Tipos de ataque SQLi

Nesta seção, aprenderemos sobre os diferentes tipos de ataque SQLi. O ataque pode ser categorizado nos dois tipos a seguir -

  • Injeção de SQL em banda (SQLi simples)

  • Injeção SQL inferencial (SQLi cego)

Injeção de SQL em banda (SQLi simples)

É a injeção SQL mais comum. Este tipo de injeção de SQL ocorre principalmente quando um invasor é capaz de usar o mesmo canal de comunicação para lançar o ataque e reunir resultados. As injeções de SQL em banda são divididas em dois tipos -

  • Error-based SQL injection - Uma técnica de injeção de SQL baseada em erro depende de mensagem de erro lançada pelo servidor de banco de dados para obter informações sobre a estrutura do banco de dados.

  • Union-based SQL injection - É outra técnica de injeção 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.

Injeção SQL inferencial (SQLi cego)

Nesse tipo de ataque de injeção de SQL, o invasor não consegue ver o resultado de um ataque dentro da banda porque nenhum dado é transferido por meio do aplicativo da web. Esta é a razão pela qual também é chamado de Blind SQLi. As injeções SQL inferenciais são de dois tipos -

  • Boolean-based blind SQLi - Este tipo de técnica depende do envio de uma consulta SQL ao banco de dados, o que força o aplicativo a retornar um resultado diferente dependendo se a consulta retorna um resultado VERDADEIRO ou FALSO.

  • Time-based blind SQLi- Esse tipo de técnica se baseia no envio de uma consulta SQL ao banco de dados, o 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.

Exemplo

Todos os tipos de SQLi podem ser implementados pela manipulação de dados de entrada para o aplicativo. Nos exemplos a seguir, estamos escrevendo um script Python para injetar vetores de ataque no aplicativo e analisar a saída para verificar a possibilidade do ataque. Aqui, vamos usar o módulo python chamadomechanize, que dá a facilidade de obter formulários da web em uma página da web e também facilita o envio de valores de entrada. Também usamos este módulo para validação do lado do cliente.

O seguinte script Python ajuda a enviar formulários e analisar a resposta usando mechanize -

Primeiro de tudo, precisamos importar o mechanize módulo.

import mechanize

Agora, forneça o nome do URL para obter a resposta após o envio do formulário.

url = input("Enter the full url")

A seguinte linha de códigos abrirá o url.

request = mechanize.Browser()
request.open(url)

Agora, precisamos selecionar o formulário.

request.select_form(nr = 0)

Aqui, definiremos o nome da coluna 'id'.

request["id"] = "1 OR 1 = 1"

Agora, precisamos enviar o formulário.

response = request.submit()
content = response.read()
print content

O script acima imprimirá a resposta para a solicitação POST. Enviamos um vetor de ataque para quebrar a consulta SQL e imprimir todos os dados da tabela em vez de uma linha. Todos os vetores de ataque serão salvos em um arquivo de texto, digamos, vetores.txt. Agora, o script Python fornecido a seguir obterá esses vetores de ataque do arquivo e os enviará ao servidor um por um. Ele também salvará a saída em um arquivo.

Para começar, vamos importar o módulo mecanizar.

import mechanize

Agora, forneça o nome do URL para obter a resposta após o envio do formulário.

url = input("Enter the full url")
   attack_no = 1

Precisamos ler os vetores de ataque do arquivo.

With open (‘vectors.txt’) as v:

Agora vamos enviar solicitação com cada vetor arrack

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Agora, a linha de código a seguir gravará a resposta no arquivo de saída.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Ao verificar e analisar as respostas, podemos identificar os possíveis ataques. Por exemplo, se ele fornece a resposta que inclui a fraseYou have an error in your SQL syntax então isso significa que o formulário pode ser afetado pela injeção de SQL.