2010-03-18 9 views
5

Me pregunto si habría alguna falla de seguridad en este enfoque. Estoy escribiendo un fragmento de código que permite a los usuarios subir archivos y otro conjunto para descargar esos archivos. Estos archivos pueden ser cualquier cosa.Fallo de seguridad en este enfoque de código

  1. El usuario carga el archivo (cualquier archivo que incluya archivos .php), se renombra a un hash md5 (extensión eliminada) y se almacena en el servidor. Se realiza una entrada mySQL correspondiente.
  2. El usuario que intenta descargar el archivo usa, por ejemplo, download.php para descargar el archivo donde se envía el archivo md5 (con el nombre original).

¿Hay alguna forma en que cualquiera pueda explotar el escenario anterior?

+0

¿Está interesado en la seguridad de su servidor? ¿O del cliente? O (preferiblemente) ambos? Si permite la descarga/descarga de ejecutables, no hay mucho que pueda hacer (vale, tal vez un escáner de virus). Pero, ¿qué pasa con, por ejemplo, ¿guiones? – VolkerK

+1

Me preocupa que alguien cargue un script .php y mi servidor se verá comprometido. No me importa si el cliente descarga realmente un virus :) –

+1

Solo asegúrese de que el script download.php inicie una descarga directa. Es decir, la forma en que el navegador lo verá debería ser que los _contents de download.php_ son exactamente los del archivo que se está descargando. Si haces eso, combinado con tu explicación como se describió anteriormente, siempre y cuando no cometas ningún error realmente estúpido, estarás bien. – Cam

Respuesta

3

Bueno, en teoría no. No debería haber forma de explotar ese sistema. Sin embargo, hay varias cosas que me gustaría señalarte que quizás no hayas pensado.

En primer lugar, dado que los archivos se descargan a través de un archivo PHP (asumiendo readfile() con encabezados apropiados), debe colocar los archivos en un lugar inaccesible para los usuarios. En los servidores apache, generalmente el enfoque más fácil es simplemente colocar un archivo .htaccess en el directorio de carga con "deny from all" en él para evitar el acceso externo. Si los usuarios no tienen acceso a los archivos externamente en primer lugar, no hay realmente ninguna preocupación acerca de las extensiones de archivos que causan problemas (aunque cambiar el nombre para propósitos de almacenamiento sigue siendo una buena idea)

En segundo lugar, nombrar el los archivos por hash pueden no ser una idea tan brillante, ya que es posible que se produzcan colisiones con el tiempo. ¿Qué sucede si dos archivos tienen el mismo hash? Sin mencionar, el cálculo del hash es un poco lento, especialmente para archivos más grandes (si se calcula a partir del contenido del archivo, y no el nombre). Como almacenas una entrada en la base de datos, supongo que tienes algún tipo de clave primaria allí (como un campo auto_increment). Yo recomendaría simplemente usar ese número de identificación como el nombre de archivo para el almacenamiento para evitar colisiones (en caso de que no lo sepa, puede obtener el ID generado por la última inserción a través del mysql_last_insert_id())

Por supuesto, siempre puede haber problemas con archivos que contienen virus, que pueden infectar la máquina descargando los archivos, pero eso está realmente fuera del alcance de esta pregunta y no afecta al servidor de ninguna manera.

+0

Estoy procesando el nombre del archivo por lo que no importará si el tamaño del archivo es grande o pequeño. Sí, puede haber colisiones, pero hash los nombres de archivo me evita guardar una entrada en una tabla. –

+1

Tenga en cuenta que si está mezclando el nombre del archivo, se sobrescribirán dos archivos que tengan el mismo nombre de archivo. Si esto es un problema o no depende de lo que estás tratando de hacer. Sólo algo para tener en cuenta. – Rithiur

+0

Considere agregar 'datetime' al nombre de archivo antes del hashing, lo que debería reducir significativamente sus posibilidades de sobrescribir los archivos existentes. –

1

Si pueden include/require archivos locales a causa de un agujero separado y el hash es predecible, entonces sí.

Así que, básicamente, no. :-)

+0

+1, sugiero agregar algo al azar o una sal al hash. –

1

Mientras nadie ejecute esos archivos en el servidor, parece bastante seguro.

+0

¿Los servidores permiten que los archivos se ejecuten sin extensiones? Digamos que tengo un archivo php sin la extensión .php, ¿habrá algún servidor que pueda ejecutar esto? –

+0

"cualquier servidor" ... así que, solo un ejemplo ¿qué tan descabellado puede ser sería suficiente? Luego eche un vistazo a http://httpd.apache.org/docs/2.2/mod/mod_mime_magic.html ;-) – VolkerK

+0

¿Por qué hacen tales modificaciones? :( –

0

Si es una extensión diferente que no se hace ejecutable por defecto y tiene un hash aleatorio, garantizado que no será explotable. Solo asegúrate de no asignar PHP a la extensión.

+1

Además, coloque los archivos en un directorio al que no se puede acceder desde la web (así que tienen que ir a través de download.php) y/o configure el indicador NoExec en la configuración del servidor en ese directorio también. – Paolo

+1

De acuerdo. En HTAcess, esto puede ayudar: RemoveHandler cgi-script .myextension – JonnyLitt

0

Le sugiero que cambie el nombre de las extensiones de archivo a una no ejecutable para que, incluso si hay una laguna en la seguridad y alguien puede acceder al archivo, no puedan ejecutarlo. Aparte de eso, no veo ninguna forma de que alguien pueda poner en peligro la seguridad.

+0

Él ya dijo que eliminaría la extensión. – janmoesen

1

Para que la descarga funcione como se espera, probablemente necesite almacenar el tipo mime y generar un nombre de archivo con una extensión adecuada en el encabezado Content-Disposition.Lo que también significa que estas descargas deben estar mediadas por PHP (por lo que no puede colocarlas fuera de open_base_dir).

Debe revisar su código para ver si hay alguna forma de que se incluyan los archivos cargados.

C.