文件上传漏洞靶场upload-labs学习(pass11-pass15)

2023-11-14

0x00 Pass11(str_ireplace复写绕过)

Pass11主要考察str_ireplace函数

$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","ini");

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

在PHP中

str_replace() 函数
定义:使用一个字符串替换字符串中的另一些字符,对大小写敏感的搜索
语法:str_replace(find,replace,string,count)

str_ireplace() 函数
定义:使用一个字符串替换字符串中的另一些字符,对大小写不敏感的搜索
语法:str_ireplace(find,replace,string,count)

可见无法通过后缀名的大小写绕过,但对于replace函数中直接替换为空的场景通常可以用复写来绕过,例如本关中的test1.pphphp即可在replace后变成test1.php

在这里插入图片描述

0x01 Pass12(GET方式%00截断)

本题考查%00截断,相当于复现CVE-2006-7243,所以需将php版本设置为PHP 5.3.4以下, 并关闭magic_quotes_gpc选项。
具体代码为:

$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类型文件!";
    }
}

可见保存的路径也可以由用户所控制,GET类型的传参。因此在保存路径中修改为:

save_path=../upload/test.php%00

再上传一个正常的jpg图片即可。

在这里插入图片描述这时由于受空字符%00的影响,后面所有的内容均被截断。
最终上传test.php文件。

在这里插入图片描述

0x02 Pass13(POST方式%00截断)

上一关中看到save_path变量是通过GET形式传参接受的,因此在url中直接使用%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类型文件!";
    }
}

而在13关中,$_POST['save_path']以POST形式传参时,直接使用%00无法截断,因为POST的数据不会被直接解码,需要手动使用burp中的URL-decode解码。

在这里插入图片描述
解码后就变为了不可见字符,绕过POST形式的00截断。

在这里插入图片描述

0x03 Pass14(文件头截取判断)

可以看到题目的要求为:

1.保证上传后的图片马中仍然包含完整的一句话或webshell代码。
2.使用文件包含漏洞能运行图片马中的恶意代码。
3.图片马要.jpg,.png,.gif三种后缀都上传成功才算过关!

代码如下:

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_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

可见每次上传的文件都会被读取前两个字节来判断文件类型,这里判断的也就是文件头。
这里把三种文件类型的文件头加上:

PNG文件:hex格式8950,取值输出为13780

在这里插入图片描述
在这里插入图片描述

JPG文件:hex格式FFD8,取值输出为255216。

在这里插入图片描述
在这里插入图片描述

GIF文件:GIF89a,当文件第一行为GIF头时,取值输出为7173。

在这里插入图片描述
在burp中,GIF文件我们只需要在要发送的数据包前面加上文件头即可。
而png和jpg文件受不可见字符的影响,建议以copy /b 1.png+test.php upload.png的命令制作图片木马。
打开后如图所示:
在这里插入图片描述

上传成功后使用题目中给出的链接测试文件包含是否可以执行图片木马。
在这里插入图片描述

0x04 Pass15(getimagesize函数绕过)

判断是否为图片的代码为:

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

使用 $info = getimagesize($filename);和 $ext = image_type_to_extension($info[2]);取文件后缀名。
在php中getimagesize会获取7个元素的值,分别为:

索引 0 给出的是图像宽度的像素值
索引 1 给出的是图像高度的像素值
索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的<image>标签
索引 bits 给出的是图像的每种颜色的位数,二进制格式
索引 channels 给出的是图像的通道值,RGB 图像默认是 3
索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header(“Content-type: image/jpeg”);

上传一张示例图片返回结果为:
在这里插入图片描述可以看到info[2]的值为2,也就是JPG,与返回的相同。
在本关中,使用刚刚copy /b 1.png+test.php upload.png生成的图片马即可绕过。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件上传漏洞靶场upload-labs学习(pass11-pass15) 的相关文章

