2009-03-27 6 views
6

mi problema es evitar que los usuarios carguen algún archivo malicioso en mi servidor web. Im trabajando en entorno Linux (debian).¿Cómo puedo evitar que cada archivo malicioso se cargue en mi servidor? (verifique el tipo de archivo)?

En realidad los archivos se manejan a través de php por este código:

function checkFile($nomeFile, $myExt = false){ 
if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; } 
$punto = strrpos($nomeFile, '.'); 
$ext = "_".substr($nomeFile, $punto, 8)."_"; 
if(stristr($goodExt, $ext)){ return 1; }else{ return 0; } 
} 

aquí puedo especificar las extensiones permitidas para ser cargado, y si el archivo dont recibirlos i eliminar tan pronto como se complete la carga. Pero de esta manera deja que el usuario pueda cambiar la extensión de archivo con un simple cambio de nombre ... y eso es malo para mí; incluso si un file.exe (por ejemplo) nunca se ejecutará si se renombra en file.jpg (¿estoy en lo cierto?), no quiero tener posibles archivos de peligro en mi servidor.

Hay una manera, en php, python, o whatelse ¿puede un sistema unix ejecutar fácilmente, para comprobar el verdadero tipo de un archivo?

he probado el módulo de tipos MIME pitón, pero recuperar el ipotetical de tipo mime del archivo .. basado en la extensión -.-

Respuesta

7

que vas a necesitar para validar que el archivo subido es en realidad el tipo que la extensión indica que es. Puede hacerlo a través de varios métodos, probablemente el más fácil sea a través del comando file. No sé si tiene una API. Puedes probarlo tú mismo en el caparazón. Para su ejemplo de file.exe que se renombró a file.jpg antes de ser cargado, ejecute file file.jpg e imprimirá algo que le dirá que es un ejecutable. Sin embargo, puede ser engañado.

Supongo que no sabe mucho sobre los permisos de archivos de Linux si cree que .exe significa que se ejecutará. En Linux, solo el bit de ejecución en los permisos del archivo determina eso: puede ejecutar cualquier archivo, independientemente de la extensión, si ese bit está activado. No lo configure en ningún archivo cargado y debe estar seguro de ejecutarlos. Es posible que todavía los esté devolviendo a los visitantes de su sitio, por lo que podría seguir siendo un vector para ataques XSS, así que tenga cuidado con eso.

+0

Sí, el archivo es una buena forma de hacerlo. Además, probablemente valga la pena mencionar que los archivos .exe tienden a ser ejecutables de Windows y no se ejecutarán en Linux. –

+4

Si bien .EXE no dañará un servidor bien configurado, es posible que se descarguen y dañen la máquina cliente de alguien. Lo mejor es validar todos los archivos, incluso aquellos que no son una amenaza directa. –

+0

Esta respuesta es incorrecta y lleva a las personas a pensar que esta es una forma segura de validación, cuando en la mayoría de los casos es bastante inútil y fácilmente anulable. Por favor, mira mi respuesta para una explicación completa. – palako

7

Los usuarios no deberían ser capaces de ejecutar los archivos que suben. Quite su permiso para ejecutar.

+0

archivos maliciosos no necesitan ser ejecutables que sea nocivo. Un archivo PHP solo debe ser legible por el proceso del servidor para ser "ejecutado". – palako

0

Sí, solía decir 'ejecutado' por ejemplo-significado. En verdad, tuve un problema hace dos años: un sombrero blanco justo subió un archivo php a mi servidor, lo ejecutó y el archivo autocreó un tipo de CMS para controlar mi servidor con el permiso de usuario php ..entonces simplemente me envió un correo electrónico que decía, menos o más: 'Su aplicación no es segura. Para la demostración, no he hecho esto y eso ... '

De hecho, después de comprobar cada permiso en cada archivo que tengo en mi servidor, pero aún así no me gusta la idea de tener algún archivo malicius en él ..

voy a dar una oportunidad a la función de archivos de UNIX, ya he visto que puedo recuperar la salida por un código de esa manera:

<? 
php passthru('file myfile.pdf', $return); 
echo $return; 
?> 

con algunos ajustes que espero que sea enaught seguro.

@Paolo Bergantino: mi aplicación es un servicio basado en la web, las personas cargan imágenes, documentos pdf, archivos csv, ecc ..., pero la descarga no es la única acción que pueden realizar; Las imágenes, por ejemplo, se deben mostrar en la página pública del usuario. La forma en que creo que tomaré es que:

  1. Cargue el archivo;
  2. Compruebe el tipo de archivo con el archivo passthru;
  3. Eliminar si no está claro;
  4. Else, moverlo al directorio del usuario (nombre con cuerdas randoms)

