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

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

O que é injeção de SQL?

A injeção de SQL é um tipo de ataque de banco de dados no qual um invasor tenta roubar informações do banco de dados de um aplicativo da web. Isso pode até resultar na execução do código remoto, dependendo do ambiente de aplicativos da Web e da versão do banco de dados.

A injeção de SQL ocorre devido à baixa higienização da entrada do usuário. Se você receber a entrada do usuário em algum idioma de codificação (PHP, ASP.Net) e passe diretamente para o banco de dados do servidor sem aplicar nenhum filtro na entrada, isso pode resultar na vulnerabilidade da injeção de SQL.

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

// O usuário é armazenado na variável de identificação
$ id = $ _get ['id'];
// O UserInput é executado diretamente no banco de dados
$ getid = "Selecione First_Name, last_name dos usuários onde user_id = '$ id'";
// Em caso de erro ou sucesso, os resultados são retornados ao usuário
$ resultado = mysql_query ($ getId) ou die ('
' . mysql_error () . '
');
$ num = mysql_numRows ($ resultado);

Por outro lado, um exemplo de código seguro desse código para interagir com o banco de dados é fornecido. Ele leva a entrada do usuário e filtra qualquer caractere malicioso e depois passa para o banco de dados.

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

Injeção normal de SQL cega

Injeção normal de SQL

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

O código responsável por este erro é

// Se o banco de dados responder com um erro, a função "ou die ()" é executada
Para imprimir o erro
$ resultado = mysql_query ($ getId) ou die ('
' . mysql_error () . '
');

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

Injeção cega de SQL

No caso de injeção cega de SQL, quando uma consulta maliciosa como uma única citação é executada, o erro do banco de dados não é exibido no navegador do atacante ou é exibido de uma maneira muito genérica que não pode ser identificada e explorada facilmente pelo atacante.

O código de back -end responsável por isso é dado abaixo

$ resultado = mysql_query ($ getId); // removido 'ou morrer' para suprimir erros do MySQL

Na injeção cega de SQL, o atacante não pode ver os resultados completos, portanto, esse tipo de SQLI é difícil de identificar e explorar, mas tem o mesmo nível de risco que o SQLI normal.

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

Embora a injeção normal de SQL possa ser detectada enviando uma citação única (') como entrada e examinando o erro de saída, a injeção de SQL cega não pode ser detectada usando essa técnica porque não exibe nenhum erro SQL. Existem muitas técnicas para detectar uma injeção cega de SQL, algumas delas são dadas o seguinte

Detecção verdadeira e falsa baseada

Uma das características dos bancos de dados, incluindo o MySQL, é o comportamento diferente sobre declarações verdadeiras e falsas. Mesmo que o banco de dados não mostre erros, podemos decidir usar o uso de instruções verdadeiras e falsas. Considere o seguinte cenário,

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

1 'ou 1 = 1#

Dar uma consulta falsa como entrada não exibirá dados.

1 'ou 1 = 2#

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

Detecção baseada no tempo

Há 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 é executada com sucesso e a página da web é vulnerável à injeção cega de SQL.

1 'e sono (15)#

Há outra função demorada "Benchmark", que pode ser usada para adiar 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 de SQL cegas baseadas em tempo em outros bancos de dados

MS SQL: Id = 1; espera para atraso '0: 0: 10'-

Oracle SQL: E [Randnum] = dbms_pipe.RECEBENHO_MESSAGE ('[RANDSTR]', [SleepTime])

PostGresql: E [Randnum] = (selecione [Randnum] em PG_SLEEP ([SleepTime])))

Sqlite: E [Randnum] = como ('ABCDEFG', Upper (Hex (Randomblob ([Sono SleepTime] 00000000/2))))))

Extraindo informações do banco de dados

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

A injeção de SQL cega se comporta de maneira diferente com diferentes números de colunas em "Ordem By" Consulta.

1 'Ordem 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 'Ordem por 10000#

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

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

1 'Ordem por 3#

O banco de dados não envia nenhuma resposta, o que significa que o banco de dados possui 2 colunas. Agora tentaremos despejar a lista de tabelas no banco de dados, usaremos a seguinte consulta para isso

1 'união todos selecionados 1, group_concat (table_name) de Information_schema.
Tabelas onde tabela_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 nomes de colunas da tabela, insira a seguinte consulta.

1 'união todos selecionados 1, group_concat (column_name) de Information_schema.
colunas onde tabela_schema = database ()#

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

Agora vamos tentar extrair os dados usando a seguinte consulta

1 'união todos selecionados 1, group_concat (usuário, senha) de usuários#

E é assim que você pode explorar a injeção cega de SQL sem depender de erros. As senhas de saída são hashed na maioria das vezes, que podem ser descriptografadas usando ferramentas como John the Ripper ou Hashcat.

Conclusão:

A injeção cega de SQL é 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 cega de injeção de SQL em uma página da web. Depois de detectado, você pode explorá -lo facilmente por processo manual ou automatizado usando o SQLMAP.