随机推荐

  • Goldengate 12.2新特性-自描述的队列文件

    OGG12 2中最大的变化之一就是队列文件是自描述的 意思是不再担心以前版本中 表结构异构的情况 也不再需要defgen生成定义文件 以及不再使用assumeTargetDefs或SourceDefs参数 许多手工处理的步骤不再需要了 即使
  • 【C/C++】三目运算符的详细分析

    前言 C C 三目运算符是一种条件运算符 也被称为 三元运算符 或 条件运算符 它的语法结构为 condition true expression false expression 表示如果 condition 为真 则执行 true ex
  • 2023华为杯数学建模研赛A题B题C题D题E题F题思路代码成品分享

    2022华为杯将于9 22开赛 思路贴将于早上发布 粉丝可见 国一F奖3年数学建模经验团队 交流裙 735249423 下文是2022年研赛E的思路示例 E题思路 问题1 从机理分析的角度 建立不同放牧策略 放牧方式和放牧强度 对锡林郭勒草
  • .npmrc的作用

    npmrc 文件是用于配置 npm Node js 包管理器 行为的配置文件 通过在项目根目录下创建或编辑 npmrc 文件 你可以自定义 npm 的一些行为和设置 以满足你的项目需求 这个文件通常包含一些键值对 每一对都对应着一个配置项
  • 非中心卡方分布

    非中心卡方分布 非中心卡方分布是卡方分布的一般化形式 如果 是 个独立的正态分布的随机变量均值为 方差为 表示为 那么随机变量 为非中心卡方分布 非中心卡方分布涉及两个参数 表示自由度 即 的数目 是和随机变量 相关的参数 由以上参数所定义
  • spring框架基础篇一 ——Ioc控制反转,DI依赖注入

    因为spring框架设计内容比较多 因此博主分成三篇讲解spring框架 spring基础篇一 Ioc控制反转 DI依赖注入 整合junit spring基础篇二 AOP切面编程 JDBCTemplate spring基础篇三 事务管理 S
  • UiBot无法抓取Google Chrome元素和数据抓取工具无法使用的解决方案

    UiBot RPA抓取 Google Chrome 元素建议使用 Google Chrome 原版浏览器 不建议使用 二次修改的浏览器版本 以确保兼容性最佳 操作流程符合本教程 如果无法抓取 Google Chrome 浏览器元素 或数据抓
  • 校园二手交易小程序

    mysql数据库创建语句 create table t admin id int primary key auto increment comment 主键 username varchar 100 comment 超级管理员账号 pass
  • 从道法术三个层面理解区块链:术

    区块链对当下的大家来说 都还是盲人摸象的阶段 所以经常群里有各种争论 归结起来 都是有的摸到了大腿 有的摸到了耳朵 相互之间就难以说服对方 各自有各自的认知 笔者尝试从道法术这三个层面来解读下区块链 以便让大家有个更全面的了解 也知道自己的
  • Linux设备驱动-procfs

    在Linux中 procfs是进程文件系统 file system 的缩写 包含一个伪文件系统 启动时动态生成的文件系统 可用于内核层和用户层交互信息 这个文件系统通常被挂载到 proc 目录 由于 proc 不是一个真正的文件系统 它也就
  • 排序算法-----插入排序

    目录 前言 插入排序 原理图 代码实现 分析总结 二分法插入排序 代码实现 前言 嗨嗨 米娜桑 今天我们继续学习排序算法中的插入排序 激不激动 兴不兴奋呢 好了废话不多说 下面请看正文 插入排序 插入排序 一般也被称为直接插入排序 对于少量
  • SSHException: Incompatible ssh peer (no acceptable kex algorithm)

    使用公司维护助手 python开发 执行巡检 导入主机信息时 发现无法连接 报错信息如下 2015 12 22 15 41 12 983 15004 ERROR paramiko transport Exception Incompatib
  • vscode 在标签的src引入别名路径_Typescript项目别名(alias)配置清单

    综述 新手写Typescript项目 别名配置是经常出问题的环节 有的人遇到这种问题 如果一时半会儿解决不了 干脆就不用别名了 这显然是不合理的 本文给出一个Typescript项目各种环节的别名配置清单 如果遇到问题 可以对照着检查一下
  • hudi 编译

    编译hudi 下载hudi git clone https github com apache incubator hudi git cd incubator hudi 编译 mvn clean install DskipTests Dsk
  • python-认识(第二段)

    1 条件表达式 关系运算符特点 可以连用 例 a b 10 50 对于 0
  • games103 物理模拟第三节笔记补充

    矩阵求逆直接法 1 LU分解 2 LDLT分解法 3 Cholesky分解 4 QR分解 5 SVD分解 6 Jordan分解 关于LU分解 LU分解的矩阵稀疏性与矩阵A的排列顺序有关 在这个领域 matlab提供了一套较好的解决方案 LU
  • docker学习1-基本概念

    Docker jar包 环境 镜像 镜像存在docker仓库中 随用随取 无需现配环境 docker通过隔离机制 各个镜像之间互不干扰 docker比vm轻量化 每次只需运行镜像即可 镜像占内存小启动快 虚拟机启动慢 占内存较大 docke
  • oracle一个事务的完整流程分析

    author skate time 2010 09 01 在oracle客户端与服务端建立连接的 并把请求提交给oracle服务端以前分析过 参考如下 http blog csdn net wyzxg archive 2010 08 16
  • 夜莺监控V6初探

    目标 客户用产品可能是功能设计好 也可能是因为响应快稳定可靠 例如滴滴用不了用高德 券商app故障受罚 微信凌晨服务崩溃 所以稳定性建设工作价值是保障客户体验 避免资损 社会负面舆论 故障生命周期处理 围绕故障生命周期 在整个故障定位体系
  • 文件上传漏洞靶场upload-labs学习(pass11-pass15)

    Upload Labs关卡 0x00 Pass11 str ireplace复写绕过 0x01 Pass12 GET方式 00截断 0x02 Pass13 POST方式 00截断 0x03 Pass14 文件头截取判断 0x04 Pass1