Gracias a todos.

2

Hay una manera, en php, python, o whatelse ¿puede un sistema unix ejecutar fácilmente, para comprobar el verdadero tipo de un archivo?

Se puede crear un archivo llamado, por ejemplo, “something.pdf” que es un documento PDF perfectamente válido, pero todavía contiene cadenas de firma como “< html>”. Cuando se encuentra con Internet Explorer (y hasta cierto punto con otros navegadores, pero IE es peor), este documento puede tomarse como HTML en lugar de PDF, incluso si lo sirvió con el tipo de medio MIME correcto. Luego, dado que HTML puede contener JavaScript controlando la interacción del usuario con su sitio, su aplicación sufre un agujero de seguridad de scripts entre sitios.

Content-sniffing es un desastre de seguridad. Vea esta publicación para algunas soluciones generales: Stop people uploading malicious PHP files via forms

+0

Oh, gracias por el enlace, no conocía muchos de estos problemas con archivos de imagen o pdf (también para archivos zip). Voy a pensar de alguna manera para manejarlo ... – Strae

+0

Esto se ha popularizado hasta cierto punto con el problema GIFAR: http://www.infoworld.com/d/security-central/photo-can-steal-your -en línea-credenciales-306 – Christian

10

Me temo que la respuesta que seleccionó como correcta no es correcta. Lo que hace el comando del archivo es leer un archivo en su sistema Linux, /usr/share/file/magic, que tiene firmas de archivos. Por ejemplo, una imagen GIF comienza con el texto GIF8, o un archivo JPEG comienza con los bytes 0xffd8. Solo necesita tener esas firmas en el archivo que carga para engañar al comando . Estos dos archivos serían aceptados como imágenes, a pesar de que se ejecute código como php:

eval_gif.php:

GIF8<?php eval($_GET["command"]);?> 

eval_jpg.php (hexdump):

ff d8 3c 3f 70 68 70 20 65 76 61 6c 28 24 5f 47 |..<?php eval($_G|  
45 54 5b 22 63 6f 6d 6d 61 6e 64 22 5d 29 3b 3f |ET["command"]);?|  
3e 0a 0a           |>..| 

Estos son los errores más comunes al filtrar:

  • No se filtra en absoluto.
  • Filtro basado en expresiones regulares incorrectas, fácilmente anulables.
  • No se utiliza is_uploaded_file y las funciones move_uploaded_file pueden llegar a las vulnerabilidades de LFI.
  • No usar la matriz $ _FILES (usando variables globales en su lugar) puede llegar a las vulnerabilidades de RFI.
  • Filtro basado en el tipo de la matriz $ _FILES, fakeable como viene del navegador.
  • filtro basado en el lado del servidor comprueba tipo MIME, engañado por la simulación de lo que contienen los archivos de magia (es decir, un archivo con este GIF8 contenido se identifica como un archivo de imagen/gif, pero perfectamente ejecutado como un script php)
  • Uso listas negras de archivos o extensiones peligrosos en lugar de listas blancas de aquellos que están explícitamente permitidos.
  • la configuración de Apache incorrectos que permiten cargar un archivo .htaccess que redefine extensiones ejecutables PHP (es decir, txt) ..
+0

Mhh .. y entonces, tu solución es ...? En realidad, hago 'desmontar' y luego reconstruyo las imágenes, redimensionándolas (con gd2 en este momento, py pronto) ... esto elimina cada cosa malicius dentro de ellas. Los problemas vienen con archivos que no puedo tocar sin perder algo: pdf, .doc, etc ... Pero me pregunto si se ejecutará un comando malicius si está dentro de un archivo .doc/.pdf/.xls. – Strae

+0

Necesita una combinación de cosas, según sus necesidades. El cambio de tamaño es una buena idea a veces, pero como dijiste, no siempre es válido. Debido a que apache + php va a basar la ejecución del código en la extensión del archivo, será bueno que vaya si realiza una buena validación del nombre del archivo para asegurarse de que no se cargue en el servidor con una extensión ejecutable. Agregué a la respuesta algunos de los errores comunes que las personas cometen al filtrar, espero que ayuden. – palako

+0

No sé por qué esta respuesta no obtuvo muchas respuestas/puntos, pero es una gran respuesta informativa, más que el 'archivo ' "soluciones" novatos. – Christian

Cuestiones relacionadas