Re: Solucionar todas las Inyecciones en tu web [Programadore
Publicado: 15 Abr 2011, 03:36
Gracias Me Han Hakeado My Web Varias Veces Aver Si Logro Repararla Ahora Con esta Info =)!
Indetectables es una Comunidad de Hacking, Seguridad Informática, Impresión 3d y Desarrollo
./index.php
Por otro lado, ¿Solucionar todas las inyecciones en tu web? Algo más de seriedad Skillmax, tu falta de información me causa...El fallo es sencillisimo:
Code:
SELECT * FROM
El fallo de este codigo es el "*" que por ese pego alguien puede aplastar tu web.
La convierte a entero porque si entra una cadena quedas vulnerable a una inyección sql, osea... Si meten un algo')-- ya con esto quedarías vulnerable a una inyección, jeje pero si la conviertes a entero y luego la tratas como cadena ya no importa si la tratas como cadena porque este entero ya no se vuelve a convertir a una cadena simplemente pasa como número y si la tratas como cadena pues vendría siendo lo mismo jeje :P y si el parametro id tendría que ser una string en vez de un entero tendrías que reemplazar los carácteres especiales de las instrucciones mysql, jeje pero por eso es mucho mejor siempre que tengas una BD, pasar los ID's como enteros, por eso en la mayoría de los sistemas se usa el ID como int(11), key, auto increment fácilita mucho las cosas al momento de buscar un id y trabajar con él.TheSur escribió:¿Para que parseas a entero la entrada si luego en el motor sql la tratas como cadena?. Si el parámetro 'id' fuera un string en vez de un entero, ¿tambien lo parsearias a entero? ..Skillmax escribió:topcat, será algún fallo en la visión, pero donde se utiliza * aquí estamos utilizando:
Este codigo no permite la entradas tipo "noticias?id=123"Código: Seleccionar todo
$id = (int)$_GET['id']; $query = mysql_query( "SELECT * FROM noticias WHERE id = '$id'");
Te equivocas, está inyección para nada a quedado obsoleta y aún la sigo viendo, lo de javascript y php, ya lo sabemos, no es nada nuevo amigo, ahora mi pregunta es, ¿Qué fallos ves?, me interesaria que me lo dijeras, para asin solucionarlo.
Para evitar RFI estamos usando str_replace, asin que lo que tú dices es lo que está puesto, es cuestión de fijarse.
Código: Seleccionar todo
$archivo = str_replace(".","",str_replace("http","",$_GET['archivo'])); if(!file_exists($archivo)) { die("El archivo no existe"); } include("./".$archivo.".php");
Pues va a ser que te equivocaslinkgl escribió:La convierte a entero porque si entra una cadena quedas vulnerable a una inyección sql, osea... Si meten un algo')-- ya con esto quedarías vulnerable a una inyección, jeje pero si la conviertes a entero y luego la tratas como cadena ya no importa si la tratas como cadena porque este entero ya no se vuelve a convertir a una cadena simplemente pasa como número y si la tratas como cadena pues vendría siendo lo mismo jeje :P y si el parametro id tendría que ser una string en vez de un entero tendrías que reemplazar los carácteres especiales de las instrucciones mysql, jeje pero por eso es mucho mejor siempre que tengas una BD, pasar los ID's como enteros, por eso en la mayoría de los sistemas se usa el ID como int(11), key, auto increment fácilita mucho las cosas al momento de buscar un id y trabajar con él.TheSur escribió:¿Para que parseas a entero la entrada si luego en el motor sql la tratas como cadena?. Si el parámetro 'id' fuera un string en vez de un entero, ¿tambien lo parsearias a entero? ..Skillmax escribió:topcat, será algún fallo en la visión, pero donde se utiliza * aquí estamos utilizando:
Este codigo no permite la entradas tipo "noticias?id=123"Código: Seleccionar todo
$id = (int)$_GET['id']; $query = mysql_query( "SELECT * FROM noticias WHERE id = '$id'");
Te equivocas, está inyección para nada a quedado obsoleta y aún la sigo viendo, lo de javascript y php, ya lo sabemos, no es nada nuevo amigo, ahora mi pregunta es, ¿Qué fallos ves?, me interesaria que me lo dijeras, para asin solucionarlo.
Para evitar RFI estamos usando str_replace, asin que lo que tú dices es lo que está puesto, es cuestión de fijarse.
Código: Seleccionar todo
$archivo = str_replace(".","",str_replace("http","",$_GET['archivo'])); if(!file_exists($archivo)) { die("El archivo no existe"); } include("./".$archivo.".php");
x) porqué lo dices?, al convertir todas las entradas a enteros evitas caracteres, por ende evitas inyecciones, aunque la mejor manera de filtrar no es convertir lo que llega a enteros, si no validar que sea un número, pero de ambas formas se puede parchear ese GET, y como te digo si yo pongo url.algo?a=' este ' se me convierte a entero (int) por ende si trato su valor ascii como cadena ya no pasa nada :PTheSur escribió:Pues va a ser que te equivocaslinkgl escribió:La convierte a entero porque si entra una cadena quedas vulnerable a una inyección sql, osea... Si meten un algo')-- ya con esto quedarías vulnerable a una inyección, jeje pero si la conviertes a entero y luego la tratas como cadena ya no importa si la tratas como cadena porque este entero ya no se vuelve a convertir a una cadena simplemente pasa como número y si la tratas como cadena pues vendría siendo lo mismo jeje :P y si el parametro id tendría que ser una string en vez de un entero tendrías que reemplazar los carácteres especiales de las instrucciones mysql, jeje pero por eso es mucho mejor siempre que tengas una BD, pasar los ID's como enteros, por eso en la mayoría de los sistemas se usa el ID como int(11), key, auto increment fácilita mucho las cosas al momento de buscar un id y trabajar con él.TheSur escribió:¿Para que parseas a entero la entrada si luego en el motor sql la tratas como cadena?. Si el parámetro 'id' fuera un string en vez de un entero, ¿tambien lo parsearias a entero? ..Skillmax escribió:topcat, será algún fallo en la visión, pero donde se utiliza * aquí estamos utilizando:
Este codigo no permite la entradas tipo "noticias?id=123"Código: Seleccionar todo
$id = (int)$_GET['id']; $query = mysql_query( "SELECT * FROM noticias WHERE id = '$id'");
Te equivocas, está inyección para nada a quedado obsoleta y aún la sigo viendo, lo de javascript y php, ya lo sabemos, no es nada nuevo amigo, ahora mi pregunta es, ¿Qué fallos ves?, me interesaria que me lo dijeras, para asin solucionarlo.
Para evitar RFI estamos usando str_replace, asin que lo que tú dices es lo que está puesto, es cuestión de fijarse.
Código: Seleccionar todo
$archivo = str_replace(".","",str_replace("http","",$_GET['archivo'])); if(!file_exists($archivo)) { die("El archivo no existe"); } include("./".$archivo.".php");
¿Hablas de oídas o realmente crees que eso se hace así?. Si el campo de la base de datos sobre (el cual se va a utilizar en la clausula WHERE) está declarado como string, dime para que quieres convertir el valor que recibe la aplicación web a entero. Además de que no tiene sentido, a no ser que el campo string que está declarado en la base de datos almacene números. En este caso, sería aun peor, ya que además de no tener claro como realizar un adecuado filtrado de inyecciones SQL, tiene una ausencia casi total de diseño de estructuras en bases de datos.linkgl escribió:x) porqué lo dices?, al convertir todas las entradas a enteros evitas caracteres, por ende evitas inyecciones, aunque la mejor manera de filtrar no es convertir lo que llega a enteros, si no validar que sea un número, pero de ambas formas se puede parchear ese GET, y como te digo si yo pongo url.algo?a=' este ' se me convierte a entero (int) por ende si trato su valor ascii como cadena ya no pasa nada :PTheSur escribió:Pues va a ser que te equivocaslinkgl escribió:La convierte a entero porque si entra una cadena quedas vulnerable a una inyección sql, osea... Si meten un algo')-- ya con esto quedarías vulnerable a una inyección, jeje pero si la conviertes a entero y luego la tratas como cadena ya no importa si la tratas como cadena porque este entero ya no se vuelve a convertir a una cadena simplemente pasa como número y si la tratas como cadena pues vendría siendo lo mismo jeje :P y si el parametro id tendría que ser una string en vez de un entero tendrías que reemplazar los carácteres especiales de las instrucciones mysql, jeje pero por eso es mucho mejor siempre que tengas una BD, pasar los ID's como enteros, por eso en la mayoría de los sistemas se usa el ID como int(11), key, auto increment fácilita mucho las cosas al momento de buscar un id y trabajar con él.TheSur escribió:¿Para que parseas a entero la entrada si luego en el motor sql la tratas como cadena?. Si el parámetro 'id' fuera un string en vez de un entero, ¿tambien lo parsearias a entero? ..Skillmax escribió:topcat, será algún fallo en la visión, pero donde se utiliza * aquí estamos utilizando:
Este codigo no permite la entradas tipo "noticias?id=123"Código: Seleccionar todo
$id = (int)$_GET['id']; $query = mysql_query( "SELECT * FROM noticias WHERE id = '$id'");
Te equivocas, está inyección para nada a quedado obsoleta y aún la sigo viendo, lo de javascript y php, ya lo sabemos, no es nada nuevo amigo, ahora mi pregunta es, ¿Qué fallos ves?, me interesaria que me lo dijeras, para asin solucionarlo.
Para evitar RFI estamos usando str_replace, asin que lo que tú dices es lo que está puesto, es cuestión de fijarse.
Código: Seleccionar todo
$archivo = str_replace(".","",str_replace("http","",$_GET['archivo'])); if(!file_exists($archivo)) { die("El archivo no existe"); } include("./".$archivo.".php");
Por GET, POST o cualquier tipo de entrada de datos, ¿no?linkgl escribió:Ya va, pues resulta que estas mal, parece que no te tomas la libertad de leer la respuesta entera... Mira si necesitas obtener un ID de determinado campo en la base de datos, y si no filtras lo que se pase por GET vas a ser vulnerable
¿Y si el tipo de dato está declarado como string y no almacena números?, puede almacenar palabras (Ejpl: Nombres). ¿También los parseas a numéricos?. Me gustaría saber que valor tiene el string linkgl al parsearlo a integer... Debe ser como sentirse apuntando a un puntero a null.linkgl escribió:si tienes declarada como string el campo en la base de datos (varchar, longtext o como quiera que tengas declarado el tipo de datos de ese campo) si los ID's que tienes son N-M-E-R-I-C-O-S Le tienes que hacer un (int) a lo que se pase por get y despues tratarlo como el tipo de datos que tienes declarado en la BD
Poca credibilidad me da alguien como skillmax que dice que 'SELECT * FROM' es una sentencia SQL vulnerable. Muestra un desconocimiento total de base. Ni siquiera sabe formar una consulta SQL correcta.linkgl escribió:si skillmax esta haciendolo de esa forma por ende debemos deducir que lo que quiere obtener es un ID NUMERICO que está almacenado en un campo tipo varchar o similar
Te vuelvo a responder. El artista que diseña una base de datos así no tiene mucha idea de lo que hace. Además, es una tarea que no debería depender del programador sino de un analista.linkgl escribió:no sabes CUAL es la necesidad de todo programador yo puedo necesitar meter enteros y cadenas en un campo y para esto puedo hacer un campo tipo varchar
No soy yo quién presupone eso. Es Skillmax (y parece que tu también), que es quien dice que para evitar 'todas las inyecciones web' basta con, en inyecciones SQL, utilizar este filtrado:linkgl escribió:Pero bueno lo que tu estas haciendo es presumir que el campo esta definido como tipo string y que dentro de ese campo SOLO hay cadenas de textos y no numeros que necesitan tratarse como cadenas de texto
Código: Seleccionar todo
$id = (int)$_GET['id'];
$query = mysql_query( "SELECT * FROM noticias WHERE id = '$id'");
Sí, está claro esoPor GET, POST o cualquier tipo de entrada de datos, ¿no?
Es lo que yo te he mencionado arriba, indistintamente de como esté definido el campo en la BD, he hecho mucho énfasis en que el filtrado SÓLO sirve para filtrar números, por eso lo separe por guioncitos (-), y da igual el trato que se le de después de filtrar, si alguien quien sea necesita meter el numero como string a una bd por X necesidad, entonces es una forma válida de filtrarlo, y te lo dije arriba, en dos respuestas, si necesitas filtrar una string necesitas filtrar caracteres especiales¿Y si el tipo de dato está declarado como string y no almacena números?, puede almacenar palabras (Ejpl: Nombres). ¿También los parseas a numéricos?. Me gustaría saber que valor tiene el string linkgl al parsearlo a integer... Debe ser como sentirse apuntando a un puntero a null.
Yo no sé, no soy nadie para críticar a skillmax eso ya es cosa de ustedes, yo te estoy debatiendo algo que creo correcto, que el pedazo de código que propone skillmax es válido para filtrar números en una BD, independientemente del trato que se haga con ellos despuésPoca credibilidad me da alguien como skillmax que dice que 'SELECT * FROM' es una sentencia SQL vulnerable. Muestra un desconocimiento total de base. Ni siquiera sabe formar una consulta SQL correcta.
De acuerdo, pero aveces en un proyecto es necesario hacer cosas poco "comunes" para que funcione, y bueno no todos trabajamos con analistas y diseñadores, aveces uno se las tiene que liar solo.Te vuelvo a responder. El artista que diseña una base de datos así no tiene mucha idea de lo que hace. Además, es una tarea que no debería depender del programador sino de un analista.
Yo lo único que te estoy debatiendo es que esa forma filtra las inyecciones si tu id es numérico funciona, y que el trato que se le da despues en la BD, es irrelevante, puesto que eso lo decide el programador no nosotros, son muchas variables como para poder decir, necesitas un campo tipo varchar(55),primary_key, etc... Total si x persona quiere meter un entero en un campo varchar pero quiere filtrar lo que entre ahí pues la mejor forma es pasarlo a entero, no me voy a molestar quitando caracteres especiales si solo habrá enteros ahí.No soy yo quién presupone eso. Es Skillmax (y parece que tu también), que es quien dice que para evitar 'todas las inyecciones web' basta con, en inyecciones SQL, utilizar este filtrado:Código: Seleccionar todo
$id = (int)$_GET['id']; $query = mysql_query( "SELECT * FROM noticias WHERE id = '$id'");