Vulnerabilidad de carga de archivos

1

Estoy intentando pentest un desafío de aplicación web. ¿El siguiente código de control es vulnerable a la carga de archivos? Me gustaría subir un shell php ...

Puedo cargar el archivo shell.php.jpg pero recibo el error al cargar la ubicación del archivo.

function limitText(limitField, limitNum) {
    if (limitField.value.length > limitNum) {
        limitField.value = limitField.value.substring(0, limitNum);
    }
}

var input_file = document.getElementById('image_file');
input_file.onchange = function() {
    var extension = $('#image_file').val().split('.').pop();
    switch (extension.toLowerCase()){
        case 'png':
        case 'jpg':
        case 'jpeg':
            break;
        default:
            alert('Invalid file name');
            $('#image_file').val("")
    }

    return;
};
    
pregunta purcel 07.03.2014 - 22:02
fuente

1 respuesta

2

Parece que solo estás mirando la extensión del archivo. Esto no es efectivo. Para obtener una descripción del por qué y una lista de protecciones viables, consulte el artículo de OWASP sobre "Carga de archivos sin restricciones" .

Extracto: (Es posible que parte de esto no sea directamente aplicable a su entorno, pero no los estoy editando).

  

Uso de listas negras para extensiones de archivos

     

Algunas aplicaciones web todavía usan solo una lista negra de extensiones para   evitar que se cargue un archivo malicioso.

     
  • Es posible omitir esta protección utilizando algunas extensiones que son ejecutables en el servidor pero que no se mencionan en la lista.   (Ejemplo: "file.php5", "file.shtml", "file.asa", o "file.cer")
  •   
  • A veces es posible pasar por alto esta protección cambiando algunas letras de extensión a la forma de mayúscula (ejemplo: "archivo.aSp" o   "Archivo.PHp3").
  •   
  • El uso de espacios y / o puntos al final del nombre de archivo a veces puede provocar que se omita la protección. Estos espacios y / o puntos en   El final del nombre de archivo se eliminará cuando el archivo quiera ser   Guardado en el disco duro automáticamente. El nombre del archivo puede ser enviado a la   servidor mediante un proxy local o mediante un script simple (ejemplo:   "Archivo.asp ... .... . .. .. "," file.asp ", o" file.asp. ").
  •   
  • Un servidor web puede usar la primera extensión después del primer punto (".") en el nombre del archivo o usar un algoritmo de prioridad específico para detectar   extensión de archivo. Por lo tanto, la protección puede ser anulada subiendo un   Archivo con dos extensiones después del caracter punto. El primero es   prohibido, y el segundo está permitido (ejemplo: "file.php.jpg").
  •   
  • En caso de usar IIS6 (o versiones anteriores), podría ser posible omitir esta protección agregando un punto y coma después de lo prohibido.   extensión y antes de la extensión permitida (ejemplo:   “File.asp; .jpg”).
  •   
  • En el caso de utilizar IIS6 (o versiones anteriores), podría ser posible omitir esta protección poniendo un archivo ejecutivo como ASP con   Otra extensión en una carpeta que termina con una extensión ejecutiva.   como ".asp" (ejemplo: "folder.asp \ file.txt"). Ademas es   es posible crear un directorio simplemente usando un cargador de archivos y ADS   (Flujo de datos alternativo). En este método, el nombre de archivo debe terminar con   “:: $ Index_Allocation” o “: $ I30: $ Index_Allocation” para crear un   directorio en lugar de un archivo (ejemplo:   “Newfolder.asp :: $ Index_Allocation” crea “newfolder.asp” como nuevo   directorio).
  •   
  • Esta protección se puede omitir completamente mediante el uso de, por ejemplo, caracteres de control como Null (0x00) después de la extensión prohibida y   antes de la permitida. En este método, durante el proceso de guardado.   Todas las cadenas después del carácter nulo serán descartadas. Poniendo un   El carácter nulo en el nombre de archivo se puede hacer simplemente usando un local   proxy o utilizando un script (ejemplo: "file.asp% 00.jpg"). A pesar de   sería perfecto si el carácter nulo se inserta directamente usando   la opción de vista Hex de un proxy local como Burpsuite o Webscarab en   el lugar correcto (sin usar%).
  •   
  • También es posible crear un archivo con una extensión prohibida utilizando el flujo de datos alternativos NTFS (ADS). En este caso, un signo ":"   Se insertará después de la extensión prohibida y antes de lo permitido.   uno. Como resultado, un archivo vacío con la extensión prohibida será   creado en el servidor (ejemplo: "archivo.asp: .jpg"). El atacante puede intentar   edite este archivo más tarde para ejecutar sus códigos maliciosos. Sin embargo, un   El archivo vacío no siempre es bueno para un atacante. Por lo tanto, hay una   Método inventado por el autor de este documento en el que un atacante puede   cargue un archivo de shell no vacío utilizando el ADS. En este método, un   El archivo prohibido se puede cargar usando este patrón:   "File.asp :: $ data.".
  •   
  • En los servidores de Windows, es posible reemplazar los archivos utilizando su nombre corto (8.3). (ejemplo: "web.config" puede ser reemplazado por   subir "web ~ 1.con") A veces la combinación de lo anterior puede llevar a   sin pasar por las protecciones.
  •   

Uso de listas blancas para las extensiones de archivos

     

Muchas aplicaciones web utilizan una lista blanca para aceptar los archivos   extensiones Aunque el uso de la lista blanca es una de las recomendaciones,   no es suficiente por sí solo. Sin tener validación de entrada, hay   Todavía es una oportunidad para que un atacante pase por alto las protecciones.    - Los métodos tercero, cuarto, quinto y sexto de la última sección también se aplican aquí.    - La lista de extensiones permitidas debe revisarse, ya que también puede contener extensiones maliciosas. Por ejemplo, en caso de tener   “.Shtml” en la lista, la aplicación puede ser vulnerable a SSI   ataques.

    
respondido por el David Stratton 07.03.2014 - 22:20
fuente

Lea otras preguntas en las etiquetas