pregunta relacionada con la seguridad del formulario de carga php

1

Leí aquí enlace y la pregunta está relacionada con texto cerca

  

Sin embargo, si el atacante puede cargar archivos, incluso fuera de la raíz web, y conoce el nombre y la ubicación del archivo cargado, al incluir su archivo cargado puede ejecutar un código arbitrario en el servidor.

     

La solución para eso es evitar que el atacante sepa el nombre del archivo. Esto se puede hacer generando nombres de archivos al azar y manteniéndolos en una base de datos.

No entiendo completamente el riesgo de seguridad. Como entiendo

  1. el atacante carga un archivo malicioso
  2. En este momento, mi código php convierte el nombre del archivo en algo aleatorio y con ese nombre aleatorio se almacena en un directorio particular. Pero el usuario malintencionado puede ver ese nombre aleatorio, por ejemplo, haciendo clic con el botón derecho del ratón Copy location y ver https://domain.com/images/2014-05-16/339442/VH4AGExjRlw=/something_random.jpg . ¿Así que simplemente crear un nombre aleatorio no ayuda?
  3. Como entiendo en mysql, ¿debe registrar el nombre real del archivo y el nombre que el usuario puede ver en url?

No puedo entender completamente. El objetivo es evitar que el usuario cargue el archivo y, a continuación, saber el nombre del archivo, ¿puede acceder al archivo?

    
pregunta Andris 30.11.2014 - 15:47
fuente

1 respuesta

2

Estás en lo correcto. Si el objetivo final es procesar el archivo en el servidor, el cambio de nombre proporciona una capa de protección. Sin embargo, si va a volver a mostrar el archivo, el cambio de nombre no ha ayudado; el atacante solo utiliza el mecanismo de visualización que proporciona su sitio.

Supongamos que los usuarios de su web pueden cargar imágenes que luego se muestran en el sitio. Como dice el artículo en su enlace, un atacante puede cargar una imagen que contenga PHP (o JavaScript, o lo que sea) en los comentarios incrustados. Si el programa del servidor web estuviera configurado (mal) de alguna manera para enviar archivos con una extensión .jpg al procesador PHP, el atacante podría ejecutar código PHP arbitrario en su máquina con los privilegios del proceso del servidor web.

Lo que esto significa es que el desarrollador web debe sanear cuidadosamente los archivos antes de permitir que se vuelvan a mostrar. Entonces, usted:

  1. subir a un nombre de archivo aleatorio y hacer un seguimiento del nombre
  2. procesar el archivo para desinfectarlo; cómo sanear depende del tipo de archivo
  3. cambiar el nombre a un nombre "interno"; Probablemente no quiera usar el nombre de archivo del cargador de todos modos debido a las colisiones de nombres.
  4. Coloque el archivo desinfectado en un directorio en o debajo de la raíz web, o en una base de datos, y configúrelo para su visualización.

Para archivos de imagen, puedes usar ImageMagick para eliminar comentarios. Hay una discusión sobre el uso del comando -SET para eliminar los comentarios aquí: enlace Interesantemente, También hay un enlace a una imagen, kitten.jpg, que contiene PHP incrustado. Puedes usarlo para experimentar.

Editado el 2014-12-02 para agregar: Como Gumbo ha señalado, un ataque de este tipo puede ser montado a través de una vulnerabilidad de inclusión de archivos. En PHP, todos los archivos incluidos comienzan en modo de copia, por lo que el procesador de PHP nunca ve los datos binarios de la imagen, simplemente busca la instrucción de procesamiento de XML <?php (o cualquiera de los otros introductores válidos). Eso cambia el procesador de PHP. Para interpretar el modo y se ejecuta el código PHP incorporado. Cuando se encuentra el ?> , el procesador vuelve al modo de copia y simplemente copia el material binario un poco más.

    
respondido por el Bob Brown 30.11.2014 - 16:54
fuente

Lea otras preguntas en las etiquetas