VULNERABILIDADES DE APLICACIONES WEB: SUBIDA DE ARCHIVOS PELIGROSOS

24.01.2018 10:59
 
Cuando tenemos que habilitar la posibilidad de que un usuario suba archivos a un sitio web, debemos ser extremadamente cautelosos. El ejemplo utilizado con mayor frecuencia es el del abuso de la funcionalidad de subir imágenes. Veamos un caso extremdamente burdo:
 
<html>
    <body>
        <form method="post" action="" enctype="multipart/form-data" >
            <label for="file">Archivo:</label>
            <input type="file" name="archivo" id="file1" /> 
            <br />
            <input type="submit" name="submit" value="Enviar" />
        </form>
    </body>
</html>
<?php
if(isset($_POST['submit'])) {
    if ($_FILES["archivo"]["error"] > 0) {
        echo "Error: " . $_FILES["archivo"]["error"] . "<br />";
    } else {
        echo "Subido: " . $_FILES["archivo"]["name"] . "<br />";
        echo "Tipo: " . $_FILES["archivo"]["type"] . "<br />";
        echo "Tamaño: " . ($_FILES["archivo"]["size"] / 1024) . " Kb<br />";
        echo "Guardado en: " . $_FILES["archivo"]["tmp_name"] . "<br/>";
    }
}
 
$destino = "fotos/" . basename($_FILES['archivo']['name']);
 
if(move_uploaded_file($_FILES['archivo']['tmp_name'], $destino))
{
echo "La foto ha sido subida con éxito";
}
else
{
echo "Hubo un error al subir la foto.";
}
?>
 
Como vemos en el ejemplo de arriba, el archivo pasa desde un lugar de almacenamiento temporario a su destino definitivo sin el menor control del tipo de archivo que se subió. El pirata informático hubiera podido subir una puerta trasera programada en, por ejemplo, PHP sin ninguna dificultad. Otro error posible (y no muy raro de encontrar) es la validación sólo del lado del cliente con, por ejemplo, JavaSript. El pirata informático burlará esa validación con extrema facilidad. 
 
Hay otros problemas asociados a la subida de archivos. Un pirata informático podrá subir un archivo que realmente sea una imagen, pero que estará contaminada con código PHP u otro. Bastará que encuentre una vulnerabilidad de Inclusión Local de Archivo para que pueda ejecutar el código (ver: geoestrategia.webnode.es/news/vulnerabilidades-de-aplicaciones-web-escritura-de-archivos/ - la razón por la que el código se ejecutará será similar al caso de los archivos de texto en la Escritura de Archivos).
 
Un pirata informático también podrá nombrar un archivo .php como archivo de imagen y aprovechar alguna vulnerabilidad del sitio para renombrarlo con su tipo de archivo original.
 
Como se puede observar, cuando se habilita una funcionalidad de subida de archivos se debe tomar una serie de precauciones muy importantes. Lamentablemente los piratas informáticos tienen varias posibilidades para explotar cualquier error que se cometa en la implementación de esta funcionalidad. Aún cuando no hubiera ningún error en la subida de archivos propiamente dicha, otras vunerabilidades en la aplicación perimitirán subir y aprovechar archivos peligrosos.