upload-labs通关实践
本文发布于354天前,本文最后更新于353 天前,其中的信息可能已经过时,如有错误请留言或评论。

文件上传的知识总结在语雀:毕业实习-Day 7
之前写了一部分,但是没写全,今天继续干


Pass-01

提示

本pass在客户端使用js对不合法图片进行检查!

闯关

直接F12查看页面源代码,然后找到提交表单的位置

然后就可以随意上传了,直接上传一个一句话然后连接即可。

源码解析

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

从上面的代码可以看到它只运行上传jpg png gif后缀的文件,但因为它是前端校验,所以绕过方法有很多,下面是我想到的两种

  1. 直接在前端浏览器把调用这个检验函数的代码删除掉,这样浏览器在提交表单的时候就不会调用这个函数,自然也就绕过了,也就是我上面用的方法
  2. 先将咱们的一句话木马shell.php修改为jpg png gif其中之一的后缀,然后在前端提交,但是使用bp拦截下这个提交的数据包,然后将其中的文件名后缀修改回php即可,这样也可以实现绕过。不过比上面麻烦一点点。

Pass-02

提示

本pass在服务端对数据包的MIME进行检查!

闯关

抓取一下上传流量包,因为检查MIME,所以如下图所示,发送不是图片类型的文件时,MIME不是图片的格式,就会上传失败


所以将其修改为常见的图片格式如image/jpegimage/pngimage/gif后,再次上传即可发现上传成功

并且我们可以在页面中找到返回的存储路径,说明上传成功,直接用冰蝎连接即可

源码解析

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

分析源码可以看到后端检测MIME,只允许image/jpegimage/pngimage/gif类型的文件上传,除此之外没用其他检测,所以我们只需要抓包将上传的数据包的MIME修改为这三种之一即可成功上传。

Pass-03

我靠了,这一关docker拉的镜像有问题,没一个后缀能解析,服了。

提示

本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!

闯关

直接上传发现不成功,禁止上传.asp|.aspx|.php|.jsp后缀文件!


在上传时,后端有时会通过检查后端文件名进行过滤,如果存在疑似恶意文件的后缀名,将会直接重置连接或者对文件进行初始化处理。为了绕过这种情况,我们以php文件为例,假设后端禁止或会初始化所有php文件的上传,我们常通过使用大小与,双写与或利用中间件解析漏洞进行绕过。比如.Php .php2-7 .phps .pht .phtm .phtml .pgif .shtml .htaccess .phar .inc .hphp .ctp .module
这里我把下面的这些后缀都尝试了一遍,按理说应该是有一个可以解析为php正常执行的,我看了网上的通关也是这样,但是我没试出来到底哪个后缀可以解析为php,而且这里会把上传的文件重命名为随机数字字符串,所以也不能上传.htaccess,下面就是我尝试了的后缀
php2 php3 php4 php5 php6 php7 pht phtm phtml


抽象的很,下面是我换成Windows后用小皮搭建的靶场,这里需要在phpstudy的设置 -> 配置文件,找到httpd.conf,然后进行编辑

#AddType application/x-httpd-php .php .phtml
#将上一行的#删除或者直接添加下面这行
AddType application/x-httpd-php .php .phtml .php5 .php3

然后把一句话木马后缀名修改为.phtml .php5 .php3中的一个然后上传连接即可成功。

源码解析

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $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
        $file_ext = trim($file_ext); //收尾去空

        if(!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

看源码这里也只是不允许.asp .aspx .php .jsp这四种文件上传,然后获取到上传文件名后先把文件名末尾的.去掉后,转换为小写并去除::$DATA(这个是windows特性),然后和上面的后缀进行比较。

Pass-04

提示

本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.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后缀文件!
这里的提示禁止上传的这么多后缀,也可以提示上一关有其他可以解析为php的后缀可以上传

闯关

这一关禁用这么多后缀,那就想办法不用这些可执行文件的后缀。通过前面的抓包可以看到服务器用的是apache的中间件,.htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess 文件,可以帮我们实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许 / 阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能,我们用的就是它可以指定将某种文件后缀用什么方式解析
这里在本地创建一个.htaccess,然后进行上传,前提是服务器不重命名你上传的文件,docker拉取的镜像这一关还进行重命名,给我整不会了。
.htaccess文件内容如下,下面这个配置就是让把.p-hp的后缀文件当作类型 application/x-httpd-php 执行 (php 的类型),也就是当作 php 执行

AddType application/x-httpd-php .p-hp


这里虽然无法访问,但是文件上传成功,注意是403报错也是没有权限,但不是404不存在,所以这个配置文件上传成功了,不用担心,直接进行后续操作即可。然后此时.p-hp后缀的文件就会被php解析。


wc了,直接搞不来,整了我快一个小时,不搞了,搞不出来,不知道哪里出问题了,服了

源码解析

docker拉取的镜像这一关还会重命名,有点问题

Pass-05

提示

闯关

源码解析

Pass-06

提示

闯关

源码解析

Pass-07

提示

闯关

源码解析

Pass-08

提示

闯关

源码解析

Pass-09

提示

闯关

源码解析

Pass-10

提示

闯关

源码解析

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