Subir-labs notas de prueba

Subir-labs notas de prueba

Por: Espejo Wang Yuyang

De noviembre de 2019 -

Subir archivo de análisis de aprendizaje

Los requisitos ambientales

Para configurar su propio entorno personal, por favor siga el entorno de configuración, paso antes de cada ejecución correctamente.

Elemento de configuración configuración descripción
sistema operativo Ventana o Linux Recomienda el uso de Windows, debe, descansar Pass se puede ejecutar en Windows Pass-19, además de Linux
versión de PHP recomendado 5.2.17 Otras versiones pueden causar algún paso no se puede romper
componentes PHP php_gd2, php_exif parte Pass dependiente de los dos componentes
middleware Apache se proporciona conectado a Moudel

Subir-labs Estructura de Medio Ambiente

extracto técnica

  • El análisis de archivo de punto de pase largo

punto de fallo Subir

Pase-01

[Fuente]

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

[Análisis]

Pass-01 es usar js en el cliente para verificar el archivo, se puede omitir.

[Pensamiento]

El uso de encubrimiento, para modificar directamente la carga de archivos PHP después de formato de imagen, el uso de eructar interceptar los paquetes de datos, modificar el formato de archivo (extensión)

Pase-02

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

[Análisis]

se detecta servidor para aceptar el archivo MIME fuente, se determina si el formato de imagen, pero es una verificación grave defecto de MIME, el usuario puede modificar libremente los valores de los parámetros MIME, pero no afecta a la normalidad de análisis del formato de archivo.

[Pensamiento]

carga normal de un archivo PHP, los paquetes de datos de intercepción eructar, tipo MIME formato modificado paquete de datos a formato de imagen MIME.

Pase-03

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $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)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

Detección archivo fuente detección nombre de sufijo, determinando de este modo el tipo de archivo; eructo inutilizable paquete de interceptación forma modificada; listas negras emplea desde asp solamente aislado, aspx, php sufijo, como archivos JSP; php debido a las características de sufijo php5 puede subir otros documentos también puede resolverse de acuerdo con el archivo PHP

[Pensamiento]

Cargar el archivo "11.php5", sin pasar directamente a la lista negra.

[Sal: Obtener directorio de carga y nombre de archivo]

Desde la ubicación del archivo de carga de archivos es la ubicación y el nombre del archivo se cambia el nombre usando el segundo número al azar, y por lo tanto podemos abrir el camino para puestos específicos de la imagen en el archivo de imagen se devuelve. Devuelve una imagen cargada con éxito un archivo PHP (PHP5), abra la dirección URL de la imagen es la dirección de los archivos PHP, por ejemplo: ../upload-labs-master/upload/202003141844327950.php5esto depende de los problemas de configuración de Apache (necesidad de modificar la configuración de Apache, como apoyo analítico para Apache como php3 el archivo correspondiente al archivo PHP)

Pase-04

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $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)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

Vi tantas array deny_ext lista negra; métodos analíticos especiales antes de (confusión resuelto) también pueden estar presentes, la clave todavía depende de la configuración de Apache seguridad

[Conocimiento .htaccess]

Htaccess (archivo de configuración distribuido) se proporciona un método para cambiar la configuración del directorio; colocación de un archivo que contiene una o más instrucciones de un directorio documento en particular a directorio y todos los subdirectorios efecto a la misma; (medio ambiente Apache es un comportamiento de configuración)

Establecer .htaccesstodos los archivos en el directorio actual al archivo PHP análisis $ # $

Pase-05

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

Aquí para .htaccessser tirado en la lista negra, mira delgada línea de código que se encuentra menos "caja de transferencia" antes de que el código fuente; un defecto de código en una exposición instantánea, el nombre del archivo puede ser confuso caso.

[Pensamiento]

Subir muma.Phparchivos

Pase-06

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = $_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
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file,$img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

Parece a partir de la fuente, la construcción de la lista negra es del todo perfecto, sino también añadir una detección fragmento minúsculas transición, caso confusión antes, confusión analítica especial, .htaccess y otros métodos aquí están bloqueados; pero según convención, ya que es una lista negra, todavía es nuestra idea es derivación alrededor de la lista negro del defecto, mientras que los defectos de código encontraron lagunas alrededor.

