¿Explotación del cheque faltado de is_uploaded_file?

4

La documentación de PHP para is_uploaded_file dice:

  

Devuelve VERDADERO si el archivo nombrado por nombre de archivo se cargó a través de HTTP POST.   Esto es útil para ayudar a garantizar que un usuario malintencionado no haya intentado   engañar a la secuencia de comandos para trabajar en archivos en los que no debe ser   trabajando, por ejemplo, /etc/passwd .

También sugiere esto:

  

Para que funcione correctamente, la función is_uploaded_file () necesita un argumento   Me gusta $ _FILES ['archivo_usuario'] ['nombre_mpmp'], - el nombre del archivo cargado   en la máquina del cliente $ _FILES ['archivo de usuario'] ['nombre'] no funciona.

Pero, por lo que sé, tmp_name no está controlado por el usuario de todos modos, por lo que la verificación no debería ser obligatoria.

Y si uso name en lugar de tmp_name al cargar archivos (por ejemplo, usando copy en lugar de move_uploaded_file ), mi script de carga de archivos no funcionará, ya que siempre movería el error. expediente.

Mis preguntas:

  • Los comentarios mencionan que move_uploaded_file realiza la comprobación de is_uploaded_file , ¿es cierto?
  • ¿El usuario tmp_name está controlado de alguna manera?
  • ¿Existe un escenario realista en el que is_uploaded_file realmente se requiere al cargar un archivo, o al realizar cualquier otra acción como leer, eliminar, etc., ya que habría una vulnerabilidad sin él? ¿O es la función completamente inútil?
pregunta tim 20.08.2016 - 13:47
fuente

1 respuesta

3

Para responder a sus preguntas:

  

Los comentarios mencionan que move_uploaded_file realiza la comprobación de is_uploaded_file, ¿es cierto?

Lo hace. Puede verlo en el código fuente de move_upload ' > que las verificaciones que realiza son (casi) las mismas que se realizan en is_uploaded_file () método.

  

¿El usuario tmp_name está controlado de alguna manera?

No, el usuario no puede controlar este valor. Es asignado por el intérprete y es aleatorio cada vez. Incluso si carga el mismo archivo más de una vez, tendrá un tmp_name diferente cada vez.

  

¿Existe un escenario realista en el que is_uploaded_file realmente se requiera al cargar un archivo, o al realizar cualquier otra acción como leer, eliminar, etc., ya que habría una vulnerabilidad sin él? ¿O es la función completamente inútil?

Como desarrollador de PHP, personalmente nunca lo he usado. Como ya está incorporado en el método move_uploaded_file() . Nunca he encontrado un escenario en el que quisiera que se subiera un archivo, pero no lo moviera a una ubicación de mi elección y simplemente permanezca en algún lugar del directorio de carga temporal con un nombre aleatorio. Supongo que podría usarlo si solo desea mostrar el contenido del archivo cargado, pero no mantenerlo almacenado en su servidor, como el ejemplo # 1 en los documentos sugiere. Un escenario que me viene a la mente es si ejecutaría un servicio de pastebin con funcionalidad de carga o similar. Puede permitir que el archivo se cargue, leer su contenido desde el directorio temporal, usarlo como entrada para el área de texto y luego eliminar de nuevo el archivo de su ubicación temporal (o pedirle a un técnico de limpieza que lo haga periódicamente).

    
respondido por el Oldskool 23.08.2016 - 10:22
fuente

Lea otras preguntas en las etiquetas