[Upload-labs] Principio de vulnerabilidad de carga de archivos y explicación detallada de la operación 1 ~ 3

[Upload-labs] Explicación detallada del principio y funcionamiento de las vulnerabilidades de carga de archivos


¿Qué es una vulnerabilidad de carga de archivos?

La vulnerabilidad de carga de archivos se refiere al hecho de que el programador puede cargar archivos de secuencia de comandos dinámicos ejecutables en el servidor más allá de su propia autoridad debido a un control insuficiente de la parte de carga de archivos del usuario o defectos de procesamiento . Los archivos cargados aquí pueden ser caballos de Troya, virus, scripts maliciosos o WebShell, etc. Este método de ataque es el más directo y efectivo. No hay ningún problema con la "carga de archivos" en sí. El problema es cómo el servidor maneja e interpreta el archivo después de que se carga el archivo. Si la lógica de procesamiento del servidor no es lo suficientemente segura, tendrá graves consecuencias.

webshell?

WebShell es asp, php, jsp o cgi y otros archivos web forman un tipo de existencia del entorno de ejecución de comandos , se puede describir como la puerta trasera de una página web. Después de atacar un sitio web, el atacante generalmente mezcla estos archivos de puerta trasera asp o php con los archivos de página web normales en el directorio web del servidor del sitio web, y luego usa un navegador para acceder a estas puertas traseras para obtener un entorno de ejecución de comandos para controlar el sitio web El propósito del servidor (cargar, descargar o modificar archivos, operar la base de datos, ejecutar comandos arbitrarios, etc.).

Causas de las vulnerabilidades de carga de archivos

  • No hay restricciones estrictas sobre el sufijo (extensión) de los archivos cargados.
  • El MIMETYPE (tipo de contenido) del archivo cargado no está marcado
  • En términos de permisos, no hay un conjunto de permisos no ejecutables para el directorio de archivos de la carga del archivo.
  • El servidor no limita el comportamiento de cargar archivos o especificar directorios.

El principio de carga de archivos en la web es configurar el formulario como multiparte / from-data, y agregar el dominio del archivo al mismo tiempo, y luego enviar el contenido del archivo al servidor a través del protocolo HTTP, y el servidor lado lee la información de datos de varias partes y extrae y guarda el contenido del archivo.

Por lo general, al guardar un archivo, el servidor leerá el nombre de archivo original del archivo y obtendrá la extensión del archivo del nombre de archivo original, y luego asignará aleatoriamente un nombre de archivo al archivo (para evitar la duplicación), y Agregue la extensión del archivo original para guardarlo en el servidor.

dañar

  • Cargue archivos troyanos web, controle archivos del servidor web, ejecución remota de comandos, etc.
  • Cargue virus del sistema y archivos troyanos para minería y redes de bots.
  • Cargue el programa de desbordamiento del sistema para escalar privilegios.
  • Modifique la página web para implementar operaciones como suplantación de identidad, ahorcamiento y enlace oscuro.
  • Penetración de intranet.
  • En el caso de permisos elevados, haga lo que quiera.

Posiciones defensivas comunes

  • Verificación JS de front-end
  • Verificación de tipo MIME
  • Lista negra / lista blanca
  • Verifique el contenido del archivo
  • Prohibir que los archivos locales contengan vulnerabilidades
  • Utilice servicios web seguros (apache (a.php.xxx), nginx (/test.png/xxx.php), vulnerabilidad de análisis de IIS (1.php; jpg))

Postura de bypass

  • Bypass JS de front-end
  • Omisión de tipo MIME
  • Nombre de sufijo bypass de mayúsculas y minúsculas / php4, php5
  • 00 truncado
  • Sobrescribir .htaccess
  • Omisión de la función de flujo de archivos de Windows
  • Omisión de nombre de archivo de doble escritura
  • Competencia condicional

[Pass-01] Omisión de detección de JS

Intente cargar un Bing Scorpion Malaysia:

imagen-20210317093134164

Como resultado, hay una ventana emergente que solicita interceptar.Se supone que el front-end js puede ser interceptado.

imagen-20210317093113108

Ver el código fuente de la página web:

Al cargar un archivo y hacer clic en enviar, se ejecutará la función checkFile ()

imagen-20210317093512903

Esta es la función checkFile ():

imagen-20210317093627841

Se puede ver que esta función usa filtrado de lista blanca y solo permite cargar archivos con sufijos de .jpg, .png y .gif.

Debido a que es una limitación de front-end, modificamos directamente el código y eliminamos la función checkFile ().

imagen-20210317094213745

Como se muestra en la figura, la carga se realizó correctamente.

imagen-20210317094943078

imagen-20210317095829181

Como se muestra en la imagen, ¡el escorpión de hielo está conectado correctamente!


[Pass-02] Omisión de tipo de archivo

1. Proceso de prueba

Intenta subir un malayo:

imagen-20210317113240353

Capture el paquete y cambie el valor del campo Content-Type a: image / png

imagen-20210317112807464

¡Coloque el paquete y cárguelo correctamente!

imagen-20210317113127195

imagen-20210317113102400

2. Análisis del código fuente

<?php
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    
    
    if (file_exists($UPLOAD_ADDR)) {
    
    
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
    
    
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
    
    
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;

            }
        } else {
    
    
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
    
    
        $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    }
}
?>

El análisis del código anterior muestra que el backend primero utiliza para $_FILES['file']['type']obtener el tipo de archivo (contenido de tipo de contenido en el cuerpo de la solicitud http), y pone en la lista blanca el contenido (image / gif, image / jpeg, image / png) (no es de extrañar que fuera cambiado a imagen ahora) / jpg no se puede cargar), en este momento, capture directamente el paquete y modifique el valor del campo Content-Type a cualquiera de los tres para omitirlo.

move_uploaded_file(file,newloc): Mueva el archivo cargado a la nueva ubicación newloc.


[Pass-03] Omisión de lista negra

1. Proceso de prueba

Cambie el sufijo a php4 para capturar el paquete ¡Subido con éxito!
imagen-20210318133216506 imagen-20210318133044672
imagen-20210318133357166

Utilice el navegador para visitar, el resultado no está resuelto.

Modificar el archivo de configuración de apache

imagen-20210318171810340

Agregue el sufijo analizado por apache.

Utilice un navegador para acceder al archivo:

imagen-20210318171950496

El resultado es una página en blanco, lo que indica que shell.php4 se ha analizado correctamente.

Pero no puedo conectarme con el escorpión de hielo

imagen-20210318172135517

Verifiqué la información en Internet y dije que había un problema con la versión de php, php5 + no se podía conectar, pero php7 estaba bien. Finalmente, se cambió la versión de php7 y la conexión fue exitosa.

2. Análisis del código fuente

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    
    
    if (file_exists($UPLOAD_ADDR)) {
    
    
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);    //去除开头结尾空格和其他预定义字符
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');  //查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if(!in_array($file_ext, $deny_ext)) {
    
          //黑名单过滤
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
    
    
                 $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
                 $is_upload = true;
            }
        } else {
    
    
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
    
    
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

para resumir

Sufijos analizados por scripts comunes:

ASP: asa / cer / cdx

ASPX: ashx / asmx / ascx

PHP: php4 / php5 / phtml

JSP: jspx / jspf

Supongo que te gusta

Origin blog.csdn.net/qq_43665434/article/details/114986066
Recomendado
Clasificación