[Pensamiento]

A través del análisis del código fuente, no se encuentra la extensión de archivo que deben adoptarse para hacer frente a vacío; consejos aquí: el sistema operativo se bloquea automáticamente el nombre del archivo de extensión sufijo eliminado, pero el procesamiento en el símbolo de código está presente y puede ser un mango hueco.

Enviado directamente subir WebShell ".php" archivo a utilizar los paquetes de datos de intercepción eructar, modificar el paquete de extensión de archivo (añadir un símbolo vacío)

Pase-07

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_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)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

extensión de archivo está completamente tirado en la lista negra, a su vez unificado minúscula pruebas cadena a vaciar, pero volver a romper el propósito de la investigación no encontró lata defecto de derivación de detección y se detuvo en el archivo sufijo forma de enumeración alrededor de la lista negra!

[Pensamiento]

Aquí la idea es el uso de Win características de almacenamiento de archivos, la extensión automática del escudo colas .símbolos; php normales de carga de archivos, paquetes de intercepción eructar ese documento sufijo .php., la detección exitosa de bypass php eliminando automáticamente la cola de la victoria, el sistema Linux normal de símbolos guardado como 。.phpun archivo, (no hay otras razones especiales para elegir el final del símbolo: en los cambios de extensión de archivo, otros caracteres especiales serán almacenados correctamente, sólo los puntos de símbolos serán eliminados)

Pase-08

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

No había ::$DATAderivación de pruebas de seguridad

[Pensamiento] -> ::$DATAby-pass

Cuando una propiedad de datos Los datos almacenados arroyos sistema de archivos NTFS, y cuando visité a.php :: DATOS, está solicitando datos a.php sí.

Presentar .phpdocumentos, paquetes de intercepción eructar revisados para .php::$DATAponer el paquete; normal a ./././xxxx.phpacceder al archivo de

Pase-09

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $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)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

Aquí rechazado toda lista de anulación previa, pero aún así, de acuerdo con el principio de la lista negra sin pasar a través de una lista de defectos y fallas que se encuentra en la lógica de código: la lógica de eliminación (eliminación de puntos de cola, terminando carácter nulo Borrar, Borrar ::$DATA) para borrar la lógica aquí el uso de la forma de "doble escritura" para hacer avance

[Pensamiento]

Eructo por la cadena de nombre de archivo para modificar .php. .el código y la lógica va a suprimir el punto de fuga caracteres nulos, y por último se .php.someterá a la lista negra de la verificación

Pase-10

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

[Análisis]

Siendo un mecanismo de listas negras descubierto aquí una lógica código de la llave, en línea con el carácter de lista negra reemplazar todo carácter nulo, por lo que aquellos que no están de ninguna manera a la extensión confundir de ninguna utilidad antes de su uso, siempre y cuando se cumpla con el carácter de la lista negra reemplazar todas vacías

[Pensamiento]

eructo intercepto el nombre del archivo cambiar para ser duplicado .phphpp, para verificar el código, el código de verificación para realizar una verificación y sustituir la palabra sensible para el carácter nulo luego subir.

Pase-11

[Fuente]

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

[Análisis]

Aquí ya no es un mecanismo de lista negra, mientras que el uso de un mecanismo de "lista blanca"

[Pensamiento]

Uso %00de bytes modo de derivación truncado ->.php%00

Pase-12

[Fuente]

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

[Análisis]

[Pensamiento]

00 bytes truncado, PHP5.3 + versión ya no está soportado

Pase-13

[Fuente]

**************客户端校验****************
function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin); 
        // unpack() 函数从二进制字符串对数据进行解包。   
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

*************服务端校验***********************
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

[Análisis]

Aquí sólo se permite subir archivos de imágenes, imágenes del caballo para ir de; js guión a través de los dos primeros bytes del archivo para determinar el tipo de archivo de lectura

[Pensamiento]

Se debe utilizar el archivo contiene una imagen de un caballo resuelto

Pase-14

[Fuente]

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        //file_exists() 检测文件是否存在
        $info = getimagesize($filename);
        // getimagesize() 获取图像大小及相关信息,成功返回一个数组

        // [宽度,高度,type(返回数值),…………]
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

