domingo, febrero 07, 2016

Un tip para SQL Injection Smuggling: @@Version en MySQL

Llevo muchos años con el mundo de las bases de datos y las técnicas de SQL Injection, de las que he dado muchas charlas y he participado en la publicación de un libro dedicado a ellas [Hacking aplicaciones Web: SQL Injection]. Aún así, siempre hay algo que no habías probado o que no había mirado, y este fin de semana, con mis alumnos del Master de Seguridad de la UEM, tocó revisar un pequeño detalle que no había usado nunca. Se trata de @@version en los motores de bases de datos MySQL.

Figura 1: Un tip para "SQL Injection Smuggling". @@version en BBDD MySQL

El objetivo es simple, se trata de averiguar la versión concreta de un motor de bases de datos que está detrás de una aplicación web vulnerable a SQL Injection. Para eso hay muchos trucos, y dependiendo del motor puedes ir a buscar elementos reconocibles en el diccionario de datos para saber a qué te enfrentas. Cada motor y cada entorno tienen sus trucos.

Figura 2: Mostrando @@version de Microsoft SQL Server en un error ODBC

En el caso de los motores Microsoft SQL Server, uno de los trucos más sencillos es imprimir el resultado de la función @@version, tal y como se puede ver en la imagen superior con un ataque outband usando los errores ODBC.

Obtener la versión en My SQL

En el caso de MySQL, ya sea por medio de ataques Blind SQL Injection, por medio de ataques outband de todo tipo, o por un ataque inband, se puede usar la función version(), tal y como se ve en este ejemplo en el que se saca partido de una inyección inband con claúsula UNION.

Figura 3: Ataque Inband SQL Injection en una WebApp con MySQL.
Se muestran los campos 2 y 3 la Select

Lo que no había usado yo nunca, quizá porque nunca lo había necesitado lo suficiente, es utilizar la función @@version en motores de bases de datos MySQL. De hecho pensaba que no funcionaba en ellos, ya que en la documentación de MySQL siempre te encuentras con la referencia a version()

Figura 4: Las funciones version() y @@version son sinónimos en MySQL

Ni en la parte de Determining your Current MySQL Version ni en la parte de Information Functions aparece. Pero sí, sí funciona, y en muchos sitios de Internet puedes encontrar referencia a ello.

Figura 5: Referencia en Internet a @@version en MySQL

Lo cierto es que en el pasado me he topado con algún filtro en el que se quitaban los paréntesis, con lo que hacer el SQL Smuggling (o como meter exploits de SQL Injection de contrabando saltándose los filtros de seguridad) se hace más complicado. En la charla de Codemotion 2013 hablé un poco sobre esto, por si quieres verlo.


Figura 6: Codemotion 2013 - SQL Injection: Feliz 15 Aniversario


En el ejemplo de averiguar la versión de MySQL, si lo haces con @@version no se necesitan paréntesis pero sí el símbolo de la arroba. Si el filtro es seguro y quita todos los caracteres, no vale de nada, pero no será la primera vez que se encuentra un filtro que quitar espacios pero no comentarios, o que quita paréntesis pero no arrobas. Si como yo has usado siempre version() en MySQL, que sepas que también puedes usar @@version, solo eso.

Saludos Malignos!

2 comentarios:

  1. Hola,

    Eso yo también lo he usado (en clase). Está en la guía OWASP ;)

    Un saludo

    ResponderEliminar
  2. Es enserio????? Ósea eso es súper básico xD jajjaja te mamaste

    ResponderEliminar