viernes, 22 de agosto de 2008

Inyección SQL - Hackeando páginas web

Las típicas preguntas que nos hacemos:
¿Cómo puedo hackear una página web?
¿Cuál es la manera más fácil de hacerlo?
Soy inexperto en Hacking, ¿podré hacerlo?

Pues bien, la manera más fácil es buscar una vulnerabilidad en el nivel de validación de las entradas a la base de datos, como por ejemplo el área de administración (Login/Password) del sitio.
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: Wikipedia

Con el auge de los sitios/plataformas web desarrollados en PHP y ASP, conforme a eso también se han visto las distintas vulnerabilidades en estos. Ya que el máximo problema que existe es la Inyección SQL.

Pero, ¿Cómo se hace?

Comúnmente los desarrolladores novatos hacen su sistema de validación de usuarios de esta forma:
$usuario=$_POST['usuario'];
$pass=$_POST['pass'];
$sql="SELECT * FROM
usuarios WHERE usuario= '$usuario' AND contrasena='$pass'";

Al ejecutar el mismo, si coincide en la base de datos, entrara ya sea a crear la sesión o actualizar el estado del campo.
Obviamente para entrar debemos conocer el usuario y contraseña correcta, pero nosotros inyectaremos un código malicioso para que nos devuelva un TRUE en la consulta.

Colocaremos lo siguiente, en el formulario de administración:

Usuario: admin
Contraseña: ' or''='

A la hora que se ejecute la sentencia, permitirá a entrar al sitio web! y listo!

Si eres desarrollador, te interesara como evitar todas las vulnerabilidades de inyecciones.

PHP
En php se utiliza la función mysql_real_escape_string, la cual escapa caracteres especiales de una cadena para su uso en una sentencia SQL.
Entonces tu consulta agregando esta función quedaría:
$sql="SELECT * FROM usuarios WHERE usuario=
\"".mysql_real_escape_string($usuario). "\"" AND
contrasena=\"".mysql_real_escape_string($pass). "\""";
ASP
Para asp se utiliza de la siguiente manera:

Dim Usuario, Password, RS, SSQL Usuario = Request.Form("txtUsuario")
Password = Request.Form("txtPassword") SSQL = "SELECT count(*) FROM
Usuarios WHERE Usuario = '" & Usuario & "' AND password='" &
Password & "'" Set RS = Server.CreateObject("ADODB.Recordset")
RS.Open SSQL, "Cadena de conexion" If (RS.EOF)
Then Response.Write "Acceso denegado."
Else Response.Write "Te has identificado como " &
RS("Usuario") End IfSet RS = Nothing
Donde txtUsuario y txtPassword vienen del formulario donde pedimos el Usuario y Contraseña.

6 comentarios:

Reysabogal dijo...

Muy interesante los comentarios al respecto, Muchas gracias.

Anónimo dijo...

< script>alert('Hacked by slwzlwa');

Anónimo dijo...

< script>alert('Hacked by slwzlwa');< script>

Anónimo dijo...

o.O slwzlawa o como sea eres un lamer...

Anónimo dijo...

Ni si quiera terminó bien el cierre de etiqueta... Ni una vez.

Anónimo dijo...

oye, no entiendo como funciona esto lo probe en mi servidor y nunca da true,..