文件上传漏洞测试

发布于:2025-03-10 ⋅ 阅读:(18) ⋅ 点赞:(0)

upload-labs16关

源码:

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 = "上传出错!";
        }
    }
}

准备好图片以及代码,使用通过cmd终端,使用copy ceshi.jpg/b+test.php/a test.jpg生成图片木马以及打开php_exif

查看是否包含成功要加file

然后使用中国蚁剑

upload-labs20关

$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 = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

        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 . '文件夹不存在,请手工创建!';
    }
}

分析:
黑名单机制:
代码定义了一个黑名单数组 $deny_ext,包含常见的危险文件扩展名(如 .php、.jsp、.asp 等)。
使用 pathinfo() 函数获取文件扩展名,并检查是否在黑名单中。
文件保存逻辑:
如果文件扩展名不在黑名单中,文件会被保存到服务器。
文件保存路径为 UPLOAD_PATH . '/' . $file_name,文件名由用户控制。
潜在漏洞:
黑名单可能不完整,攻击者可以使用未列入黑名单的扩展名(如 .php7、.phar 等)。
文件名由用户控制,攻击者可能通过特殊文件名绕过检查。
方法:
1、使用未列入黑名单的扩展名
黑名单中可能遗漏了一些危险扩展名,例如 .php7、.phar、.phtml 等。
攻击者可以将恶意文件保存为这些扩展名。
2、使用双扩展名
攻击者可以在文件名中使用双扩展名(如 shell.jpg.php),利用黑名单检查的漏洞。
如果黑名单检查仅验证最后一个扩展名(.php),文件会被拒绝。
但如果黑名单检查不严谨,文件可能会被成功上传。