****************************************************

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

[Análisis]

Aquí el cliente utilizando la getimagesize()información (regreso tercer elemento de la matriz) función de adquirir un tipo de imagen verificar;

[Pensamiento]

imágenes del caballo

Pase-15

[Fuente]

function isImage($filename){
    //需要开启php_exif模块
    $image_type = exif_imagetype($filename);
    switch ($image_type) {
        case IMAGETYPE_GIF:
            return "gif";
            break;
        case IMAGETYPE_JPEG:
            return "jpg";
            break;
        case IMAGETYPE_PNG:
            return "png";
            break;    
        default:
            return false;
            break;
    }
}

*************************************************

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

[Análisis]

Utiliza en este documento PHP_exifmódulo determina el tipo de archivo; exif_imagetype()tipos de imagen

[Pensamiento]

imágenes del caballo

Pase-16

[Fuente]

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.'/'.basename($filename);

    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,"."),1);

    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);

            if($im == false){
                $msg = "该文件不是png格式的图片!";
                @unlink($target_path);
            }else{
                 //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".png";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagepng($im,$img_path);

                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".gif";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagegif($im,$img_path);

                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    }else{
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}

[Análisis]

Este es un gran problema, la extensión completa juicio, tipo de contenido, el uso imagecreatefromgif y otros medios para verificar si la imagen; pero la clave está en el juez de la imagen hará que una segunda imagen, imágenes hexadecimal hizo una gran cantidad de contenido va a cambiar. Enviar un buen análisis del artículo (ideas)

Pase-17

[Fuente]

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

[Análisis]

condiciones competitivas de derivación ( consulte el artículo )

Pase-19

CVE-2015-2348 move_uploaded_file () 00 截断

Pase-20

Pase-20 Artículo de referencia


Los autores señalan

Subir-laboratorios están en contacto en el último año y forman parte integrante del Paso, materiales recientemente acabado encontraron en este manuscrito sin terminar, por lo que toda su repuesto tiempo Resumen de acabado (Paso parcialmente debido a las limitaciones de tiempo y molestias ambiental no probado, que se reproduce predecesores artículo)

Subir-laboratorios de prueba de la gran mayoría de la carga de archivos convencional y métodos de análisis, sino también aprenden a evitar el riesgo de los archivos subidos durante el aprendizaje de prueba.

Defensa de los métodos de carga de archivos no se puede prescindir:

  • la regulación de front-end: Código-Js limitado el uso de tipos de archivos cargados, pero este método no es fiable y no pueden hacer, y todo el frente de la defensa pueden ser anuladas a través de la captura de datos

  • Compruebe la extensión: Comprobar el significado de fondo MIME no es grande, pero puede ser detectado (método de derivación es también más) en la extensión de archivo sugerido actualización aquí en primer lugar a la versión de PHP 5.4 o más para evitar la derivación de 00 bytes, requisitos de configuración de acuerdo con la seguridad Apache (también recomendó Nginx); para completar la extensión de la relación de intercepción para comprobar la lista negra (o lista blanca mecanismo también pueden ser adoptados, las necesidades específicas de diseño específico, por supuesto, la lista blanca es más seguro); Recuerde que el sufijo está estrictamente comprobar! ! !

  • Comprobar la vulnerabilidad de análisis: comprobar la vulnerabilidad de análisis, si hay la vulnerabilidad de análisis de derivación a la lista blanca / negro es fácil, he recogido algunos artículos vulnerabilidad de análisis de todas partes, para referencia:
  • La cabeza de análisis de contenido para comprobar el tipo de archivo: Este tipo de método no está comprobando el sufijo de archivo es tan simple, pero comprueba el contenido del archivo, el uso de diferentes tipos de archivos específicos, habrá diferentes banderas y comenzando; disponible php de exif_imagetype () función (que también puede escribir su propia)

  • Muy muchas otras estrategia de defensa, sin embargo, el autor establece estudio de la política de seguridad y defensa en profundidad

Supongo que te gusta

Origin www.cnblogs.com/wangyuyang1016/p/12507655.html
Recomendado
Clasificación