Você está na página 1de 2

Injeção de SQL Cega

Descrição

Injeção de SQL Cega (Linguagem de Consulta Estruturada) é um tipo de ataque de


injeção SQL que pede aos bancos de dados verdadeiras ou falsas questões e determina
a resposta com base na resposta das aplicações. Este ataque é muitas vezes usado
quando a aplicação web está configurada para exibir mensagens de erro genéricas,
mas não mitigou o código que é vulnerável a injeção de SQL.
Quando um invasor explora uma injeção de SQL, por vezes, a aplicação web exibe
mensagens de erro do banco de dados se queixando de que a sintaxe da consulta SQL
está incorreto. Injeção de SQL Cega é quase idêntica à Injeção de SQL normal, sendo
a única diferença a maneira como os dados são recuperados a partir da base de
dados. Quando o banco de dados não tem dados de saída para a página web, um
atacante é forçado a roubar dados, fazendo o banco de dados de uma série de
perguntas de verdadeiro ou falso. Isso faz com que a exploração da vulnerabilidade
de SQL seja mais difícil, mas não impossível..

Exemplos:

Um atacante pode verificar se um pedido enviado retorna verdadeiro ou falso de


algumas maneiras:

Baseada em conteúdo ~
Usando uma página simples, que exibe um artigo com determinado ID como parâmetro, o
atacante pode realizar alguns testes simples para determinar se a página é
vulnerável a ataques de SQL Injection.
Exemplo de URL:
http://newspaper.com/items.php?id=2
Envia a seguinte consulta ao banco de dados:

SELECT title, description, body FROM items WHERE ID = 2

O atacante pode então tentar injetar uma consulta que retorna 'false':
http://newspaper.com/items.php?id=2 and 1=2
Agora, a consulta SQL deve se parece com isso:

SELECT title, description, body FROM items WHERE ID = 2 and 1=2

Se a aplicação web é vulnerável à SQL Injection, então ela provavelmente não vai
retornar nada. Para se certificar, o atacante vai injectar uma consulta que irá
retornar 'true':
http://newspaper.com/items.php?id=2 and 1=1
Se o conteúdo da página que retorna "verdadeira" é diferente do que a da página que
retorna "falso", o atacante vai ser capaz de distinguir, quando a consulta
executada devolve verdadeiro ou falso.
Uma vez que isso foi verificado, as únicas limitações são privilégios criados pelo
administrador do banco de dados, diferente sintaxe SQL, e a imaginação do invasor.

Baseado no tempo ~
Este tipo de Injeção de SQL Cega confia no banco de dados parando por um período de
tempo especificado, em seguida, retorna os resultados, indicando a execução de uma
consulta SQL bem sucedida. Usando este método, um atacante enumera cada letra do
pedaço desejado de dados usando a seguinte lógica:
Se a primeira letra do nome do primeiro banco de dados é um 'A', aguarde 10
segundos.
Se a primeira letra do nome do primeiro banco de dados é um 'B', aguarde 10
segundos. etc
Microsoft SQL Server
http://www.site.com/vulnerable.php?id=1' waitfor delay '00:00:10'--

MySQL
SELECT IF(expression, true, false)

Usando uma operação de tomada de tempo, por exemplo, BENCHMARK (), vai atrasar as
respostas do servidor se a expressão for True.

BENCHMARK(5000000,ENCODE('MSG','by 5 seconds'))

- Irá executar a função ENCODE 5000000 vezes.


Dependendo do desempenho e da carga do servidor de banco de dados, ele deve ter
apenas um momento para concluir esta operação. O importante é, do ponto de vista do
atacante, para especificar um número alto o suficiente do índice de referência ()
das funções de repetições afetar o tempo de resposta do banco de dados de uma forma
perceptível.
Exemplo de combinação de ambas as consultas:

1 UNION SELECT IF(SUBSTRING(user_password,1,1) =


CHAR(50),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM users WHERE
user_id = 1;

Se a resposta do banco de dados levou muito tempo, podemos esperar que o primeiro
caractere de senha de usuário com user_id = 1 é o caráter '2 '.

(CHAR(50) == '2')

Usando este método para o resto de caracteres, é possível enumerar senhas inteiras
armazenados no banco de dados. Este método funciona mesmo quando o atacante injeta
as consultas SQL eo conteúdo da página vulnerável não muda.
É óbvio que, neste exemplo, os nomes das tabelas e o número de colunas foi
especificado. No entanto, é possível adivinhar-los ou verificar com um método de
tentativa e erro.
Outras bases de dados de MySQL também têm funções baseadas no tempo que lhes
permitam ser usado para ataques baseados no tempo:
* MS SQL 'WAIT FOR DELAY '0:0:10 [*MS SQL 'PARA O ATRASO' 0:00:10]
* PostgreSQL - pg_sleep()

A realização ataques Injeção de SQL Cega manualmente é muito demorado, mas há uma
série de ferramentas que automatizam este processo. Um deles é o SqlMap
(http://sqlmap.sourceforge.net/). Por outro lado, as ferramentas deste tipo são
muito sensíveis a pequenos desvios da regra. Isto inclui:
* Digitalização de outros clusters no site, onde os relógios não são perfeitamente
sincronizados,
* Serviços WWW, onde método adquirir argumento foi alterado, por exemplo, de /
index.php? ID = 10 a / ID, 10

Impressões Digitais do banco de dados remoto ~

Se o atacante é capaz de determinar quando a sua consulta retorna True ou False,


então ele pode ter a impressão digital do RDBMS. Isso fará com que todo o ataque
seja muito mais fácil. Se for utilizada a abordagem baseada em tempo, isso ajuda a
determinar o tipo de banco de dados está em uso. Outros métodos populares para
fazer isso é chamar as funções que irá retornar a data atual. MySQL, MSSQL e Oracle
têm funções diferentes para que, respectivamente now (), getdate (), e sysdate ().

Você também pode gostar