[Upload-labs] final del pase-19 ~ pase20

[Upload-labs] final del pase-19 ~ pase20


【Pass-19】 00 cortado

1. Análisis del código fuente

2. Proceso de prueba

Primero intente cargar un troyano muma.php de una frase

imagen-20210323190203524

Usa eructos para capturar paquetes:

imagen-20210323192236233

Reemplace el 2b del signo más con el nulo de 00 en bruto

imagen-20210323190511268

El resultado después de la transformación:

imagen-20210323190537449

imagen-20210323190615389

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

Luego conéctelo directamente con el cuchillo de cocina.

resumen

El principio de truncamiento 00 se mencionó anteriormente, los amigos que no entienden pueden echar un vistazo al portal

Creo que si se puede utilizar la esencia del truncamiento 00 depende de si el usuario puede controlar la ruta de guardado del archivo final.


[Pass-20] Omisión de funciones de ventanas especiales +

1. Análisis del código fuente

if (isset($_POST['submit'])) {
    
    
    if (file_exists(UPLOAD_PATH)) {
    
    

        $is_upload = false;
        $msg = null;
        if(!empty($_FILES['upload_file'])){
    
    
            //mime check
            $allow_type = array('image/jpeg','image/png','image/gif');  //创建一个白名单校验MIME
            if(!in_array($_FILES['upload_file']['type'],$allow_type)){
    
    
                $msg = "禁止上传该类型文件!";
            }else{
    
    
                //check filename
                $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
                if (!is_array($file)) {
    
      //判断save_name是否是一个数组   ???
                    $file = explode('.', strtolower($file)); //explode() 函数把字符串打散为数组,以点为分割
                }

                $ext = end($file);  //end返回最后一个元素的值
                $allow_suffix = array('jpg','png','gif');  //创建一个白名单用于过滤后缀
                if (!in_array($ext, $allow_suffix)) {
    
           
                    $msg = "禁止上传该后缀文件!";
                }else{
    
    
                    $file_name = reset($file) . '.' . $file[count($file) - 1];  //reset()返回第一个元素的值
                    $temp_file = $_FILES['upload_file']['tmp_name'];
                    $img_path = UPLOAD_PATH . '/' .$file_name;
                    if (move_uploaded_file($temp_file, $img_path)) {
    
    
                        $msg = "文件上传成功!";
                        $is_upload = true;
                    } else {
    
    
                        $msg = "文件上传失败!";
                    }
                }
            }
        }else{
    
    
            $msg = "请选择要上传的文件!";
        }
        
    } else {
    
    
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

La verificación MIME anterior es fácil de omitir. La clave es esta oración $file_name = reset($file) . '.' . $file[count($file) - 1];. La composición del nombre del archivo es el primer elemento + punto + el último elemento de la matriz después de dividir . Lo que podemos controlar es el valor del elemento y el valor del elemento es punto diferenciado.

Por ejemplo, shell.php.jpg, la combinación del nombre del archivo debe ser shell.jpg, apache no puede analizarlo y hacer un escándalo por el nombre del sufijo no parece funcionar, cambiar a la lista blanca de shell.php.xxx no funcionará. trabajo, que debo hacer?

Mirando más adelante, if (!is_array($file))esta oración es un poco extraña. ¿Por qué necesitamos juzgar si el nombre del archivo es una matriz? Si el nombre del archivo cargado es originalmente una matriz, esta oración se puede omitir y el contenido de la matriz se puede personalizar nosotros mismos.

2. Proceso de prueba

Sube un muma.php y usa burp para capturar el paquete:

imagen-20210323222133579

imagen-20210323222121718

Después del cambio:

imagen-20210323222517327

imagen-20210323223315645

Aquí, el nombre del archivo se cambia directamente a una matriz, evitando así la fragmentación de la matriz, y el jpg en save_name [2] también puede omitir el filtrado de la lista blanca de sufijos. El sufijo formado por el nombre de archivo es el elemento save_name cuyo índice es la longitud de la matriz menos uno. [1], y save_name [1] no lo configuramos, por lo que está directamente en blanco.

El último empalme de nombre de archivo debe ser shell.php., en este momento, debido a las características de Windows, el punto al final del sufijo se eliminará automáticamente cuando se guarde el archivo.

Así que shell.php se guardó con éxito.

Probemos la conjetura:

Pon la bolsa:

imagen-20210323223353446

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

Finalmente, conéctelo con un cuchillo de cocina.

resumen

El principal avance en este off if (!is_array($file))y $file_name = reset($file) . '.' . $file[count($file) - 1];estas dos palabras, más especial, es construir una matriz de nombres de archivo omitidos y la combinación de características de Windows.

Supongo que te gusta

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