首页 > 其他分享 >upload-labs靶场全题解

upload-labs靶场全题解

时间:2024-07-12 10:42:09浏览次数:14  
标签:文件 后缀 题解 upload labs Pass 绕过 php 上传

image

靶场搭建

  对php和apache版本有严格要求,建议使用phpstudy2018 并且使用设置php版本为5.2.17,这个靶场比较老了,如果要复现的话,必要严格按照要求来使用,博主使用最新版的phpstudy在某些靶场上未能成功复现,所以浪费了很多时间。。。。。

  Upload-Labs 环境要求
操作系统:windows、Linux
php版本:推荐5.2.17(其它版本可能会导致部分Pass无法突破)
php组件:php_gd2,php_exif(部分Pass需要开启这两个扩展)
apache:以moudel方式连接
项目地址:https://github.com/c0ny1/upload-labs

  强烈建议使用phpstudy2018 ,php版本为5.2.17来搭建靶场:

image

Pass-01 前端js绕过

  前端js检测,需要上传白名单后缀文件

image

  方法一:

  先修改webshell文件为可上传的白名单,再抓包修改后缀

  将文件后缀修改为php:

image

  上传成功:

image

  访问文件地址:

image

  方法二:

  在浏览器设置中禁用js即可

  ‍

Pass-02 MIME绕过

  上传一句话木马,提示文件类型不正确

image

  根据源代码我们可以发现,这一关是常见验证中的文件类型验证,也就是验证MIME信息

2509712-20211105104531846-1105429714

  修改Content-Type字段的值:

image

  成功上传访问:

image

Pass-03 ::$DATA绕过

  上传一个php文件提示,不允许上传某些后缀文件,可知这关是黑名单绕过:

image

  方法一:

  可以尝试上传可解析的不同后缀的php文件,例如php2 php3 php4 php5 phtml

  注意:如果想要解析这类php文件,在配置文件中设置一些内容,存在一定限制,不然可能上传过去,服务器并不能解析,这与php版本和apache版本也有一定关系

  需要配置,例如:

image

  ‍

  方法二:双写 ::$DATA

  在window的时候如果文件名+"::$DATA​"会把::$DATA​之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA​之前的文件名,他的目的就是不检查后缀名
例如:"phpinfo.php::$DATA​"Windows会自动去掉末尾的::$DATA​变成"phpinfo.php​"

  ‍

  ::$D::$DATAATA 双写

image

  冰蝎连接:

image

Pass-04 .htaccess文件绕过

  未对.htaccess文件进行限制

