Joven hacker sonriendo

Evitar Ataques de Directorio Transversal

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en CSharp al Evitar ataques de directorio transversal. La validación de entradas es un proceso fundamental para crear aplicaciones seguras, aquí te enseñamos cómo hacerlo.

Necesidad

Obtener rutas absolutas canónicas para evitar ataques de directorio transversal (C#)

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. La aplicación está construida en C#.

  2. La aplicación emplea rutas que hacen referencia a archivos o directorios del sistema operativo que deben ser validados.

Solución

Los ataques de tipo directorio transversal (o path traversal), se generan cuando una aplicación no cuenta con los niveles de seguridad adecuados al realizar una validación de sus entradas. Un atacante que explota esta vulnerabilidad es capaz de acceder a directorios superiores con total libertad, los cuales normalmente no deberían ser accesibles y visualizar los archivos allí contenidos [1] . Esto representa un riesgo tanto para la información sensible que esta contenida en dichos archivos como para la aplicación misma. En este artículo nos enfocaremos en evitar los ataques de tipo directorio transversal en C Sharp, realizando una validación de rutas en las entradas de la aplicación. Para ello debemos seguir los siguientes pasos:

  1. C# proporciona la función GetFullPath de la clase Path, que devuelve el nombre de una ruta en su forma normal. En el siguiente ejemplo se muestra cómo validar que una ruta ingresada por un usuario se encuentre dentro de un directorio específico. Primero se hace uso de los espacios de nombres correspondientes para el uso de clases como Path y Regex.

    inputvalidation.cs
    1
    2
    3
    4
    5
    6
    7
    8
    using System;
    using System.IO;
    using System.Text.RegularExpressions;
    
    namespace FSG
    {
        class Program
        {
    
  2. Se define la expresión regular para definir que las únicas rutas válidas son aquellas que se encuentran dentro del directorio de archivos temporales. La bandera IgnoreCase se usa para que no sea relevante la diferencia entre mayúsculas y minúsculas.

    1
    static Regex re = new Regex(@"^c:\\Windows\\Temp.*", RegexOptions.IgnoreCase);
    
  3. El paso más importante es utilizar el método GetFullPath, el cual se encarga de interpretar elementos especiales como ., .. para entregar la versión canónica de la ruta especificada [2]. De no utilizarse, la validación podría ser fácilmente sobrepasada.

    1
    2
    3
    4
    static void Main(string[] args)
            {
                var path = Path.GetFullPath(args[0]);
                Console.WriteLine(path);
    
  4. Se muestra un mensaje en función de si la ruta era válida o no.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
     if (re.IsMatch(path, 0))
                {
                    Console.WriteLine("Valid path");
                }
                else
                {
                    Console.WriteLine("NOT valid path");
                }
                Console.ReadLine();
            }
    
        }
    }
    
  5. Por ejemplo si se intenta un ataque de ruta transversal, no se consideraría válida.

    1
    2
    3
    4
    5
    \>csc Canonical.cs
    
    \>Canonical.exe %TEMP%\..\..\boot.ini
    C:\boot.ini
    NOT valid path
    
  6. Para ser válida la ruta debe estar dentro del directorio de archivos temporales.

    1
    2
    3
    \>Canonical.exe %TEMP%\boot.ini
    C:\Windows\Temp\boot.ini
    Valid path
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. canonical.cs contiene las instrucciones en C Sharp para realizar una validación de directorios.




Haz un comentario

Estado de los servicios - Términos de Uso