¿Cómo saber si mi página es vulnerable a SQL Injection?

La Inyección de codigo es la vulnerabilidad numero 1 según el OWASP top 10, por lo que debería ser el primer tema de verificación de nuestras aplicaciones web. Para saber si mi página es vulnerable a sql injection existen diversas maneras de detectarlo, una de las pruebas más sencillas es agregando una apóstrofe justo después del id y si nos devuelve un error relacionado a una consulta mal hecha hacia la base de datos, quiere decir que somos vulnerables. Sin embargo el no recibir el error, no implica que estemos libres de esa vulnerabilidad, veamos como interpreta la prueba nuestro servidor.

 

¿Qué es lo peor que podría pasar si mi página es vulnerable a sql injection?

Conociendo que la página es vulnerable, podemos preguntarle en primer instancia de cuantas tablas dispone, para ello quitamos el apóstrofe anterior y agregamos un order by + número aleatorio. Este número aleatorio irá aumentando hasta que se nos muestre un error en la página, porque significará que hemos sobre pasado el número de tablas de las que dispone la base de datos. Por ejemplo, esta página dispone de 10 tablas, por eso no da error al insertar el order by (se muestra el contenido habitual):

Pero si colocamos order by 11, nos mostrará error porque hemos sobre pasado el número de tablas de las que dispone la base de datos (Esto puede variar en cada caso, a veces puede superar las 50 tablas).

Ahora colocamos un signo menos al id en prueba y agregamos la siguiente sentencia +UNION+SELECT+1,2,3,4,5,6,7,8,9,10–. Estos números indican el número de tablas, por eso he llegado hasta 10 pero como mencioné anteriormente, esto puede variar.

Nos arroja, dos números en pantalla, podemos escoger cualquiera de ellos, en este caso seleccionamos el 4 y en la sentencia que se ha ingresado anteriormente, sustituimos el número 4 por table_name y agregamos al final +from+information_schema.tables–, quedando nuestra inyección de la siguiente manera:

Observen que nos devuelve el nombre de una tabla. Para ver otras tablas agregaremos justo después de tables lo siguiente +limit+2,1– (Donde la posición del 2 irá en aumento hasta encontrar una tabla de nuestro interés y por su puesto que esto también tiene un límite, al mostrarse un error en pantalla querrá decir que el número de esa tabla no existe). En este ejemplo ocuparemos el número 18, que corresponde a la tabla categorías y se muestra como parte del contenido, quedando de la siguiente manera:

Ahora, tomamos el nombre de dicha tabla  y lo convertimos a un valor ASCII, pueden utilizar la siguiente página https://www.easycalculation.com/ascii-hex.php. Quedará de la siguiente manera:

Le ordenaremos a la base de datos a que nos retorne las columnas de la tabla que le indicaremos en valores ascii, haremos un par de cambios como sustituir el valor table_name por group_concat(column_name) y el valor information_schema.tables por information_schema.columns+where+table_name=char(99,97,116,101,103,111,114.105,101,115) el valor dentro de char es el ascii que hemos obtenido de la tabla categories, sustituiremos esos espacios por comas (,). La inyección quedará de la siguiente manera:

-65+UNION+SELECT+1,2,3,group_concat(column_name),5,6,7,8,9,10+from+information_schema.columns+where+table_name=char(99,97,116,101,103,111,114,105,101,115)–

Observe que se muestra en pantalla las columnas de la tabla categories, ahora nuestro interés está enfocado en conocer el contenido de esas columnas. A continuación le haremos otros cambios a nuestra inyección, sustituiremos el valor group_concat(column_name) por concat(id,0x3a,teamid,0x3a,category,0x3a,status,0x3a,panel,0x3a,sort), el 0x3a significa que quiero que me muestre dos puntos (:) para delimitar los resultados que se arrojarán. De igual forma cambiaremos el valor de +from+information_schema.columns+where+table_name=char(99,97,116,101,103,111,114,105,101,115)– por +from+categories–, quedando nuestra inyección de la siguiente manera:

-65+UNION+SELECT+1,2,3,concat(id,0x3a,teamid,0x3a,category,0x3a,status,0x3a,panel,0x3a,sort),5,6,7,8,9,10+from+categories–

Los valores que hemos obtenido corresponden al contenido de una de las columnas de la tabla categories.

¿Se pueden hacer estas pruebas de forma automatizada?

La respuesta es, SI, pero es importante entender que es lo que hace la herramienta, es decir, hace lo mismo que hemos hecho hasta acá y mucho más, solo que en milésimas de segundos, a continuación una muestra:

Utilizaremos sqlmap de kali linux, esta es una poderosa herramienta desarrollada en Python para hacer inyecciones sql de forma automática, está orientada hacia las aplicaciones web, evalúa si posee la vulnerabilidad y de encontrarse se aprovecha de ella y la explota.

Basta con utilizar el comando sqlmap -u ‘link+de+la+pagina+con+posible+id+inyectable’ –random-agent -v 3 –dbs

Si encuentra que la página es vulnerable a inyecciones sql aparecerá algo como lo siguiente:

Y como paso final , explotará la vulnerabilidad y nos mostrará las bases de datos disponibles para dicha página.

En nuestras pruebas paso a paso nos topamos con la deficiencia de que todas las tablas están revueltas, no conocemos a que base de datos pertenece pero con sqlmap esto se nos facilita un poco más. Le preguntamos a la página cual es su base de datos principal con el comando sqlmap -u ‘link+de+la+pagina+con+posible+id+inyectable’ –random-agent –current-db

Nos arrojará el siguiente resultado:

Quiere decir que en este caso, la base de datos principal para esa página tiene el nombre de ‘legends’, entonces preguntemosle cuales son sus tablas, con el comando sqlmap -u ‘link+de+la+pagina+con+posible+id+inyectable’ –random-agent -D legends –tables

Debería mostrarnos el nombre de todas las tablas, observe que listó la tabla categories, misma que hemos encontrado en la evaluación paso a paso.

Ahora que conocemos las tablas, preguntémosle a la misma categories cuales son sus columnas (debe mostrar las mismas de la evaluación paso a paso). Utilizaremos el comando sqlmap -u ‘link+de+la+pagina+con+posible+id+inyectable’ –random-agent -D legends -T categories –columns

El resultado se muestra a continuación, observe que son las mismas columnas.

Ahora, necesitamos saber cual es el contenido que guardan las columnas de la tabla categories, utilizaremos el comando sqlmap -u ‘link+de+la+pagina+con+posible+id+inyectable’ –random-agent -D legends -T categories –dump

El resultado será el siguiente:

Observe que la primera fila de datos fue la que hemos obtenido en nuestra prueba de concepto paso a paso, es decir, ambas pruebas han sido un éxito y hemos evaluado el panorama desde dos perspectivas similares, siempre es aconsejable hacer las dos para validar los resultados.

Conclusiones: Nótese que hemos utilizado una tabla aparentemente con poca información útil, pero ¿Y si nuestra página contara con tablas sensibles que alojen credenciales de usuarios administradores? sería más comprometedor para la empresa, es por eso que la ciberseguridad debe tomarse con más seriedad, pues los ciberataques ya no son más un cuento de ciencia ficción, son una realidad y todos deben estar conscientes de ello.

About the author: admin

Leave a Reply

Your email address will not be published.