upload靶场第一-二十一关

目录

upload第一关(js前端验证)

upload第二关(content-type验证)

upload第三关

upload靶场第四关

upload第五关

upload第六关(大小写绕过)

upload靶场第七关(空格绕过)

upload第八关(点号绕过)

upload第九关(::$DATA绕过)

upload第十关

upload第十一关(双写绕过)

upload第十二关(get%00截断)

upload第十三关(post00截断)

upload第十四关(图片马绕过)

 upload第十五关(getimagesize图片马)

upload第十六关(exif_imagetype图片马)

upload第十七关(二次渲染绕过)

upload第十八关(条件竞争一)

upload第十九关(条件竞争二)

 upload第二十关

upload第二十一关


upload第一关(js前端验证)

这题的话打开f12点击这个,然后把鼠标放到上传去那么查看一下

 

发现一个checkFile()函数

 在查看器那里搜一下chckfile函数是用来干嘛的,发现它用来校验上传的文件类型。我们可以把第一个checkfile()删了或者改成ture,然后就可以上传一句话木马了

upload第二关(content-type验证)

查看源码发现会对发送文件的content-type进行验证

 我们可以先上传一个php文件,然后用bp抓包,修改content-type为image/jpeg,就可以上传一句话木马了。

upload第三关

看一下源码,发现不能上传php文件,但没有过滤完全,可以用php3,php5,phtml绕过

因为靶场是由phpstudy搭建的,要进去修改一下配置文件,将配置中httpd.conf中的

#AddType application/x-httpd-php .php .phtml
为AddType application/x-httpd-php .php .phtml.php3.php5
记得去掉#号。

修改完成以后重启phpstudy环境。然后上传一个一句话木马php3或php5文件,用蚁剑连接即可。

关于AddType命令的作用解释
 
AddType 指令 作用:在给定的文件扩展名与特定的内容类型之间建立映射 语法:AddType MIME-type extension
[extension] …
AddType指令在给定的文件扩展名与特定的内容类型之间建立映射关系。MIME-type指明了包含extension扩展名的文件的媒体类型。
AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系。
 

upload靶场第四关

利用upload靶场第四关做apache 2.x解析漏洞复现(实际的做法是用.htaccess,参考我的另一篇博客)48条消息) upload-labs.master靶场漏洞复现.htaccess文件解析漏洞_寄给十一的信的博客-CSDN博客   

环境配置:

首先在phpstudy打开配置文件httpd-conf

打开文件找到下面这个地方,添加箭头所指的那句代码,环境就配置好了

apache 2.x解析漏洞原理:

操作:

先在记事本写下

<?php phpinfo();?>

 然后将文件重命名改成11.php.shtmlljjb(随便打,只要不认识就行)

在upload靶场中上传,复制图片链接,打开就看到执行成功了

upload第五关

这个第五关的源码不知道为什么和第十关的一样,既然一样,直接看第十关的解法吧

upload第六关(大小写绕过)

没有ban大小写,可以采用大小写绕过

 在记事本写下payload,然后将后缀改为.PHp

<?php phpinfo();?>

在靶场中上传成功

复制图片链接打开

如果想看更多的apache解析漏洞,可以参考这篇博客apache httpd解析漏洞复现 - GiDunPar - 博客园

upload靶场第七关(空格绕过)

这题对比前面的可以发现,这里没有用trim过滤空格,可以用空格绕过。

上传一个1.php文件,用bp抓包修改成1.php  (注意这里有空格) 

防包之后去复制图片地址,然后用蚁剑连接。、

upload第八关(点号绕过)

看到源码中没过滤文件末尾的点,绕过思路就有了,利用windows的特性,会自动去掉后缀名后面的点。

先写个php文件,我这里写了<?php phpinfo();?>用来测试 

上传这个文件然后用bp抓包,修改后缀为"1.php..."

 查看回响得到路径为/upload/1.php

在uplaod靶场url中打开,成功执行。 

upload第九关(::$DATA绕过)

查看源码发现DATA没过滤 ,可以用::$DATA绕过

这道题利用的是Windows下NTFS文件系统的一个特性,即NTFS文件系统的存储数据流的一个属性 a.asp::DATA 时,就是请求 a.asp 本身的数据,如果a.asp 还包含了其他的数据流,比如 a.asp:lake2.asp,请求 a.asp:lake2.asp::$DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。
简单讲就是在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。

