Upload Labs 是一个基于 PHP 编写的开源靶场项目,专门用于模拟和研究文件上传漏洞。它包含多个关卡,每个关卡都模拟了不同的文件上传漏洞场景,旨在帮助用户全面了解文件上传漏洞的原理、利用方法和防御策略。
参考文章:
全面了解文件上传漏洞, 通关upload-labs靶场! - 亨利其实很坏 - 博客园
upload-labs通关全教程(建议萌新收藏)Web安全-文件上传漏洞超详细解析 - 白小雨 - 博客园
文件上传漏洞之upload-labs靶场通关(20关) - iChet - 博客园
对content的过滤
**<?= ?>与<?php ?>与<script language=”php”> </script>**都可以标识php代码。
当文件内容中不能出现<?,<script language=”php”>也不能起作用,那么还可以将content进行base64编码,然后借助.htaccess文件解码并解析content。如下:
AddType application/x-httpd-php .jt |
PASS-1
只有前端验证,所以我们先选择.jpg
后缀的文件,绕过前端验证,再bp
抓包修改后缀便可绕过检查。
选择文件exp.jpg
其内容如下,bp
抓包修改后缀为.php
发送,上传成功
GIF89A #这里这个不影响 |
F12
在查看器中找到上传文件的相对路径

在蚁剑中连接成功

MIME
验证
添加了MIME
信息验证,一般将Content-Type
选项修改成image/jpeg
、image/png
、image/gif
这三个中的一个即可。
别名替换
添加了黑名单过滤,不允许上传 .asp .aspx .php .jsp
后缀文件,可以通过别名绕过。
asp aspx jsp php
的别名:
asa cer cdx |
wp
bp
抓包,添加别名爆破

根据Response
状态,确定可用别名,成功上传

在Response
中寻找返回的相对路径

.htaccess
查看源码,发现黑名单过滤了几乎所有可用后缀,此时就要用到.htaccess
了,注意.htaccess
是一个文件。
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini"); |
.htaccess
是Apache
服务中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess
文件,可以帮助实现:网页301
重定向,自定义404
错误页面,改变文件拓展名,允许/阻止特定用户或者目录的访问,配置默认文档等。
常用的.htaccess
文件格式如下:
<FilesMatch "exp.jpg"> |
SetHandler application/x-httpd-php
的意思是设置当前目录的所有文件都使用php
解析,那么无论上传什么文件,只要符合php
语言代码规范,就会被当作php
执行。
这一关我本地环境有问题,是在这里通关的。
.user.ini
引发.user.ini
解析漏洞需要以下三个条件:
- 服务器脚本语言为
php
- 服务器使用
CGI/FastCGI
模式 - 上传目录下有可执行的
php
文件
.user.ini
利用:
auto_prepend_file = exp.jpg |
上传该.user.ini
文件,再上传exp.jpg
文件
大小写绕过
源码中没有strtolower()
可以利用大小写绕过,strtolower()
函数将大写字母转为小写字母。
Pass-0708
源码中没有trim()
可以空格绕过,没有deldot()
可以后缀加点绕过。
trim()
函数会去除字符串中的空格deldot()
函数会删除文件名末尾的点
注意必须在windows
环境下,php
版本需为5.3
版本,7.3
版本不行。
如果源码中deldot(),trim()
依次存在用来过滤时,如下图,可以使用.php. .
的方式绕过,经过两次过滤后剩下的为.php.
依然可以绕过黑名单。(在Pass-10
中利用此方法通关)

反正就是分析源码,找到绕过方式,如果使用了两次trim()
可能要多加一个空格。
::$DATA
在Windows
环境下,上传的文件后缀为.php::$DATA
时,服务器上会生成一个后缀为.php
的文件,其内容与后缀为.php::$DATA
的文件的内容一样。
双写绕过
==Pass-11==
bp
改后缀为.pphphp
,过滤掉第一个php
后,成功上传的文件后缀还是.php
;如果改成.phphpp
,过滤掉第一个php
后,剩下的是.hpp
,不可;如果是.phpphp
这样,不是双写,不可。
图片马
第14
关的检查方式是,通过获取上传文件的内容的前两个字节来判断该文件的类型,也就是通过识别文件头判断文件类型。

第15
关则是通过获取getimagesize()
函数的返回结果来检查文件类型,getimagesize()
函数的返回结果中包含文件大小和文件类型。

第16
关是通过exif_imagetype()
函数来识别文件头。
上面三种检查方法其实都差不多,都可以利用下面两种绕过方法绕过:
添加文件头
在文件的首行添加GIF89a
表示为gif
文件,添加PNG
文件头表示为png
文件
使用copy
命令
在cmd
中,执行copy zyt.jpg + exp.php zyt.jpg
命令

通关步骤:
先上传下面文件

获取文件路径后配合文件包含漏洞解析脚本

向file
传参获取webshell

二次渲染
==Pass-17==
本关会先检查文件类型,必须要是不被损坏gif,png,jpg
文件,才能上传成功。
并且imagecreatefromjpeg()
函数会对上传的文件进行二次渲染,保留下来的文件是二次渲染后的文件。
最后还要配合文件包含漏洞,解析脚本。
gif
直接比较渲染前后的两个文件,找到数据没有发生变化的部分,在渲染前文件中的该部分插入webshell
即可。
通关步骤:
上传1.gif

将1.gif
与二次渲染后的文件31494.gif
比较,找到未变化部分,插入webshell

上传修改后的1.gif
,得到二次渲染后的文件32588.gif
,现在这个文件中的webshell
没有再被修改了

配合文件包含漏洞成功解析脚本

png
ALT+4
查看模板运行结果
脚本:
|
0
传函数名,1
传参数。

jpg
|
条件竞争
==Pass-18==
查看提示需要代码审计

使用move_uploaded_file()
函数,将上传的文件保存到服务器,再进行判断是否是jpg、png、gif
中的一种类型,如果在数组中就保存重命名,如果不在根据unlink()
就直接删除
代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。
通关步骤:
上传<?php @eval($_POST["shell"]); ?>
然后bp
拦截,发送到Intruder
设置payload
类型

增多线程数

开始攻击,然后运行脚本
import requests |
%00
截断绕过

- 黑名单中没有过滤
PHP
,因此可以利用大写绕过 - 通过
move_upload_file()
函数移动文件- 因此可以修改后缀为
php/.
,php/.
可以绕过黑名单,move_upload_file()
函数会删除末尾的/.
- 或者利用
%00
截断绕过
- 因此可以修改后缀为
$file_name
是通过POST
传参获取的,bp
抓包修改应POST
参数后缀为PHP
最后再介绍一下%00
截断绕过的方法
发送上传成功后,打开图像链接

成功解析脚本
