¿Directorio transversal en PHP con la matriz $ _FILES?

4

Estoy trabajando en una aplicación php que maneja la carga de archivos. Estoy tratando de inyectar una carga útil transversal en el nombre del archivo, como /../../../../etc/ .

Lo que pasa es que la línea de código vulnerable está usando el nombre de archivo a través de la matriz $_FILES["name"] . Esta matriz php integrada está realizando una limpieza automática de todos los caracteres especiales vulnerables.

Me preguntaba si esa es una protección suficiente o si necesitamos agregar algunos otros desinfectantes. ¿Hay alguna forma de evitar el saneamiento PHP?

    
pregunta KB303 17.08.2018 - 03:59
fuente

2 respuestas

0

Según mi experiencia, $_FILES["uerrfile"]["name"] ya consiste solo en una parte del nombre de archivo, con la ruta eliminada.

Sin embargo, el manual de PHP sugiere usar la función basename() de todos modos , así que no estoy en posición de decirte lo contrario.

En una nota al margen, no recomendaría usar los nombres de archivo originales, ya que son muy incómodos de manejar, ya que podrían estar duplicados o contener caracteres especiales, o ser demasiado largos y truncados, etc.

Entonces, un nuevo nombre asignado por un sistema sería más utilizable. Personalmente, desarrollé el hábito de nombrar los archivos después de md5() a partir del contenido del archivo, o puedes usar cualquier otro método como uniqid() .

    
respondido por el Your Common Sense 17.08.2018 - 11:18
fuente
0
  

... la línea de código vulnerable ...

¿De qué manera vulnerable?

  • si el usuario final puede sobrescribir archivos en / etc, entonces tiene un problema serio de permisos

  • si el usuario puede convencer a su aplicación de que ha cargado (por ejemplo) / etc / shadow, pero la escritura falló debido a un problema de permisos, y luego puede recuperar / etc / shadow luego, además Para el problema de los permisos, tiene un gran problema con la administración de transacciones / manejo de errores en el código de su aplicación.

La versión corta es que el parámetro $ _FILES [] ["name"] es proporcionado / controlado por el usuario. El recorrido del directorio es solo uno de los problemas que encontrará si utiliza datos para determinar el nombre de archivo / ubicación del contenido en su servidor. Hay más sorpresas en la tienda para usted .

Es posible que deba conservar los datos de $ _FILES [] ["name"] para la indexación, pero elija un nuevo nombre / ubicación en su servidor, preferiblemente asociado con un tipo MIME que lo identifique explícitamente como contenido cargado.

Tenga en cuenta que si sigue estos consejos y necesita conservar los datos del nombre, tenga en cuenta que puede aumentar la superficie de ataque según cómo almacene la asignación entre el nombre suministrado por el usuario y su nombre elegido (por ejemplo, los datos pueden convertirse en un vector para inyección SQL).

    
respondido por el symcbean 17.08.2018 - 14:04
fuente

Lea otras preguntas en las etiquetas