写个php文件测试

上传用bp抓包改后缀

上传成功查看路径

 在url打开看看结果,执行成功。

upload第十关

看到源码删除.,大小写,::$DATA,去空都过滤了。

对此我们可以理一下源码执行的逻辑:

   先删除文件末尾的点,然后从点开始截取字符,转换为小写,删去::$DATA,首尾去空。

我们可以尝试1.php. .绕过,过滤之后会变成1.php.

先上传1.php,然后在bp抓包改文件后缀,

得到上传路径,在url打开

 

upload第十一关(双写绕过)

查看源码,这次的过滤是检测上传文件的后缀是否能在$deny_ext中找到,如果有,则替换为空。

 对于这种可以采用双写绕过的方法。上传一个1.pphphp文件,经过过滤后变成1.php。

上传成功后复制路径在url打开,成功执行。

upload第十二关(get%00截断)

查看源码,发现$img_path中路径由表单中的路径与文件名组合而成,而$_GET['save_path']存在问题,可由用户自定义上传路径。

所以这里可以采取%00截断的方式。

截断的条件:(1)网上说是php版本小于5.3.4才能成功,我试了几个比5.3.4高的版本,在bp上传的时候都显示上传失败,同时我也试了5.3.29带nts的也测试失败了(暂时不懂是什么原因),这题是在5.2.17不带nts版本下测试的。       

                     (2)php的magic_quotes_gpc为OFF状态

%00截断的基本原理:在url里面%00表示ascll码中的0,而0作为特殊字符保留,表示字符串结束,所以当出现%00时就会认为读取已经结束,而忽略后面拼接的图片或者文件

更具体的原理可以看看这篇博客,弄懂这篇博客,这题和下一题根本不是问题

https://blog.csdn.net/zpy1998zpy/article/details/80545408

上传一张1.jpg,在bp中将路径改为save_path=../upload/1.php%00再发送,经系统拼接会变成save_path=../upload/1.php%001.jpg。而%00会将1.jpg截断,1.jpg里面的内容由1.php继承(例如1.jpg里面的内容是<?php phpinfo();?>,截断之后1.php里面会有这个内容)

将上传地址在url打开可以看到执行成功

upload第十三关(post00截断)

 看源码发现和上一题的差别在于$_GET['save_path']和$_POST['save_path'],这题我们不能用%00截断了,因为post方法不会将%00解码,即无法造成截断,不过可以利用0X00截断。

原理:系统在对文件名的读取时,如果遇到0X00,就会认为读取已经结束,从而造成截断。

具体操作:(1)先上传一张1.jpg图片,用bp抓包。

                  (2)在/upload/后面加上1.php+(加+的原因是为了方便后续的操作,可以换成一个你熟悉它十六进制的字符)

                 (3)在Hex找到刚刚的标记字符+的十六进制2b

 将2b改成00进行截断,1.php可以继承1.jpg里面的内容(%00截断的本质是0X00截断,不明白的可以看上面的那篇博客)

找到上传的路径在url打开,发现执行成功,我的1.jpg写的是<?php phpinfo();?>,1.php继承后执行就会显示这个了。

upload第十四关(图片马绕过)

看看源码的主要部分,这题会检查文件头的前两个字节,判断文件类型。可以利用图片马加文件上传 

图片马的上传绕过:

一、在记事本写下一句话木马,后缀改成.gif,我这里记事本写下的是<?php phpinfo();?>

然后在hxd打开,将原来的东西先复制下来,再删除掉

加上gif的文件头

这里可以只写两个字节。

二、直接在记事本写下一句话木马,然后把后缀改成1.gif,用bp抓包修改,利用GIF89a文件头欺骗。

发送之后得到上传路径

然后利用第十四关中的文件上传漏洞验证是否成功

 

 最后也是成功执行了。

 

 upload第十五关(getimagesize图片马)

这题用上一题的方法也可以。

upload第十六关(exif_imagetype图片马)

查看源码发现要打开php_exif模块。

在这里插入图片描述

这里的话还是跟十四关的做法一样的,差别就在于其它两关的函数不同。

exif_imagetype():

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

