Post17 n

Inyección SQL: Definición y ejemplos reales.


Perfil
Samuel Esteban

En esta oportunidad hablaremos en detalle sobre las inyecciones SQL. Una inyección SQL es una vulnerabilidad categorizada como crítica, la cual permite a un atacante inyectar sentencias SQL a través del(los) input(s) de un aplicativo web. Esta vulnerabilidad se puede producir automáticamente cuando un programa "arma descuidadamente" una sentencia SQL en tiempo de ejecución, o bien durante la fase de desarrollo, cuando el programador explicita la sentencia SQL a ejecutar en forma desprotegida. En cualquier caso, siempre que el programador necesite y haga uso de parámetros a ingresar por parte del usuario, a efectos de consultar una base de datos; ya que, justamente, dentro de los parámetros es donde se puede incorporar el código SQL intruso. Para entrar en detalle de cómo funciona esta vulnerabilidad pondremos el siguiente ejemplo:


                                                      Ejemplo 1 – Inyección SQL


En la imagen anterior es posible observar un claro ejemplo de una inyección SQL, aquel input genera consulta a la base de datos del sistema, sin embargo si se agrega una comilla simple nos podemos percatar que se genera un error SQL, el cual hace referencia al motor de base de datos Mysql. Este error se produce porque la aplicación no sanitiza caracteres especiales, y en base a los errores que devuelve la aplicación es posible inyectar sentencias SQL. También existen las inyecciones SQL ciegas, estas inyecciones se caracterizan por no mostrar un error directamente en el aplicativo web, si no que producen cambios (alteraciones) distintos, como por ejemplo hacer que un botón o un checkbox aparezca en otro lado del sitio web, etc,  también es posible que respondan a una inyección basada en tiempo, el cual hace que el sitio web sea pausado por una cierta cantidad de tiempo,  veamos un ejemplo de este tipo de inyección:


Tenemos la siguiente URL:


Ejemplo 2 – Inyección SQL ciega basada en Tiempo



Cabe mencionar que las inyecciones SQL no son solo son inyectables a través de los recursos o campos visibles del aplicativo web (ejemplo: php?id=), sino que también es posible realizar inyecciones SQL en parámetros de la aplicación tales como el Host, User-Agent, Referer, Headers. Como es posible observar en las imagen anterior, se inyectaron los Headers de la aplicación (obviamente esta vulnerabilidad fue detectada con anterioridad a través de  una herramienta automatizada). La inyección SQL ciega basada en tiempo hace que la base de datos se pause por un tiempo especificado, para que posteriormente devuelva los resultados, a través de esta inyección, un atacante enumera cada letra de la porción de datos que desea leer usando la siguiente lógica:

Si la primera letra del nombre de la Base de Datos es una “A”, esperar 10 segundos.

Si la primera letra del nombre de la Base de Datos es una “B”, esperar 10 segundos, etc…

Así con cada letra, si la respuesta tarda diez segundos es que es la letra por la que preguntamos si no es así continuamos con la siguiente. Por esta razón para este tipo de inyecciones siempre es recomendable utilizar una herramienta automatizada como Sqlmap, ya que facilita el trabajo y nos permite ahorrar una gran cantidad de tiempo.


                

Ejemplo 3 – Inyección SQL basada en tiempo



La aplicación es vulnerable ya que el vector de ataque que fue utilizado, indica que la aplicación debe esperar por 30 segundos, y efectivamente esto sucedió, por lo tanto se demostró que es vulnerable a una inyección SQL ciega basada en tiempo, en otro documento veremos cómo explotar esta vulnerabilidad con SQLMAP. Si deseas estudiar en detalle las formas de lograr realizar una inyección SQL en distintos motores de base de datos te recomendamos el siguiente link:


http://pentestmonkey.net/category/cheat-sheet


Inyecciones SQL Basadas en:


Boolean-Based Blind: la inyección SQL ciega basada en expresiones Boleanas (verdadero o falso), nos indica que la URL responde a estas inyecciones y a su vez produce cambiar en el aplicativo web como tal. Por ejemplo:


www.sitioweb.com/index.php?id=3 AND 1=1 // verdadero

Esta condición es verdadera, y en el sitio web no se ve reflejado ningún tipo de cambio

www.sitioweb.com/index.php?id=3 AND 1=0 // falso

Esta condición es falsa y en el sitio web se ven cambios por ejemplo, desaparece un botón o se cambiar de posición, etc.



Time-Based Blind: como ya vimos anteriormente la inyección SQL ciega basada en tiempo hace que la base de datos sea pausada por un intervalo de tiempo. Ejemplo:


www.sitioweb.com/index.php?id=3 ‘ AND SLEEP(10)=’               //MYSQL

www.sitioweb.com/index.php?id=3  WAITFOR DELAY ’0:0:5′    //MSSQL


Error-Based: este tipo de inyecciones (basadas en error), son vulnerabilidades que nos devuelven un error de forma visible dentro del aplicativo web.

www.sitioweb.com/index.php?id=3

warning mysql_fetch_array() expects parameter 1 to be resource boolean given in

www.sitioweb.com/index.php?id=3

Server Error in ‘/’ Application. Unclosed quotation mark before the character string ‘attack;’.


Union Query-Based: se basa en añadir una consulta que empiece con UNION ALL SELECT, revelando información sensible solo si la aplicación web vuelca toda la información devuelta por la BD en la página web atacada.


www.sitioweb.com/index.php?id=3 UNION ALL SELECT 1,2,3,4,5,6,7,8 --


Stacked-queries: funcional solo en aquellos casos en los que la aplicación web permite la ejecución múltiple de consultas (separadas por ‘;’), y aprovecha esta funcionalidad para añadir todo tipo de consultas de ataque después de la consulta válida enviada.


www.sitioweb.com/index.php?id=3; DELETE FROM products


Mensajes de error en relación a Motores de Base de Datos


Microsoft SQL Server

Server Error in ‘/’ Application. Unclosed quotation mark before the character string ‘attack;’.

Exception Details: System.Data.SqlClient.SqlException: Unclosed quotation mark before the character string ‘attack;’.


Mysql

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/myawesomestore.com/buystuff.php on line 12

Error: You have an error in your SQL syntax: check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’’ at line 12


Oracle

java.sql.SQLException: ORA-00933: SQL command not properly ended at oracle.jdbc.dbaaccess.DBError.throwSqlException(DBError.java:180) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)

Error: SQLExceptionjava.sql.SQLException: ORA-01756: quoted string not properly terminated


PostgreSQL

Query failed: ERROR: unterminated quoted string at or near “‘’’”



Artículos que te pueden interesar