NovaMonoFix
Errores PHP
X
Usuario
Password
0 FPS

Inyección SQL

26 de Febrero del 2011 por Josep Antoni Bover, 20 visitas, 0 comentarios, 0 votos
Categorías : HTML, Programación, PHP, SQL.
La web está en segundo plano, animación en pausa.
Cargando animación...
Inyección SQL

A pesar de que esta vulnerabilidad es de sobras conocida por la comunidad de programadores, y de que hace bastantes años que existe, recientemente me he encontrado algunos sitios webs que tienen dicha vulnerabilidad en la actualidad, cosa que no me entra en la cabeza.

La inyección sql es una técnica que permite a un atacante insertar código sql en una consulta, el cual en la mayoría de veces puede resultar fatal para la integridad y privacidad de la base de datos atacada.

Esta técnica consiste en manipular un campo requerido por el usuario para modificar una sentencia SQL, por ejemplo vamos a imaginar que tenemos una base de datos en la cual tenemos una tabla usuarios donde tenemos los nombres de usuario de nuestra web.

Algo muy típico seria tener una sentencia SQL de este tipo :

Consulta tipica
1
$Consulta = "SELECT * FROM usuarios WHERE nombre=\'".$_POST["NombreUsuario"]."\'";

Para introducir el nombre de usuario se usaría un formulario con un INPUT TEXT que mandaría sus datos mediante un POST.

En este caso el atacante lo tiene bastante fácil para intuir como estaría construida la sentencia SQL por lo que podría intentar inyectar código en ella.

Lo primero que se podría intentar es poner en el campo nombre algo por este estilo : ' or '1'='1

Haciendo esto, la consulta SQL quedaría así :

Consulta hackeada
1
$Consulta = "SELECT * FROM usuarios WHERE nombre=\'\' or \'1\'=\'1\'"

Fijaros que como nombre de usuario no se introduce nada aunque podría ser cualquier cosa, y la verdad es que no importa porque lo realmente importante es lo siguiente or '1'='1. Introduciendo un or en la sentencia estamos diciéndole que si el usuario es '' o uno es igual a uno devuelva true. Esto permitiría al atacante acceder a los datos relacionados con los usuarios o cosas peores.

Por ejemplo el atacante podría decidir que quiere borrar nuestra tabla de usuarios, lo cual le resultaría muy fácil introduciendo en el nombre el siguiente fragmento '; DROP TABLE usuarios por lo que la sentencia quedaría así :

Consulta hackeada
1
$Consulta = "SELECT * FROM usuarios WHERE nombre=\'\'; DROP TABLE usuarios\'"

Viendo esto espero que ya comprendáis un poco mejor de que va el asunto, pero como podemos evitar que se inyecte código en un INPUTBOX?, pues es muy fácil, en php existe la función mysql_real_escape_string la cual inserta antibarras '\' delante de las comillas y dobles comillas entre otros caracteres peligrosos para que no sean tomados en cuenta por la consulta, y solo sean usados dentro de las variables a buscar.

Consulta hackeada
1
2
3
4
// Consulta en la que nos pueden inyectar codigo SQL.
$Consulta = "SELECT * FROM usuarios WHERE nombre=\'".$_POST["NombreUsuario"]."\'";
// Consulta SEGURA.
$Consulta = "SELECT * FROM usuarios WHERE nombre=\'".mysql_real_escape_string($_POST["NombreUsuario"])."\'";

Otra cosa muy importante es que algunos programadores por comodidad al tener un error en una sentencia SQL incluyen dicha sentencia en el mensaje de error, y eso es un grave error. Cuanta menos información demos a los atacantes mejor, ya que ellos normalmente no deberían saber los nombres de nuestras tablas ni otros datos que puedan revelar nuestras sentencias SQL.

Enlaces recomendados :