Cuando se crea un proyecto web en Internet se debe dar prioridad a una programación segura para evitar que el crecimiento de trafico suponga un peligro…
La inyección de código SQL (SQL Injection en ingles) es un método de infiltración de código intruso que se vale de una vulnerabilidad informática (mala programación) en el código fuente de la programación de la web presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos.
La idea esencial es que debemos ser muy previsores a la hora de programar y se deben validar todos los parámetros introducidos por el cliente/hacker tanto por método GET como por POST e incluso las COOKIES que envía el navegador. Es mejor ponerse en el peor de los casos para que luego no tengamos sorpresas.
consulta=”SELECT * FROM usuarios WHERE nombre = ‘”+nombreUsuario+ “‘;”
Si en nombre de usuario ponemos AgenciaLaNave, al ejecutar mysql_query($consulta); se obtendrán todos los campos del usuario cuyo nombre sea “AgenciaLaNave”. Sin embargo si un hacker malintencionado en el campo nombreUsuario pusiera:
AgenciaLaNave’; DROP TABLE usuarios; SELECT * FROM datos WHERE nombre LIKE ‘%
En ese caso veríamos que se ejecutarían varias sentencias incluida la de “DROP TABLE” y se borraría toda la tabla de usuarios. Por supuesto eso no esta previsto por el programador y permitiría al hacer borrarlo todo.
Y la cosa puede ser aún más grave ya que en un simple formulario de usuario y clave, una validación de la clave podría en un código vulnerable mediante SQL inject saltarse sin saber ni la clave:
mysql_query(“SELECT usuario FROM usuarios WHERE usuario=’$login’ and clave=’$pass'”);
Imaginaros que la clave insertada en el formulario en clave es ‘hack’ or ‘1’=’1′ veremos que al ejecutar la sentencia se consigue que se añada la condición “O” y por lo tanto con una cosa siempre cierta permite un acceso con el usuario que uno desee por una mala programación.
En AGENCIA LA NAVE tenemos experiencia diaria con este tipo de ataques y por ello las programaciones las haremos teniendo máxima prioridad por la seguridad de las webs realizadas.
Queda claro que se puede añadir sentencias SQL que no estaban previstas, acceder sin conocer la clave, borrar contenidos de las bases de datos o incluso insertar datos concatenados a otras tablas. ¿Entendéis lo importante de validar los valores de los formularios?
Pues aún puede ser más grave y es que en el MYSQL hay funciones propias que permiten leer ficheros del sistema (ejecutado por el usuario de MYSQL) como el fichero de contraseñas del servidor /etc/passwd añadiendo la sentencia en los parametros:
http://www.site.com/index.php?id=-725+UNION+SELECT+1,load_file(%27etc/passwd%27),3,4,5
Esto devolvería una imagen similar a lo siguiente:
Pero no solo se puede leer contenido de una web mal programada de cualquier archivo del servidor sino que se puede incluso escribir código propio o un PHP que sirva de SHELL para controlar al completo una web haciendo uso de los comandos de MYSQL INTO_OUTFILE() y INTO_DUMPFILE().
Entonces por no verificar los datos el hacker podrá sobreescribir ficheros, leer ficheros para acceder a las bases de datos, e incluso añadir nuevos ficheros que realicen tareas útiles para el hacker para incluir código de malware entre otros temas o incluso para robar datos de las bases de datos (robo de tarjetas de crédito etc).
¿Como podemos evitar que esto ocurra en nuestra web? Hay varios criterios a tener en cuenta para una correcta programación de la web.
- Usar la función mysql_real_escape_string($nombre_usuario) para impedir que pueda contener código interpretable por el SQL.
- Usar la función settype($offset, ‘integer’); para convertir al tipo entero un parametro y así impedir el SQL injection.
- Usar la librería PDO para proteger la ejecución de las sentencias SQL:
$statement = $pdo->prepare(“SELECT * FROM usuarios WHERE nombre = :nombre”);
$statement->bindParam(‘:nombre’, $nombre_usuario);
$statement->execute();
$result = $statement->fetch();
De esta forma los parámetros serán analizados en detalle y no se podrá insertar código.
- Poner entre comillas las variables de los enteros: SELECT user FROM table WHERE iduser= $id es mucho más fácilmente inyectable que
SELECT user FROM table WHERE iduser= ‘ $id ‘ Es una precaución adicional.
- Verifica siempre los datos que introduce el usuario: Se debe comprobar el tipo valido de cada campo pasado por GET o POST o por las COOKIES: is_int(…) si es un entero ; is_long(…) si es un número largo etc.
Los programadores a menudo pueden olvidar todos estos asuntos por lo que es recomendable crear librerías que validen las variables completas recibidas o incluso usar una ya preparada para el manejo de datos como la PEAR DB.
Existen miles de programas empleados por hackers para analizar las vulnerabilidades de los proyectos webs y todos se aprovechan de “programadores sin experiencia” o de “fallos no estudiados por los mismos” por lo que es un tema a tener muy en cuenta a la hora de hacer una web online: Contar con expertos. Consúltenos en AGENCIA LA NAVE sin compromiso.
El buen programador verifica sus propias aplicaciones para comprobar si existen vulnerabilidades: +info PacketStormSecurity (mucho código open source es vulnerable y requiere de actualizarse de forma habitual para evitar ser atacado) | Acunetix (analisis vulnerabilidades) | SQLpowerInjector (analizar si somos vulneables a inyección SQL) | SQLMap | Herramientas empleadas por HACKERS para intentar ataques SQL Injection.