专栏首页HACKWAYUpload-labs通关笔记(三)

Upload-labs通关笔记(三)

Upload-labs是一个帮你总结所有类型的上传漏洞的靶场 项目地址:https://github.com/Tj1ngwe1/upload-labs

环境要求

若要自己亲自搭建环境,请按照以下配置环境,方可正常运行每个Pass。

配置项

配置

描述

操作系统

Window or Linux

推荐使用Windows,除了Pass-19必须在linux下,其余Pass都可以在Windows上运行

PHP版本

推荐5.2.17

其他版本可能会导致部分Pass无法突破

PHP组件

php_gd2,php_exif

部分Pass依赖这两个组件

中间件

设置Apache

以moudel方式连接

第十一关

源码解读

$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类型文件!";
    }
}
  • strrpos() 函数查找字符串在另一字符串中最后一次出现的位置
  • 是后缀名白名单,截取后缀名并随机命名拼接

bypass

$_GET['save_path'] 有传入参数可控,可以使用%00截断

第十二关

源码解读

$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类型文件!";
    }
}
  • 与前一关类似,只是变成了POST提交

bypass

%00截断进行拼接

第十三关

源码解读

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节 读取文件头
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $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_ADDR."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        }
        else{
            $msg = "上传失败";
        }
    }
}
  • 会读取文件头和文件类型,已提示传入图片mm

bypass

制作图片mm上传

结合文件包含进行解析

第十四关

源码解读

 function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)){
            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_ADDR."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        }
        else{
            $msg = "上传失败";
        }
    }
}

这里用getimagesize获取文件类型

bypass

还是直接就可以利用图片马就可进行绕过

第十五关

源码解读

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_ADDR."/".rand(10, 99).date("YmdHis").".".$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        }
        else{
            $msg = "上传失败";
        }
    }
}

这里用到php_exif模块来判断文件类型

bypass

还是直接就可以利用图片马就可进行绕过

本文分享自微信公众号 - HACKWAY(gh_7a5a315cde00),作者:HACKWAY

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Upload-labs通关笔记(二)

    查看源码还是黑名单没有对后缀名进行去.操作利用 Windows 特性会自动去掉后缀名中最后的.可在后缀名中加 . 绕过

    轩辕小子
  • Upload-labs通关笔记(四)

    首先在burp中不断发送上传webshell的数据包,然后不断在浏览器中访问,发现通过竞争可以访问到。

    轩辕小子
  • Upload-labs通关笔记(一)

    Upload-labs是一个帮你总结所有类型的上传漏洞的靶场 项目地址:https://github.com/c0ny1/upload-labs

    轩辕小子
  • upload-labs上传绕过(下)

    trim函数 根据我们的测试,它是将指定的字符串移除,那么在这里我们就可以上传.pphphp即可绕过

    字节脉搏实验室
  • Uploads-labs上传绕过(上)

    链接:https://pan.baidu.com/s/1lMRBVdQyFuKOgNlWPUoSSQ

    字节脉搏实验室
  • file命令

    file命令用来探测给定文件的类型,file命令对文件的检查分为文件系统、魔法文件和语言检查3个过程。

    WindrunnerMax
  • 用好 Require,check,assert,写好 Kotlin 代码

    在编码的时候,我们需要做很多的检测判断,比如某个变量是否为null,某个成员属性是否为true,执行某个操作结果是否成功。比如像下面的这段代码

    技术小黑屋
  • Linux shell ${}简单用法

    Linux shell ${}简单用法 [转]http://linux.chinaunix.net/techdoc/develop/2007/05/05/9...

    汤高
  • python3第七天(输入和输出)

    输出值的方式:1,表达式。2,print()函数。3,文件对象的write()函数

    py3study
  • 前端零基础入门:页面结构层HTML(2)

    达达前端

扫码关注云+社区

领取腾讯云代金券