IIS y el método Server.Execute
La versión 5 del servidor web de Microsoft® «Internet Information Services» (IIS) apareció el 17 de Febrero de 2000 cuando fue lanzado al mercado Windows™ 2000. Incluía numerosas mejoras sobre la versión anterior, una cantidad increíble de nuevos «bugs» y dos nuevos «métodos» que están facilitando el trabajo a multitud de programadores, pero que les pueden dar mas de un quebradero de cabeza.
Los nuevos métodos son parte de el objeto ASP Server: Execute y Transfer. Estos dos nuevos métodos permiten la ejecución de una página web en el propio servidor o la transferencia de una página web a otra manteniendo el estado de los objetos entre páginas.
El propio software que controla mi página web y que ha sido programado por mi, hace uso extensivo del metodo Server.Execute debido a su similitud con los «Server Side Includes». La principal diferencia es la posibilidad de usar variables cuando se usa Server.Execute para espeficar el archivo a ejecutar, opción no disponible cuando se usa un «Server Side Include».
En los últimos meses he podido comprobar que multitud de sitios web estan haciendo uso de este nuevo método de forma incorrecta, lo que puede conducir a comprometer la seguridad del servidor. Es facil detectar los sitios que hacen uso de este método gracias a las URLs, muchos de ellas son como la que sigue:
http://servidor/inicio.asp?file=/asp/home.asp
El problema por el que se ven afectados es la posibilidad de escalar directorios usando URLs modificadas como:
http://servidor/inicio.asp?file=../../WINNT/win.ini
Esto nos permite acceder con permisos de lectura a muchos de los archivos del servidor.
Un segundo problema es una posible denegación de servicio si se solicita el mismo archivo que hace la llamada al Server.Execute:
http://servidor/inicio.asp?file=inicio.asp
Esto provocaría que el script ASP entrara en un bucle infinito que le llevaría a usar el 100% de la CPU y grandes cantidades de memoria mientras el script no hiciera «time out», generalmente a los 90 segundos de haberse iniciado la petición.
Las posibles soluciones pasan por verificar que el archivo que se pasa al método Execute no contienen cadenas como «../» o desabilitar las «rutas padre» en la configuración del propio servidor IIS.
Este artículo fue publicado en HispaSec el 17 de Abril de 2002 con el título Lectura de archivos a través de páginas ASP y el método «Execute»