Number of Columns disclosure
De ICEnetX Docs
Este método aclera mucho el proceso de recolección de información cuando se planea realizar una ataque por inyección SQL. Con él podremos saber el número de columnas en una tabla con una sóla consulta.
Tabla de contenidos |
Nota
Se asume que el lector tiene conocimientos sobre SQL Injection.
Introducción
Al estar experimentando con ataques de inyección SQL encontré algo que no había visto antes. Un sencillo vector de ataque que simplifica la manera de encontrar el número de columnas de una tabla.
Al igual que con el UNION Injection login Bypass, no pienso ser la primera persona en descubrir esto, seguramente ya ha sido usado. Pero francamente en todos los documentos que he leído sobre SQL Injection (han sido bastantes) nunca he encontrado algo similar a lo que aquí presento. Es algo muy lógico y puede que básico, pero quiero compartirlo y espero que les sea de utilidad.
Método
Comúnmente al hacer inyecciones SQL contra aplicaciones web, encontramos la necesidad de hacer consultas con UNION SELECT (algo indispensable cuando queremos extraer datos de una tabla).
Sucede que para poder hacer una inyección "UNION SELECT" hay que saber exactamente el número de columnas en una tabla. Si ya han realizado este tipo de inyecciones entonces seguramente saben que para averiguar el número de columnas en la tabla de la consulta hay que utilizar varios vectores de ataque progresivos, muy similares a la fuerza bruta:
' UNION SELECT 1 /* ' UNION SELECT 1,2 /* ' UNION SELECT 1,2,3 /* ... UNION SELECT 1,2,3,4,5,6......
Y seguir así sucesivamente hasta que la inyección no regrese ningún error, también se puede hacer utilizando el operando ORDER BY:
' ORDER BY 1 /* ' ORDER BY 2 /* ' ORDER BY 3 /* ... ' ORDER BY n /*
Lo mismo, fuerza bruta hasta que la inyección no regrese errores.
Estos vectores son los que encontrarán en todos los documentos de inyección SQL como método para averiguar el número de columnas. Muy populares pero engorrosos. La desventaja esque no falta encontrarse con una tabla con demasiadas columnas (he visto tablas de más de 30 columnas); conseguir el número de columnas de una tabla nos puede tomar mucho tiempo. Tiempo que puede ser ahorrado obteniendo el número de columnas con UN SÓLO vector de ataque:
1' AND (SELECT * FROM tabla_objetivo)=1 /*
Dicho vector nos va a mostrar exactamente la cantidad de columnas en 'tabla_objetivo'.
NOTA: El ataque sólamente funciona si el script muestra los errores en pantalla (una práctica muy usada)
Suponiendo que la consulta vulnerable es similar a la siguiente:
$SQL = " SELECT * FROM alguna_tabla WHERE id='$id' ";
Al inyectar el vector la consulta queda así:
SELECT * FROM alguna_tabla WHERE id='1' AND (SELECT * FROM tabla_objetivo)=1 /*' y la aplicación devuelve el siguiente error: Operand should contain N column(s)
Y voilà, obtenemos un error obviamente esperado. Donde N es el número de columnas en 'tabla_objetivo'.
Así sacamos ventaja del error disclosure con ayuda de una simple inyección.
Conclusión
Con este sencillo y útil vector aceleramos el proceso de recolección de información, resumiéndolo en una sóla consulta. Una vez más, espero que esto les haya sido de utilidad, me da gusto poder compartir este pequeño hallazgo con ustedes.
Contacto: trew.revolution@gmail.com
