Román Cortés

Inyecciones de código

19 de Octubre del 2008

Uno de los problemas de seguridad más frecuentes con los que se enfrentan las webs y sus desarrolladores son las inyecciones de código. Las inyecciones pueden ocurrir siempre que un lenguaje de programación intermedio (por ejemplo, PHP) procesa datos recibidos por el usuario para generar código en otro lenguaje (por ejemplo, SQL o HTML).

El código malicioso que causa la inyección se encuentra en los datos enviados por el usuario, es por ello que:

- Hay que desconfiar siempre de *todos* los datos recibidos. Se pueden recibir datos de muy diversas formas; vía post, get, cookies, url… Ningún dato externo es un dato fiable.
- Es necesario validar todos los datos recibidos con los que nuestro código vaya a interactuar.

EJEMPLO CLÁSICO DE INYECCIÓN
(en PHP y MySQL)

Para una web con un formulario de login para usuarios, tenemos dos campos: usuario y password. Nuestro código en PHP recibe ambos datos vía post y trata de comprueba si el usuario existe en la base de datos de la siguiente forma:

$usuario=$_POST[’usuario’];
$password=$_POST[’password’];
$sql=”SELECT * FROM usuarios WHERE usuario=’$usuario’ AND password=’$password’”;
$result=mysql_query($sql);

En principio este código parece correcto, pero podría dar lugar a una inyección. Por ejemplo, el usuario introduce en el campo usuario a y en el campo password a’ OR ‘1=1. Como resultado, la consulta $sql sería:

SELECT * FROM usuarios WHERE usuario=’a’ AND password=’a’ OR ‘1=1′

Dado que [expresión] OR ‘1=1′ siempre devuelve verdadero, nuestro sistema aceptaría el login con el primer usuario que devolviese la base de datos. Y eso no es todo; en MySQL, sólo se puede ejecutar una línea de sql en cada mysql_query(), pero en otras bases de datos es posible ejecutar varias separadas por comas, lo que podría dar lugar a inyecciones que, usando el punto y coma, creasen nuevas sentencias para eliminar una tabla, por ejemplo.

TIPOS DE INYECCIONES

El problema de las inyecciones no se limita al SQL; existen numerosos tipos de inyecciones de código, entre ellas de SQL, HTML/Javascript/Embed, Email… además de cierto tipo de inyecciones que no son de código pero pueden afectar, por ejemplo, al sistema de archivos. Detallaré los más frecuentes en los siguientes artículos.

En el próximo post sobre seguridad ampliaré las inyecciones SQL. Creo que es importante que lo haga de forma extensa, dado que recientemente han aparecido nuevos riesgos y aún no están lo suficientemente documentados (Wikipedia por ejemplo aún no los contempla).

-

Por si os gustó la ilustración de la jeringuilla y queréis reutilizarla para cualquier fin, os la dejo en .png.

4 Comentarios RSS

Comentar