Foros del Web » Programando para Internet » PHP »

Ceguridad con PUT y ficheros PHP

Estas en el tema de Ceguridad con PUT y ficheros PHP en el foro de PHP en Foros del Web. Hola a todos. Tengo un problema de seguridad en un blog que he diseñado y que se hospeda en mi ordendor con Debian y Apache: ...
  #1 (permalink)  
Antiguo 24/05/2005, 08:53
 
Fecha de Ingreso: mayo-2005
Mensajes: 9
Antigüedad: 18 años, 11 meses
Puntos: 0
Sonrisa Ceguridad con PUT y ficheros PHP

Hola a todos. Tengo un problema de seguridad en un blog que he diseñado y que se hospeda en mi ordendor con Debian y Apache:

Resulta que permito la opción de subir archivos mediante PUT (sólo a usuarios autorizados con un clave, por supuesto). Los ficheros subidos se guardan en una carpeta accesible para su posterior descarga por quien esté interesado.

He pensado que si alguien subiese un archivo PHP malicioso (es decir, que ejecutase comandaos del sistema para borrar algo o liarla) entonces ese fichero PHP se quedaría en la carpeta de Descargas y al acceder a su URL mi Apache ejecutaría dicho código PHP que podría causar problemas.

Estoy pensando en cómo solucionarlo:

El usuario www-data (el que ejecuta PHP) por supuesto tiene permisos de escritura en la carpeta de Descargas, por lo que si alguien sube y ejecuta un código PHP que trate de hacer "ulink" a los ficheros almacenados en dicha carpeta lo podría hacer sin problemas y borrarlos. Y aunque esto fuese todo el riesgo posible ya es suficiente como para querer evitarlo.

He pensado como solución mirar el mime-type del fichero subido por PUT, y si es PHP desecharlo, pero claro, son muchas las extensiones posibles, y no sé si cambiando la extensión podrían engañarme y luego Apache ejecutar dicho código como si fuera PHP (esto creo que no es posible, pero no me ofrece mucha confianza esta solución).

¿Sabéis cómo debería solucionar esta vulnerabilidad?


Por otra parte, me gustaría saber cómo hacen muchas páginas para permitir descargas de ficheros sólo con autorización, es decir, ¿dónde guardan esos ficheros de tal forma que no se puede acceder vía web? ¿Cómo accede entonces PHP a ellos para ofrecerlos en descarga? De esto último he buscado información pero no encuentro. ¿Alguna idea para saber por dónde empezar a buscar y aprender?


Muchas gracias a todos.
  #2 (permalink)  
Antiguo 24/05/2005, 09:00
 
Fecha de Ingreso: mayo-2005
Mensajes: 9
Antigüedad: 18 años, 11 meses
Puntos: 0
Vaya, evidentemente quería decir "Seguridad" y no "Ceguridad". Perdón.
  #3 (permalink)  
Antiguo 24/05/2005, 09:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
He pensado como solución mirar el mime-type del fichero subido por PUT, y si es PHP desecharlo, pero claro, son muchas las extensiones posibles, y no sé si cambiando la extensión podrían engañarme y luego Apache ejecutar dicho código como si fuera PHP (esto creo que no es posible, pero no me ofrece mucha confianza esta solución).
Justamente .. el formato MIME de un archivo no se obtiene de la extensión del mismo sino de las cabeceras del archivo en sí .. Por eso es más seguro ver el formato MIME de un archivo que no verlo por la extensión del archivo.

Cita:
Por otra parte, me gustaría saber cómo hacen muchas páginas para permitir descargas de ficheros sólo con autorización, es decir, ¿dónde guardan esos ficheros de tal forma que no se puede acceder vía web? ¿Cómo accede entonces PHP a ellos para ofrecerlos en descarga? De esto último he buscado información pero no encuentro. ¿Alguna idea para saber por dónde empezar a buscar y aprender?
Coloca tus archivos fuera del alcance de tu "DocumentRoot" (de Apache), de esta forma tus archivos no quedaran disponibles para llamarlos por un: http://www.tusitio.tal/archivo.tal .. Vía PHP crea scripts que accedan a tus archivos para entregarlos al buffer de salida (para su descarga) .. Esto lo puedes implementar con:

header() (componiendo las cabeceras HTTP adecuadas para forzar la descarga)
y
readfile() (para leer tu archivo desde la ruta absoluta que esté el archivo hacia el buffer de salida de PHP)

Ejemplos tienes en la documentación oficial de PHP y en las FAQ de este foro ..

Un saludo,
  #4 (permalink)  
Antiguo 24/05/2005, 11:23
 
Fecha de Ingreso: mayo-2005
Mensajes: 9
Antigüedad: 18 años, 11 meses
Puntos: 0
De acuerdo

Me ha quedado muy claro lo que me dices, además en base a eso he buscado ejemplos en PHP y he encontrado lo que buscaba.

Muchas gracias.
  #5 (permalink)  
Antiguo 24/05/2005, 11:56
 
Fecha de Ingreso: mayo-2005
Mensajes: 9
Antigüedad: 18 años, 11 meses
Puntos: 0
Vaya, pues hay algo que no funciona bien. He probado a subir un fichero PHP, pero no lo reconoce como:

application/x-httpd-php phtml pht php
application/x-httpd-php-source phps
application/x-httpd-php3 php3
application/x-httpd-php3-preprocessed php3p
application/x-httpd-php4 php4

Si no que si hago:
file fichero.php
me dice:
fichero.php: ISO-8859 text, with very long lines

Es decir, lo reconoce como texto (exactamente igual que si es un txt).

Bueno, me queda entonces claro que lo mejor y más seguro es forzar la descarga de esos archivos tal como me has explicado.

Muchas gracias.
  #6 (permalink)  
Antiguo 24/05/2005, 14:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mm es qué un script PHP en sí no es más que un archivo de texto plano .. Recuerda que PHP es "interpretado" .. lo mismo sucederá hasta con un script en Perl por ejemplo ..

El formato MIME sólo mira y hace real su distinción cuando son ejecutables, imagenes, etc (en general archivos binarios) todo lo demás es "texto plano".

Debes crear scripts para forzar su descarga .. tener cuidad en NO hacer cosas como:

incluir.php
<?
include($_GET['archivo']);
?>

por qué si te hacen:
incluir.php?archivo=script_malicioso.php

se ejecutará ..

O un fopen() y lo muestras en pantalla .. así podrán ver el código de tus própios scripts.

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:29.