image

  ‍

  ‍

  .htaccess 文件(或者“分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法。它里面可以存放Apache服务器配置相关的指令。

  先上传.htaccess文件,内容如下:
.htaccess

<FilesMatch "as.png">
setHandler application/x-httpd-php
</FilesMatch>

  再上传一个as.png文件,文件内容就填phpinfo即可,上传之后成功解析访问:

image

  ‍

Pass-05 构造后缀

  查看源码:

image

  这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .​说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php.​ 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功。如下图:

  构造后缀.php. .中间是一个空格,即达到了绕过黑名单,又经过检查使得脚本木马可以解析

image

image

  注意:例如这种5.php. ​文件,后面有一个点,系统会自动去掉这个点,所以文件上传过去就变成了5.php​,在验证过程中恰好因为最后的点而绕过。

  ‍

  ‍

  ‍

Pass-06 大写后缀绕过

  查看源码:发现没有强制将大写转换为小写

image

  再根据提示,不要构造出现黑名单中的后缀名,可以构造文件:6.PHP

image

image

  成功上传:

image

  访问:

image

  ‍

Pass-07 构造后缀

  查看源码提示:相比于之前没有对首位去空

image

  构造文件名:phpinfo.php ​ ,注意在最后有一个空格

image

  访问如下:

image

Pass-08 后缀加点绕过

  查看源码,发现没有删除文件末尾的点

image

  构造文件名:8.php.

image

  成功上传访问:

image

Pass-09 ::$DATA绕过

  根据源码,发现没有对::$DATA​过滤

image

  ‍

  构造文件名为:phpinfo.php::$DATA​ ,成功上传:

image

  访问:

image

Pass-10 与第五关一样

  第十关和第五关一样,第五关怎么玩,第十关就怎么玩。

image

image

  ‍

  ‍

  ‍

  ‍

Pass-11 双写后缀

  有些网站代码中,会将文件后缀符合黑名单列表的字符串替换为空。比如上传“index.php”变为“index”。

image

  查看源码:

image

  ‍

  第十一关也是黑名单的绕过,他的意思是如果你上传了上面规定的文件,他就会把你的后缀名去掉,比如你上传了11.php,那么他就会把你的php过滤掉。文件没有了后缀名,自然也就无法解析了。但是他是一次过滤,也就是说我们写两个php就可以了

  抓包双写后缀绕过

11.pphphp

image

  上传成功,成功访问:

image

  ‍

黑名单绕过总结

  这些全部为黑名单绕过,而且只是验证一次,所以这些关卡全部可以用一个思路解出来,那就是.php. .​ 都是可以这样的,但是这就违背了创建靶场者的心思,靶场也就失去了意义,发挥不出靶场真正的作用。大家知道有这么一回事就可以了。所以大家还是按照本篇老老实实打一遍,通关不是目的,让知识得到巩固才是目的。

Pass-12 %00截断

  第十二关我们看代码,可以得知是一个白名单,只允许上传'jpg','png','gif'​格式的文件。但是上传路径是可以控制的,可以使用%00​进行截断。%00​只能用于php版本低于5.3​的。这里我们需要把phpstudy切换一下版本,把magic_quotes_gpc​关闭,以phpstudy为例。其他选项菜单---php扩展及设置---参数开关设置---把magic_quotes_gpc​关闭。

image

image

image

  成功上传:

image

  访问文件地址:

image

  注意:为什么修改path才可以?

  因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。那么,攻击者修改了path以后的拼接结果为:uploads/aaa.php%00/20190818.jpg
移动文件的时候会将文件保存为:uploads/aaa.php从而达到Getshell效果。

  ‍

  ‍

  ‍

Pass-13 00截断

  第十三关和第十二关是差不多的,只不过是接受值变成了post,她两的差别呢就是get会自行解码,post不会自行解码,我们需要对%00进行编码,选中%00右键,按下图操作来

  方法一:

  抓包后在test13.php​后加一个空格

image

  16进制查看修改,将空格20​改为00​(70后边)

image

  已经成功上传了

image

  访问如下:

image

  方法二:

image

  已经成功上传了,%00因为编码而显示不出

image

  访问如下:

image

Pass-14 图片马

  第十四关是用图片+php代码,组成一个图片码进行上传,当然要想解析出来这个图片,还得有这个包含漏洞。我们看到,他已经说了,网站存在包含漏洞

image

  点击访问:可知这里有一个文件包含漏洞

image

  首先制作一个图片码,可以直接用Notepad直接打开图片后面加一个php代码,但是需要16进制,要不然图片可能出错。

  可以cmd进行生成,命令语句:copy aaa.jpg/b + test.php/a shell.jpg 如图所示,我们在上传这个生成后的图片。

  上传之后访问:

http://192.168.98.134/upload-labs-master/include.php?file=./upload/2420240711225048.jpg

image

  ‍

  ‍

Pass-15 图片马

  ‍

  第十五关我们要了解一个函数

image

  我们来看这个 getimagesize函数,这个函数的意思是:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的

  所以这关还是用和14关一样的方法,生成带有php代码的图片上传,配合包含漏洞拿下此关。

  使用16进制编辑器打开一个图片,在图片后面插入WebShell 或者cmd下执行(必须在当前目录):

copy aaa.jpg/b + test.php/a shell.jpg

image

image

  访问:

image

  ‍

Pass-16 伪造图片头

  这一关需要开启php_exif ,不开这个的话,这关做不了
1996712-20210603183538535-1833519791
看源码
1996712-20210603182643649-665051136
这里使用exif_imagetype​函数来检查是否是图片,这里说一下exif_imagetype​,它是读取一个图像的第一个字节并检查其签名。所以也是可以通过伪造图片头来进行绕过的。这里同样伪造gif的图片头,来进行上传,如下

image

  访问:

image

Pass-17 二次渲染

image

  第十七关主要是把二次渲染绕过
imagecreatefromjpeg()​函数
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
进行通关
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了。
我们把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。
使用HxD Hex Editor进行比较
下载地址:https://mh-nexus.de/en/hxd
然后比较:

  将上传之后的图片下载与源图片比较:

image

  找到未修改的部分,插入webshell代码:

image

  成功上传访问:

image

image

Pass-18 条件竞争

  看源码
1996712-20210603200355629-1772103892
这里的代码逻辑是先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除。这样就存在一个安全问题,那就是我同时上传多个相同文件,在它删除之前访问就可以了。也就是条件竞争问题。可以借助burp的暴力破解模块。

Pass-19 条件竞争

  这关是检查了后缀名,然后上传,然后在进行二次渲染。这时我们只能上传图片马,而且得配合解析漏洞进行通关

  操作和18关的一样,就是访问地址是加上包含漏洞的。

Pass-20 %00​截断

  20关是两种通关方法
第一种
move_uploaded_file()​函数中的img_path​是由post​参数save_name​控制的,可以在save_name​利用%00​截断(注意php版本低于5.3)。如图:

  注意%00​已经编码之后没有显示出去,其实那里是有的:

image

image

  第二种
move_uploaded_file()​有这么一个特性,会忽略掉文件末尾的 /.

  所以我们把他修改为如图所示

image

  成功访问:

image

Pass-21 数组绕过

  查看源码:

image

  根据代码逐步分析,

  • 首先第五行,使用mime验证,可以通过抓包修改
  • 第10行是一个3元表达式,如果save_name的值为空,就取$_FILES['upload_file']['name']​ 的值,否则就是自身
  • end()​函数将 array的内部指针移动到最后一个单元并返回其值
  • reset()​函数将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值
  • count​ 函数返回数组 $file​ 中的元素数量

  所以我们构造数组save_name​来绕过,如下图:

  ​save_name[0]=21.php​, save_name[2]=jpg​,$ext=jpg​过白名单,reset($file)=21.php
$file[1]=null​,这样就成功上传pass21.php.​(windows多个点不影响)
抓包测试。上传成功。

image

  访问:

image

标签:文件,后缀,题解,upload,labs,Pass,绕过,php,上传
From: https://www.cnblogs.com/itchen-2002/p/18297809/uploadlabs-shooting-range-full-question-sol

相关文章

  • 2024SCAU暑假集训_1题解(部分,待补充)
    最近我们开始了暑假集训现在我来补一下第一场集训的题解题目题号来源是否写了题解A黑暗爆炸4771否但是放了大佬的链接指路B黑暗爆炸3399已写C洛谷P3231D洛谷P2120ECodeForces197AF洛谷P1732GBZOJ5296H黑暗爆炸1406......
  • 多线程中自定义线程池与shiro导致的权限错乱问题解决
    importorg.apache.shiro.SecurityUtils;importorg.apache.shiro.subject.Subject;importorg.apache.shiro.util.ThreadContext;importjava.util.concurrent.*;publicclassShiroAwareThreadPoolExecutorextendsThreadPoolExecutor{publicShiroAwareThread......
  • Linux创建组和用户groupadd:无法锁定/etc/group问题解决
    问题原因:相关关键文件进行了锁定,不能被访问和修改1.确认是否是使用root用户执行,2.确定文件权限没问题使用lsattr命令查看隐藏权限设定情况[abc@localhost~]$lsattr/etc/group----------------/etc/group[abc@localhost~]$lsattr/etc/passwd----------------/etc/......
  • Codeforces Round #956 (Div. 2)题解
    A.ArrayDivisibility需要让满足$k\midj$的所有\(a_j\)的和整除k,只需要让每个\(a_j\)整除k就可以了,可以让\(a_j=j\)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'typedefpair<int,int>pii;typedefunsignedlonglo......
  • CF1051F题解
    TheShortestStatement算法:树链剖分,最小生成树,最短路。先讲一下题意:有一个\(n\)点\(m\)边的无向连通图,\(q\)次询问,每次询问\(a\)到\(b\)的最短路长度。数据范围\(1\len,m\le10^5,m-n\le20\)。首先发现给了一个很奇怪的限制:\(m-n\le20\),考虑他有什么用。我们在......
  • 【完结】LeetCode 热题 HOT 100分类+题解+代码详尽指南
    目录LeetCode热题100前言LeetcodeTop100题目和答案-哈希LeetcodeTop100题目和答案-双指针篇LeetcodeTop100题目和答案-滑动窗口篇LeetcodeTop100题目和答案-子串篇LeetcodeTop100题目和答案-普通数组篇LeetcodeTop100题目和答案-矩阵篇LeetcodeTop100题目和......
  • CentOS 乱码问题解决
    首先要区别3个概:编码集、字符集、字体是完全不同的东西,我们要解决的是字符集问题。当一个系统初始化完毕后,会生成一个/usr/lib/locale/locale-archive文件,这个是字符集二进制文件,是系统不同语言运行的核心,通过命令locale-a可以看到当前文件中支持的语言locale命令可以......
  • [题解] [ABC221H] Count Multiset - DP
    [ABC221H]CountMultiset题面翻译输入两个正整数\(N,M\),并存在一个集合,问你一个长度为\(k\)的合法集合存在多少个?你需要回答\(k\)的值为\(1\)到\(N\)的每种情况。一个合法的集合定义指长度为\(k\),元素和为\(N\),每一个数字在集合中出现的次数都小于等于\(M\)的集......
  • CF506D题解
    Mr.Kitayuta'sColorfulGraph算法:根号分治。题目大意先说一下:给一个\(n\)点\(m\)边的无向图,边有颜色。\(q\)组询问,每次给出\(u,v\),求有多少种颜色\(c\),使得存在一条\(u\)到\(v\)的路径,这个路径中每条边的颜色都为\(c\)。先考虑一个朴素的暴力,暴力对每个颜色加边,......
  • UVA12683 Odd and Even Zeroes 题解
    题目简述定义\(\operatorname{count}(num)\)表示\(num\)末尾\(0\)的个数。给出\(n\)(\(n\leq10^{18}\)),求\(\sum\limits_{i=0}^{n}[2\mid\operatorname{count}(i!)]\)。题目分析对于一个\(i\),以下记成\(n\)。\(n!\)末尾\(0\)的个数取决于\(1\simn\)......