upload-labs-master文件上传靶场第七关详解

一.前言

upload-labs-master是文件上传靶场,里面目前总共有19关,github地址https://github.com/c0ny1/upload-labs,今天要说的是这个靶场的第七关的解法

二.正文

先看下第七关长什么样

和其他几关一样,咱们先直接看下源码吧

$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",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES[‘upload_file‘][‘name‘]);
        $file_ext = strrchr($file_name, ‘.‘);
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

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

说一下上面的代码,虽然php不怎么会但是作者已经把改写的注释已经写上了,所以我就照着作者的注释说一下

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");#上面这个就是传说中的黑名单了,只要上传的文件的后缀名在这个里边,都会上传不成功,当然绕过方法也是有的
$file_ext = strrchr($file_name, ‘.‘); #这个需要解释下了,strrchr的作用先说下,strrchr() 函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回 false。与之相对应的是strstr()函数,它查找字符串中首次出现指定字符的位置举个栗子:

<?phpecho strrchr( ‘123456789.xls‘ , ‘.‘ ); //程序从后面开始查找 ‘.‘ 的位置,并返回从 ‘.‘ 开始到字符串结尾的所有字符

程序的输出结果是:.xls

?>

$file_ext = strtolower($file_ext); //转换为小写,比如你后缀写成Php,想用大小写绕过的时候就不行了,这段代码将所有的大写转换成小写

$file_ext = str_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA

$file_ext = trim($file_ext); //首尾去空,将你后缀名里的前后空格都去掉

看看上面的代码都限制了多少吧,大小写,加空格,加字符串,黑名单,好多限制。。。。。

这个时候可以采用一种方法来绕过,因为靶场是搭建在windows上的,所以windows有一个特性,windows系统自动去掉不符合规则符号后面的内容,什么意思呢?举个栗子

比如你新建了一个1.txt文件,然后你将名称改为1.txt.试试,虽然会有下面的警告,但是windows还是会默认去掉后面的.,名字还是变成了1.txt

这个时候我们就可以利用.来绕过限制了,因为strrchr函数会将上传的文件名后缀处理为.php.,当上传到win机器上时又会将后面的.去掉,然后后缀就又会被还原成.php,这样就可以执行了,下面演示一下

首先上传1.php文件并抓包,在burp修改文件后缀名为.php.

拿c刀连接下试试

连接成功,我们上传的webshell已经成功连接上了

原文地址:https://www.cnblogs.com/Id3al/p/9838584.html

时间: 2024-10-01 15:28:19

upload-labs-master文件上传靶场第七关详解的相关文章

iview Upload组件多文件上传,以及vue文件下载

iview Upload组件多文件上传 系统经常遇到文件上传的问题,iview提供了Upload组建,能够很好的实现文件上传,当然一次上传多个文件也是允许的. 思路:创建一个数组 把需要上传的文件 push到这个数组里面 1.引用组件 2.手动上传,根据官方文档 设置:before-upload ="handleUpload"等于false (1).:before-upload 是 iview Upload 上传组件的一个属性 设置返回值为 false 可以阻止默认上传方式(自动上传模

Asp.net core 学习笔记 ( upload/download files 文件上传与下载 )

2017-09-25 refer : https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads https://www.codeproject.com/Articles/1203408/Upload-Download-Files-in-ASP-NET-Core 这里只说说小文件上传. 先看看前端 js 代码 <input id="inputFile" type="file" /&g

php.ini修改php上传文件大小限制的方法详解

打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值.默认为2Mpost_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值.默认为8M一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,

php上传文件大小限制的方法详解

打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值.默认为2Mpost_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值.默认为8M一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,

element-ui upload组件多文件上传

之前有一篇写的如何同时传递form表单及upload组件文件,如果有多个upload文件该如何传递呢 上代码 html 1 <el-form-item label="实验信息" prop="expvmInstruction"> 2 <el-upload 3 class="upload-demo" 4 drag 5 ref="uploadhtml" 6 :action="upload_url"

上传本地代码到gitHub过程详解

1.注册github账号. 2.创建个人的github仓库,如图, 或者也可以进入个人中心去创建, 还可以直接点击右上角的“”+“”添加, 3.创建自己的Repository,如图: 4.新建完成后会进入类似于下面的页面,复制创建仓库的地址,如图: 5.打开本地git命令窗口或者cmd命令窗口,cd到你存放项目的根目录下,并执行一下命令行: git clone 仓库地址(上面一步复制出来的地址),如下图,是我复制我创建的仓库地址: 6.打开项目文件夹,会发现刚才在github里面新建的文件都存在

phpcms后台批量上传添加图片文章方法详解(一)

注:以下所有代码中,红色部分为增加部分. 一.在后台增加批量添加按钮 打开“phpcms\modules\content\templates\content_list.tpl.php”文件 搜索“$category['catname']));?> ”在这句话的后天的添加: a  echo="" href=":;" m="content&c=content&a=addall&menuid=&catid=&pc_h

Git学习系列之如何正确且高效地将本地项目上传到Github(图文详解)

不多说,直接上干货! 首先你需要一个Github账号,所以还没有的话先去注册吧! https://github.com/ 见 Git的安装 见 Git学习系列之Windows上安装Git详细步骤(图文详解) 1.进入Github首页,点击New repository新建一个项目 点击Clone or dowload会出现一个地址,copy这个地址备用. 创建 ssh-keygen -t rsa -C "***@***.com" 欢迎大家,加入我的微信公众号:大数据躺过的坑       

一个简单的blog系统(三) 增加文件上传功能

1. 一个完整的博客怎么能缺少图片呢,目前上传文件的方法有三种: (1)使用Express自带的文件上传功能,不涉及数据库. (2)使用Formidable外部模块,不涉及数据库. (3)上传到MongoDB,涉及到数据库. 可以看出,第一种方式最简单,Express通过bodyParser()解析请求体,因此我们可以使用bodyParser()来实现文件的上传功能. 2.实现过程 2.1 首先打开header.ejs,在<li><a href="/post" tit