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