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

upload-labs靶场通关详解:第20关 /.绕过

一、分析源代码

// 初始化上传状态标记,默认为false,即文件未上传
$is_upload = false;
// 初始化消息变量,用于存储错误信息
$msg = null;// 检查是否通过POST方式提交了表单(点击上传按钮)
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 . '文件夹不存在,请手工创建!';}
}

简单概括就是,用户上传一个文件并指定保存文件的名称,再从保存文件的名称中提取扩展名进行类型验证,通过验证则移动目录。

二、解题思路

这关代码中两个重要的函数是pathinfo()函数和move_uploaded_file()函数。

pathinfo()是PHP内置函数,作用是提取文件的目录名,扩展名,文件名等部分,这一关是提取扩展名,而扩展名是通过提取文件名最后一个点(.)之后的部分。

move_uploaded_file()函数的作用是移动文件路径,在处理过程中,会自动解析并移除相对路径符号(如 /.、/..),将路径转换为绝对路径形式。

再看本关判断流程,pathinfo()函数提取扩展名验证通过后,交给move_uploaded_file()函数转移路径。

假设攻击者将文件名修改为xx.php/.这种形式,pathinfo()函数提取最后一个点(.)之后的部分为空,则绕过了黑名单的验证,转交下一步处理,而move_uploaded_file()函数又会将“/.”当作相对路径移除,最后文件就保存为了xx.php。

另外,这里的代码只有黑名单验证,用大小写,空格,点号也可以绕过上传,参考6-9关。

三、解题步骤

1.上传木马,bp抓包,将保存名称改为“xx.php/.”。

2.文件成功绕过上传,被保存为xx.php。

http://www.lryc.cn/news/584390.html

相关文章:

  • 【计算机网络】HTTP1.0 HTTP1.1 HTTP2.0 QUIC HTTP3 究极总结
  • QT解析文本框数据——概述
  • 中国成人急性髓系白血病(非M3)诊疗指南(2021年版)
  • upload-labs靶场通关详解:第21关 数组绕过
  • Mysql分片:一致性哈希算法
  • 【Python】基于Python提取图片验证码
  • QTextCodec的功能及其在Qt5及Qt6中的演变
  • Qt Creator控件及其用途详细总结
  • Spring for Apache Pulsar->Reactive Support->Message Production
  • 生产环境CI/CD流水线构建与优化实践指南
  • 访问Windows服务器备份SQL SERVER数据库
  • 网安-解决pikachu-rce乱码问题
  • NFS文件存储及部署论坛(小白的“升级打怪”成长之路)
  • G5打卡——Pix2Pix算法
  • 前缀和|差分
  • 【部分省份已考真题】备战2025全国青少年信息素养大赛-算法创意实践挑战赛c++省赛/复赛真题——被污染的药剂
  • Expected Sarsa 算法的数学原理
  • Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
  • Go语言包管理完全指南:从基础到最佳实践
  • UECC-UE连接协调的运作方式
  • 【会员专享数据】2013-2024年我国省市县三级逐月SO₂数值数据(Shp/Excel格式)
  • 2025年最新Python+Playwright自动化测试- 隐藏元素定位与操作
  • DSP的基础平台搭建
  • 24、企业设备清单管理(Equipment)详解:从分类到管理,设备全生命周期把控
  • 虚拟环境已安装该包,且已激活,但报错
  • 介绍 cnpm exec electron-packager
  • Apache http 强制 https
  • Qt使用脚本实现GUI扩展技术详解
  • Android View 绘制流程 优化 (Bitmap 复用+内容变化检测+防抖调度策略)
  • Canny边缘检测(cv2.Canny())