upload第十七关(二次渲染绕过)

首先还是先审源码,这题判断文件的后缀,content-type,以及利用imagecreatefromjpeg函数进行二次渲染(后端重写文件内容)

重点是imagecreatefromjpeg函数的二次渲染

imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像

做这题的思路:先上传一个正常的gif图片,下载回显后的图片,在hxd中打开,对比两张图片没有改变的位置,在该位置插入一句话木马,利用该题自带的文件包含漏洞执行。

上传前的图片

下载打开回显的图片,对比看到箭头所指的部分没有改变。

制作我们的图片马

在靶场中上传,复制图片路径 

 

用该题自带的文件包含漏洞测试

 最后送给你们一句话,写完博客一定要保存!!!!

upload第十八关(条件竞争一)

这里我们先看一下源码,显然可以看到该源码的逻辑是先上传文件并保存,然后再判断文件类型,如果是被允许的文件类型则保存,否则删除。

这里的大致思路就出来了,我们知道代码执行是需要时间的,如果我们一直上传一个会生成后门22.php文件,并在系统删除该文件前访问成功,是不是就可以让22.php生成一个1.php文件作为我们的后门。

所以22.php文件里面的代码可以这么写,访问成功该文件后会生成一个含有一句话木马的1.php文件,再通过蚁剑连接就好了。

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

具体操作步骤如下:

上传22.php文件,用bp拦截,发送到intruder并清除$

然后在有效载荷(payloads)这里选择没有负载(Null payloads),同时在有效载荷选择无限期重复

 在选项这里把线程调大一些,改成20也可以。

一直上传文件的操作布置好了,为了让22.php在删除前执行,我们还需要写一个脚本去访问它。

import requests
url = "http://127.0.0.1/uploads/upload/22.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

当输出ok以后说明22.php访问成功,已经生成含有一句话木马的1.php文件。

最后一步就是用蚁剑连接了

 

upload第十九关(条件竞争二)

这关要改一下配置,好像是作者的一个小失误,这关上传图片的路径不是在upload文件夹下的,所以我们需要着找到19关的代码修改一下。

查看源码发现这关检查文件后缀,检查文件大小以及文件是否存在,最后重命名。

用条件竞争的方法:上传图片马,在系统没有将图片马重命名之前,用文件包含漏洞将其解析,从而生成一个含有一句话木马的1.php文件。步骤和18关的差不多,只是脚本需要改一改。

import requests
url = "http://127.0.0.1/uploads/include.php?file=upload/22.png"
while True:
    html = requests.get(url)
    if ( 'Warning'  not in  str(html.text)):
        print('ok')
        break

 upload第二十关

查看源码,发现文件名可由用户控制,然后检查后缀名是否合法

因为文件名可控,这题利用move_uploaded_file的一个特性,会自动忽略后面的/.

所以我们可以上传一张图片马(我这里写的是<?php phpinfo()?>),把文件保存改为1.php/.

 可以看到上传成功,复制图片链接,在url打开

upload第二十一关

查看源码

大致的逻辑是

检查上传路径是否存在,检查content_type是否合法

判断post方法传递的$file是否为空

判断$file不是数组,则用explode将%$file在.处分割成数组

判断最后的一个数组是否在白名单中

将数组中的第一个数组和最后一个数组连接起来

上传文件

补充的知识:

explode(separator,string[,limit]) 函数,把字符串打散成数组。


end(array)函数,输出数组中的当前元素和最后一个元素的值。
reset(array)函数,把数组的内部指针指向第一个元素,并返回这个元素的值
count(array)函数,计算数组中的单元数目,或对象中的属性个数

首先准备一张图片马或者php一句话木马,上传后用bp拦截

我们可以尝试这样绕过:
 
1、先修改content_type构造为白名单中的值

2、修改post的参数为数组类型,save_name[0]为"upload-20.php", save_name[2]为"png|jpg|gif"
   
因为上面的代码会先判断最后一个数组元素是否在白名单中,我们索引[2]为"png|jpg|gif"

正好可以绕过,而后面会将数组第一位和$file[count($file) - 1]进行拼接

因为我们的save_name[1]为空,即$file[1]为空,所以拼接后文件名就会变成upload-20.php

 上传好后放包,复制图片链接,测试成功

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值