Análisis principal de la inyección de errores.

Análisis del principio de
inyección de error La inyección de error de SQL consiste en utilizar algún mecanismo de la base de datos para crear artificialmente condiciones de error para que los resultados de la consulta puedan aparecer en el mensaje de error. Este método es más útil cuando la consulta conjunta es limitada y puede devolver información de error.
La premisa del uso de la inyección de error:
no hay un bit de visualización en la página, pero hay un bit de salida del mensaje de error de ejecución de la instrucción sql.
Use la función mysql_error () para devolver la información de error de texto generada por la última operación Mysql.
Clasificación de inyección de error MYSQL:

  1. BIGINT y otros tipos de datos desbordan
  2. error de sintaxis de xpath
  3. error floor ()
  4. Error de listado duplicado
  5. Los parámetros no están estandarizados

Desbordamiento de tipo de datos:

  1. Desbordamiento máximo de la operación de datos enteros:
    versión aplicable: el número de versión de mysql es mayor que 5.5.5
    (el procesamiento de datos enteros de Mysql es el siguiente :)
    Inserte la descripción de la imagen aquí
    Principio de error:
    el dato entero más grande sin bandera es 2 ^ 64-1, que es 18446744073709551615, cuando excede En este valor, se genera un error de desbordamiento de datos y se devuelve un mensaje de error
    (el valor BIGINT UNSIGNED está fuera de rango en 'xxxxxxxxxx').
    Inserte la descripción de la imagen aquí
    Por supuesto, cuando intente inyectar, especialmente cuando la longitud es limitada, no necesita ingresar el valor completo Cuente, puede usar la operación de inversión bit a bit:
    Inserte la descripción de la imagen aquí
    al mismo tiempo, sabemos que cuando la instrucción SQL se ejecuta con éxito, devolverá un valor de 0. Este valor puede usarse para operaciones lógicas u operaciones matemáticas, lo que significa que podemos usar este valor y El entero más grande realiza la operación, que puede pasar por alto algunas restricciones e implementar la inyección SQL.
    Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
    Intento de inyección: la
    carga útil es la siguiente:
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí

  2. Error de desbordamiento de la función Exp:
    versión aplicable: mysql5.5.44-5.5.47.
    Principio de error:
    el valor máximo del parámetro en la función Exp es 709. Cuando se toma 710, los datos calculados se han desbordado y se devuelve un mensaje de error (el valor DOUBLE está fuera de rango en 'xxxxxxx')
    Inserte la descripción de la imagen aquí
    intento de inyección: la
    carga útil es la siguiente:
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí
    cuando la versión es superior a 5.5.53, el resultado de la consulta no se puede devolver
    Inserte la descripción de la imagen aquí

Error de sintaxis de XPATH:
versión aplicable: el número de versión de mysql es mayor que 5.1.5

A partir de mysql5.1.5, se proporcionan dos funciones de consulta y modificación XML, extractvalue () y updatexml ().
Inserte la descripción de la imagen aquí
Extractvalue () es responsable de consultar el contenido del nodo en el documento xml de acuerdo con la sintaxis xpath. Updatexml () es responsable de modificar la consulta.
Prueba de función:
Inserte la descripción de la imagen aquí
principio de error:
el segundo parámetro de estas dos funciones debe ser una cadena que se ajuste a la sintaxis xpath. Si no se cumplen los requisitos, se informará un error y el resultado de la consulta se colocará en el mensaje de error.

Prueba de inyección:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Sin embargo, la limitación de estas dos funciones es que la más larga no puede exceder la
inyección Floor () de 32 bits :
función de tecla:
Rand () ------- Genere 0 ~ 1 número pseudoaleatorio
Floor () --- ---- Tome el entero abajo
Concat () ----- Conecte la cadena
Count () ------ Calcule el total

La carga útil es la siguiente:
Seleccione count (*), concat ( PAYLOAD , floor (rand (0) * 2)) x del nombre de la tabla group by x;

