¿Es suficiente para eliminar “..” de las cadenas para evitar un ataque de cruce de directorios?

3

Digamos que quiero construir un script PHP simple que me permita acceder a los archivos dentro de una carpeta:

$path = $_GET['path']; $path = str_replace('..', '', $path); $path = "./static/" . $path; readfile($path);

¿Es la línea 2 en este ejemplo suficiente para evitar que las personas lean archivos fuera de la carpeta 'estática'?

    
pregunta kR105 06.03.2015 - 02:11
fuente

2 respuestas

7

Actualmente no puedo pensar en una buena razón por la que eliminar todas las cadenas ".." no funciona, pero la forma más adecuada sería usar realpath () y asegúrese de que el inicio de la cadena coincida con la ruta de directorio completa deseada.

    
respondido por el Jeff Ferland 06.03.2015 - 02:45
fuente
4

Es muy fácil para los atacantes codificar la cadena literal .. de varias maneras. La forma más fácil es usar la codificación de URL que codifica .. como %2E%2E . Esto no será detectado por str_replace y aún se resolverá en una ruta maliciosa. Consulte la página Travesía de ruta de OWASP para obtener más ejemplos.

realpath() es generalmente una mejor solución para esta situación.

    
respondido por el jsaigle 13.06.2017 - 17:37
fuente

Lea otras preguntas en las etiquetas