jueves, 13 de noviembre de 2014

By Design(4)



By Design (4)

Una página de descargas

En cierta medida, los problemas presentados en los puntos anteriores parten de un enfoque que, mirado desde un punto de vista teórico y alejado de los criterios de seguridad de la información, podria parecer correcto: crear herramientas genéricas que resulevan todo tipo de problemas simplifica enormemente las tareas de desarrollo y permite utilizarlas posteriormente como bloques con los que construir soluciones específicas.

¿No es eso, precisamente, lo que tanto nos gusta a muchos de Linux?

El problema es que no tuvo en cuenta la fuerza de los condicionantes prácticos. Las diferencias entre un programa para uso propio y otro accesible libremente a través de Internet. Las consecuencias de una vulnerabilidad o de un descuido.

Y, por supuesto, tampoco es algo que vaya ligado exclusivamente a las consultas a bases de datos o la visualización de contenidos. Mientras buscaba otras cosas, me encontré con una página en Github donde aparece un ejemplo de código PHP para forzar al navegador a descargar un documento:

https://gist.githubusercontent.com/nikhilben/602332/raw/2a1aa15de7211e9bf3345efa59a63bc8e320f242/.php

Y su contenido es:

<?php

// place this code inside a php file and call it f.e. "download.php"
$path = $_SERVER['DOCUMENT_ROOT']."/path2file/"; // change the path to fit your websites document structure
$fullPath = $path.$_GET['download_file'];

if ($fd = fopen ($fullPath, "r")) {
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);
    switch ($ext) {
        case "pdf":
        header("Content-type: application/pdf");
        header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
        break;
        default; // Other document formats (doc, docx, odt, ods etc)
        header('Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
        header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    }
    header("Content-length: $fsize");
    header("Cache-control: private"); //use this to open files directly
    while(!feof($fd)) {
        $buffer = fread($fd, 2048);
        echo $buffer;
    }
}
fclose ($fd);
exit;
// example: place this kind of link into the document where the file download is offered:
// <a href="download.php?download_file=some_file.pdf">Download here</a>
?>


Cuando estudiamos Informática nos enseñan que reutilizar código es bueno. Y código para reutilizar tenemos aquí. Una rápida consulta nos permite demuestra que no faltan quienes hicieron caso de este consejo. 



Lo malo es que este script PHP parte de otra precepto incorrecto. Está hecho para hacer un trabajo: descargar documentos. Y lo hace tan bien que es capaz de descargarse a sí mismo mediante URLs del tipo:

http://www.example.com/download.php?download_file=download.php

... o, si los documentos a descargar en condiciones normales se ubicaran en un subdirectorio de la raíz del sitio web:

http://www.example.com/download.php?download_file=../download.php

... o cosas similares.

Y lo peor no es que pueda auto-descargarse. Por lo general, y por fortuna, opciones como “open_basedir” de PHP (http://php.net/manual/en/ini.core.php#ini.open-basedir) y similares permiten configurar los servidores de modo que los scripts sólo puedan acceder a ficheros ubicados en ciertos subárboles de directorio. Eso impide que puedan leer, y proporcionar, archivos con información sensible como el “/etc/password” y similares.

Pero la información sensible también puede estar encerrada en los propios scripts. Credenciales con los que la aplicación se conecta a la base de datos, direcciones IP y puertos de los correspondientes servidores, rutas de archivos, etc. están detrás de las páginas web que vemos en nuestros navegadores. Y gracias a los buscadores, tampoco es demasiado difícil obtener las direcciones de los scripts de un servidor:


 Y una vez se saben sus nombres y/o rutas, este “download.php” permite extraer su código fuente:
http://www.example.com/download.php?download_file=configuration.php

Claro que habrá quien diga que eso no es una vulnerabilidad, sino una característica



No hay comentarios:

Publicar un comentario