Por que é necessária a injeção sem coluna?
Nosso método de injeção SQL comumente usado é information_schema
implementado 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:
-
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. -
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;
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.
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;
Verifique várias colunas ao mesmo tempo
select concat(`2`,`3`) from (select 1,2,3 union select * from user)xxx;
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;
select b from (select 1 as a,2 as b,3 as c union select * from user)xxx;
Outro método é usar JOIN
injeçã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;
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;
E assim por diante para o resto.
select * from (select * from user as a join user as b using(id,username))xxx;
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--+