¿Hay otras secuencias distintas de ../ que se interpretarán como recorrido de directorios en * nix o Windows?

9

Una vulnerabilidad común es que las aplicaciones web acepten una ruta del sistema de archivos como un parámetro de solicitud y luego realicen alguna acción en la ruta especificada. Por ejemplo, recuperar un archivo y devolverlo al usuario, o tal vez incluso escribir / eliminar un archivo. Esto puede permitir a los usuarios malintencionados acceder a archivos a los que se supone que no deben poder acceder, como el código fuente, los archivos de contraseña, etc.

Esto puede ser un problema incluso si antepones una ruta base, porque un atacante puede usar secuencias transversales de directorios como ../ (* nix) y ..\ (Windows) para desplazarse hacia arriba fuera de la ruta base y hacia restringido directorios y archivos.

La idea general, entonces, es prohibir cualquiera de estas secuencias transversales, o "normalizar" las rutas que contienen estas secuencias y luego verifique que aún estén dentro de la ruta base.

Por lo que entiendo, tratar de incluir en la lista negra las secuencias transversales en el parámetro de solicitud es difícil, porque existen codificaciones URL y Unicode alternativas (por ejemplo, %2e%2e%2f y many , many others) que el servidor web puede interpretar como ../ o ..\ .

Sin embargo, ¿las codificaciones alternativas siguen siendo un problema si normalizamos la ruta después que ha sido recibida por el servidor web (por ejemplo, Apache) y se ha pasado a mi aplicación? Por ejemplo, usando estas reglas de normalización ?

Mi razonamiento es que, ya sea que el servidor web reciba %2e%2e%2f y lo decodifique a ../ , o el servidor web reciba directamente ../ , el algoritmo de normalización verá ../ y lo resolverá / filtrará antes de comparar El directorio base. Incluso si un atacante usa una codificación doble como %252e%252e%252f , se descodificará como %2e%2e%2f , que será tratado literalmente por el sistema operativo / sistema de archivos.

Sin embargo, en esta pregunta , sugiere que :

  

Sin embargo, si un servidor web está sirviendo archivos y decodificando, el Unicode se realiza después de la verificación que impide el cruce del directorio o el sistema operativo lo hace de forma ligeramente diferente, este ataque puede pasar el filtro y permitir que el ataque funcione.

En otras palabras, ¿existen secuencias de caracteres conocidas que puedan superar la decodificación del servidor web Y la rutina de normalización mencionada anteriormente (que maneja ../ o ..\ ), que podría ser interpretada por el sistema operativo o inferior? -el nivel de gestión de archivos funciona como el recorrido del directorio?

Por ejemplo, en PHP:

$base = "/path/to/allowed/directory/";
$path = $_GET['path'];

$normalizedPath = normalize($path);   // normalize will remove or resolve ../ and ..\
$fullPath = $base . $normalizedPath;

echo file_get_contents($fullPath);
    
pregunta alexw 25.04.2016 - 20:54
fuente

2 respuestas

6

En Windows y Unix - no . Puede haber sistemas operativos poco claros que usan diferentes separadores de ruta.

Para manejar la codificación de forma segura, hay una regla simple: descodificar completamente antes de realizar la desinfección . Si no haces esto, tu desinfección puede ser evitada. Imagina una aplicación que hace open(urldecode(normalize(path))) . Si la ruta contiene ../ , normalice con eliminarla. Pero si contiene %2e%2e%2f , la normalización no hará nada, y urldecode lo convertirá a ../ . Este error ha llevado a una serie de vulnerabilidades del mundo real, entre ellas el conocido error de Unicode de IIS .

Otro problema que a veces aparece es secuencias anidadas . Supongamos que su función de normalización hace path.replaceAll('../', '') . Esto se puede sortear probando ....// - el ../ interno se elimina, dejando ../ . La solución es rechazar completamente las cadenas que contienen secuencias prohibidas, o aplicar recursivamente la función de normalización.

Hay otros personajes que pueden tener resultados sorprendentes en las rutas. Generalmente, se permite un byte nulo dentro de cadenas en lenguajes de alto nivel, pero cuando se pasa a la biblioteca C, la cadena nula es un terminador. Los nombres de archivo como evil.php%00.jpg pueden omitir las comprobaciones de extensión de archivo. También se produjo el error de punto y coma de IIS .

En general, los nombres de archivos no son un buen lugar para datos que no son de confianza. Existe la posibilidad de ataques de segundo orden, donde otros procesos que leen el listado de directorios tienen vulnerabilidades. Puede haber secuencias de comandos entre sitios en una página web que enumera los archivos; ha habido vulnerabilidades en el explorador de Windows que los nombres de archivos maliciosos pueden explotar; y atacar un shell de Unix a través de secuencias de escape es una preocupación reciente. En su lugar, recomiendo almacenar el nombre del archivo provisto por el usuario en una base de datos y tener el nombre del archivo como la clave principal.

    
respondido por el paj28 26.04.2016 - 09:02
fuente
6

Utilizando Unicode, es posible codificar \ y / en caracteres de múltiples bytes. Si las funciones de comparación de cadenas no son compatibles con Unicode, podría haber un error que permita el paso de estos caracteres.

Wikipedia tiene una sección sobre esto en relación con un antiguo ataque en servidores Windows:

  

Cuando Microsoft agregó el soporte Unicode a su servidor web, se introdujo una nueva forma de codificar ../ en su código, lo que provocó que se evitaran los intentos de prevención de cruce de directorios.

     

Codificaciones de porcentajes múltiples, como

     
  • %c1%1c
  •   
  • %c0%af
  •   

traducidos a / o \ caracteres.

Técnicamente, esto sigue utilizando el carácter de barra diagonal cuando se trata del recorrido transversal del directorio, simplemente no es el verdadero carácter de un solo byte que puede confundir algún código.

Creo que el mejor consejo para evitar tales caracteres sería no permitir caracteres para las rutas del sistema de archivos, excepto un subconjunto seguro de caracteres ASCII. También puede evitar otros problemas de caracteres permitidos en algunos sistemas operativos y sistemas de archivos al mismo tiempo.

    
respondido por el Alexander O'Mara 25.04.2016 - 21:50
fuente

Lea otras preguntas en las etiquetas