当前位置: 首页 > article >正文

Upload-labs靶场Pass-20

Upload-labs靶场Pass-20

审计源码

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

这段代码的功能是实现一个基本的文件上传功能,包括对文件类型的限制和上传路径的验证。以下是详细分析:

功能流程分析

  1. 初始化变量

    • $is_upload 用于标记上传是否成功,初始值为 false
    • $msg 用于存储反馈信息,初始值为 null
  2. 检测表单提交

    • 使用 if (isset($_POST['submit'])) 检查表单是否提交(假设表单通过 POST 提交,并包含 submit 键)。
  3. 上传路径检查

    • file_exists(UPLOAD_PATH) 检查目标上传路径是否存在。
    • 如果不存在,设置 $msg 提示用户该目录未找到,需要手动创建。
  4. 文件类型过滤

    • 定义了一个 $deny_ext 数组,列出了禁止上传的文件扩展名,这些通常是可执行文件或可能含有恶意代码的文件类型(如 .php.html.jsp 等)。
    • 获取用户输入的文件名 $_POST['save_name'] 并通过 pathinfo() 提取其扩展名,保存在 $file_ext 中。
    • 使用 in_array() 检查该扩展名是否在禁止列表 $deny_ext 中:
      • 如果扩展名在禁止列表中,则设置 $msg 为“禁止保存为该类型文件!”并终止上传流程。
      • 如果文件类型允许,则继续执行上传操作。
  5. 文件上传和保存

    • 如果文件类型允许上传,则使用 move_uploaded_file() 将文件从临时路径 ($_FILES['upload_file']['tmp_name']) 移动到目标目录 (UPLOAD_PATH . '/' . $file_name)。
    • 如果 move_uploaded_file() 成功,则设置 $is_upload = true,表示上传成功。
    • 如果移动失败,设置 $msg 为“上传出错!”以提示上传失败。
  6. 反馈信息

    • 无论是上传成功还是失败,代码会通过 $is_upload$msg 提供上传结果的反馈。

方法1:大写绕过黑名单

从源码分析可以看到后端没有进行大小写转换,黑名单也不够完整
所以直接大小写后缀来绕过
在这里插入图片描述

方法2:点后缀

阅读代码发现缺少了deldot函数 删除文件名最后一个点
在这里插入图片描述

方法3:::$DAATA

这一关黑名单,没有对:: D A T A 进行处理使用 : : DATA 进 行 处 理 使用:: DATA进行处理使用::DATA 进行处理,可以使用::$DATA绕过黑名单

php在window的时候如果文件名+“:: D A T A " 会把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA"之前的文件名

抓包,修改文件名在后面添加::$DATA.上传时候保存的文件名不能用php,可以考虑大小写之类

方法4:空格

审计代码,没有发现去掉空格的函数
上传php文件,抓包
在这里插入图片描述

方法5:. .点空格点

在这里插入图片描述

方法6:%00截断

在这里插入图片描述

方法7:点杠绕过

move_uploaded_file会忽略末尾的/.
在这里插入图片描述

方法诸多,我不一一尝试,


http://www.kler.cn/a/373413.html

相关文章:

  • 恩山论坛任务python脚本
  • 【力扣Hot100】滑动窗口
  • 大数据学习(34)-mapreduce详解
  • vue3 uiapp实现一个数字输入组件, 舒服非数字会默认转成最小数
  • nvm 管理nodejs,安装pnpm后报错,出现:pnpm不是内部或外部命令,也不是可运行的程序或批处理文件。
  • 抢十八游戏
  • mfc | mfc集成opencv,实现摄像头监控、拍照、视频图像处理(亮度、对比度、色调、饱和度)功能
  • android OpenGL ES详解——双缓冲区、默认缓冲区和帧缓冲区
  • BeaverTail恶意软件在针对开发人员的恶意npm包中重新出现!研究人员发现开源人工智能和人工智能模型的漏洞 | 安全周报1031
  • Python学习的自我理解和想法(22)
  • 使用ubuntu On windows安装docker
  • C语言基本概念----字节与对齐
  • 计数问题[NOIP2013]
  • traceroute或tracepath区别
  • SpringCloud笔记
  • 网络自动化02:基于xlsx传入设备信息与所需执行备份配置命令,使用netmiko自动化登录分发
  • Oracle SQL 使用 ROWNUM 分页查询速度太慢的问题及解决方案!
  • apisix高性能网关实现一机一密
  • Java 文件操作详解
  • 双向链表(数据结构与算法)
  • 用for循环实现计算1+1/2!+1/3!+...的前20项之和
  • 初级python代码编程学习----简单的查看当前ip地址的图形化工具
  • Vision-Language Models for Vision Tasks: A Survey阅读笔记
  • linux的用户账号与权限管理
  • Chromium HTML Input 类型password 对应c++
  • Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (二)