¿Qué es?
La inyección de código es una vulnerabilidad que se puede explotar en todas aquellas aplicaciones que trabajen con una base de datos. Esta consiste en la modificación por parte de un usuario de las consultas que se realizan a la base de datos. Por lo general tiene origen en el incorrecto filtrado de los campos a los que tiene acceso el usuario de cara a introducir datos en la BD (base de datos). Una de las particularidades de este tipo de error es que se puede producir en cualquier lenguaje tanto de programación como de script.
Este tipo de vulnerabilidad puede provocar varias consecuencias como por ejemplo la validación correcta de usuarios que no están en nuestro sistema, el acceso por parte de un usuario a datos a los que no se debería tener acceso o problemas del tipo de manipulación y borrado de la BD.
Algunos ejemplos
Para los ejemplos me voy a basar en PHP, pero la mayoría de cosas aquí comentadas se hacen extensibles a otros lenguajes.
Ejemplo 1:
Supongamos que hemos implementado en una web un sistema de identificación de usuarios, nuestra sentencia para crear la consulta sería algo así:
sql_sentencia = "select pass from Usuario where usuario = '" . $login_user . "';";
Donde login_user es una variable que tiene un valor proveniente de un formulario de identificación. Pongamos que el usuario que se a identificado es “Pedro”, lo cual haría que la sentencia SQL finalmente terminará así:
select pass from Usuario where usuario = 'Pedro';
Hasta aquí todo sería completamente normal. Pero si el usuario no tiene buenas intenciones en vez de introducir “Pedro” como usuario podría introducir lo siguiente:
Pedro'; drop table Usuario;
Esto daría lugar a lo siguiente:
select pass from Usuario where usuario = 'Pedro';
drop table Usuario;
El SQL se ejecutaría en orden. La primera sentencia tendría el funcionamiento esperado, pero la segunda nos borraría la tabla “Usuario” de nuestra BD con lo que ya tendríamos nuestro primer desastre.
Ejemplo 2:
Supongamos el mismo caso de implementación de un sistema de identificación, pero esta vez con el siguiente código:
sql_sentencia = "select id from Usuario where nombre = '" . $login_nombre . "' and pass = '" . $pass . "';";
Y para la identificación nos basamos en si la consulta devuelve o no valor. Lo normal sería que el usuario hubiera ingresado su login y su contraseña y que hiciéramos la comprobación, si la select devuelve algún valor lo identificaríamos y si el resultado de la consulta esta vacío no lo haríamos. Ahora bien un usuario avispado podría hacer lo siguiente:
Usuario: Pepe (usuario que sabe que existe porque ha visto antes)
Password: ' or 'a'='a'
El valor de “algo” or “true” como todos sabréis es “true” con lo cual conseguiría identificarse en nuestro sistema.
¿Como solucionarlo?
Para evitar problemas de seguridad con este tipo de ataques la única solución es una buena programación por parte la persona que implemente la aplicación. Para ello el programador debe tener en cuanta esta posibilidad y tratar de evitar que se de una situación adecuada para la inyección de código. En la mayoría de lenguajes de programación utilizados en Web existen formas faciles de evitarlo y poco a poco cambien en los lenguajes de escritorio, aun así si no existe en el lenguaje una forma especifica, siempre lo podemos implementar nosotros a mano.
En PHP por ejemplo para mysql existe la función “mysql_real_escape_string” que se encarga de escapar todos lo caracteres extraños de un parámetro introducido. Para el ejemplo uno, la creación de la sentencia quedaría algo así:
sql_sentencia = "select pass from Usuario where usuario = '" . mysql_real_escape_string($login_user) . "';";
Espero que esto os sirva para a partir de ahora mejorar la seguridad de todo lo que programéis. Si alguien tiene algo que aportar o quiere ampliar la información o corregir algo, animaros y dejad vuestros comentarios.
[…] esta, ya hemos hablado anteriormente en el blog. Consiste en inyectar valores, parámetros o instrucciones para alterar el […]
LikeLike