Análisis principal: en
primer lugar, el papel de rand (0) es generar un número aleatorio de 0 ~ 1, pero esta secuencia de números aleatorios es un número pseudoaleatorio, que también se puede decir que es un conjunto fijo de valores. Cuando multiplicamos este grupo de números aleatorios por 2, obtenemos También es un conjunto fijo de valores, como se muestra a
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
continuación : Luego usamos la función floor () para redondear hacia abajo y obtener un conjunto muy importante de números (011011011 ...) que se repite infinitamente, ¡esta secuencia es muy importante!
Inserte la descripción de la imagen aquí
Luego, analicemos la combinación de count () y group by.
Estos son los datos
Inserte la descripción de la imagen aquí
en la tabla de usuario. Consulte el número total de cada id en la tabla de usuario de acuerdo con id.
Inserte la descripción de la imagen aquí
Análisis en profundidad del principio, dividido principalmente en los siguientes pasos:

  1. Crear una tabla virtual, donde la clave es la clave principal, no se puede repetir
    Inserte la descripción de la imagen aquí
  2. Comience a consultar datos de la tabla original, tome el primero para ver si los datos existen en la tabla virtual, inserte datos nuevos si no existen y agregue directamente 1 al campo de conteo (*) si existe.
    Inserte la descripción de la imagen aquí
  3. Repita el paso 2 hasta que se hayan tomado todos los datos de la tabla original.
    Clave (id) Co1 12 1 + 1
    Sin embargo, cuando encontremos la secuencia mágica de 011011 que acabamos de construir, ocurrirá un gran problema. La esencia de este método de informe de errores se debe a la repetibilidad de floor (rand (0) * 2), que conduce a un error en el grupo por declaración. Cuando usamos esta secuencia, la clave primaria se duplicará y se generará un error.

Restauremos el proceso de inyección:

  1. Construir una mesa virtual
  2. El piso (rand (0) * 2) detrás del grupo se calcula por primera vez y se obtiene un valor de 0. El valor se compara con la tabla virtual. Se encuentra que no existe tal valor, por lo que se realiza el proceso de inserción, pero cuando se realiza la inserción, el Dos operaciones, tome 1 valor e insértelo en la tabla virtual por completo, el resultado es el siguiente:
    Count (*) concat (PAYLOAD, floor (rand (0) * 2)) 1 xxx1
  3. Continúe, tome el segundo valor 1 (este es el valor después de la tercera operación) y compárelo en la tabla virtual, y descubra que hay un valor, por lo que el recuento aumenta en 1.
    Count (*) concat (PAYLOAD, floor (rand (0) * 2)) 1 + 1 xxx1
  4. Al tomar el tercer valor de 0 (aquí, porque es la cuarta operación, es 0), el valor no se encuentra en la tabla virtual, por lo que se realiza el proceso de inserción. Cuando se realiza la inserción para la quinta operación, se convierte en 1 Insert, y debido a que la clave primaria de 1 ya existe en la tabla, entonces hay un error de repetición de clave primaria y se lanza una excepción (la clave primaria 1 se repite).
    Inserte la descripción de la imagen aquí

Prueba de inyección: durante
Inserte la descripción de la imagen aquí
todo el proceso de consulta, el piso (rand (0) * 2) se calculó 5 veces, y la tabla de datos original se consultó 3 veces, por lo que se requirieron al menos 3 datos en la tabla para informar un error.

Error de nombre de columna duplicado:
Versión aplicable: solo aplicable a la versión baja de mysql
Función de clave:
NAME_CONST ()
Inserte la descripción de la imagen aquí
De acuerdo con la documentación oficial, la función name_const () requiere que el parámetro sea constante, por lo que debemos usar dos funciones name_const () en sucesión Como función a consultar, provocará un error de nombre de columna duplicado y devolverá el resultado de la consulta en el mensaje de error.
Inserte la descripción de la imagen aquí
El uso de la función de error repetido del nombre de columna, además de la función de unión, puede obtener aún más el
Inserte la descripción de la imagen aquí
error del parámetro de nombre de columna no está estandarizado:
versión aplicable: el número de versión de mysql está en 5.5.44-5.7.17

mysql algunas funciones geométricas, como geometrycollection (), multipunto (), polígono (), multipolígono (), lineas (), multilíneas (), estas funciones requieren parámetros como (1 2,3 3,2 2 1) Si los datos geométricos no cumplen los requisitos, se informará un error.

Prueba de
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
inyección: método de inyección de prevención de errores Mysql:

  1. Bloquear varias funciones que pueden causar errores de inyección, funciones
  2. Limite la longitud de entrada y preprocese la entrada del usuario
  3. Los resultados devueltos de varias inyecciones de error se devuelven a la página de eco sin ninguna información de error.
  4. Utilice el firewall de la base de datos para analizar con precisión el SQL comercial y el SQL peligroso, e intercepte declaraciones peligrosas como la inyección de SQL
Publicó 21 artículos originales · ganó 14 · visitó 4075

Supongo que te gusta

Origin blog.csdn.net/m0_38103658/article/details/100161168
Recomendado
Clasificación