Upload-labs文件上传靶场通关教程🐶
Upload-labs文件上传靶场通关教程🐶
Pass-01
首先直接上传一个webshell,果然被禁止了,弹出不允许上传php类型的文件
然后我准备抓包改改文件类型的,发现压根抓不到,弹框在抓包之前,就说明这是做的一个前端限制,所以我们只需要找到前端js代码把它删掉然后上传就行了
把上面这个限制的js代码删掉,然后直接上传一个webshell即可,上传成功之后我们读取/etc/passwd
看看
Pass-02
这一关查看网页源码发现还是有前端限制,但是应该没那么简单不然就跟第一关一样了,我们尝试删除前端js代码限制,然后抓包修改文件的MIME类型为 image/jpeg
然后上传,发现上传成功
Pass-03
这一关我们经过测试发现是检查文件上传的后缀不允许是本pass禁止上传.asp|.aspx|.php|.jsp后缀文件
,然后查看源码发现会进行小写转换,所以大写绕过肯定是不行的,但是我们可以用 php3
和 php5
这些后缀进行绕过,上传文件读取/etc/passwd
文件
Pass-04
第四关我们查看提示发现禁止上传下面这些常用后缀
所以这个时候我们就可以上传 .htaccess
重写文件解析绕过
.htaccess
文件的作用:.htaccess文件是Apache服务器的一个配置文件,负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
我们这里用到的就是.htaccess
文件的改变文件扩展名的功能
.htaccess
代码:
<FilesMatch "shell.jpg"
SetHandler application/x-httpd-php
</FilesMatch>
这个时候我们上传一个shell.jpg
的文件,他的后缀会以php文件解析。上传成功读取/etc/passwd
Pass-05
这一关我们看提示发现.htaccess
文件也被禁止上传了
但是我们看源码发现没有了转换小写函数,就是这个:strtolower()
,所以这一关我们可以大小写混写绕过,上传成功读取/etc/passwd
文件
Pass-06
这一关增加了转换小写的函数,所以说大小混写肯定不行了,但是删掉了去掉文件首尾去空的函数
$file_ext = trim($file_ext); //首尾去空
所以说这关我们可以在文件名末尾加空格绕过,上传成功读取phpinfo()
文件
Pass-07
这一关查看提示还是禁止了所有能上传的后缀,但是少了这一行代码
$file_name = deldot($file_name);//删除文件名末尾的点
这样我们就可以这样构造文件名绕过shell.php.
多加一个点,因为这一行代码下面就是这一行代码
# 意思是截取最后一个.后面的字符串
$file_ext = strrchr($file_name, '.');
经过我们构造payload之后,他就会截取一个空的字符串去黑名单里面比较,发现都不在从而进行绕过了。上传成功执行phpinfo()
命令
Pass-08
这一关跟上一关相比少了这样一行代码
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
- ::$DATA的作用
在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。
例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"
所以说这是windows独有的特性,如果你的环境搭在linux系统就行不通了。
所以我们可以这样构造进行绕过:文件名+::$DATA
上传文件成功之后执行phpinfo();
命令
Pass-09
我们查看源码发现基本就是前面的综合,都加了。然后我们再看看这一关跟第7关的区别是不是就加了这一行代码
$file_name = deldot($file_name);//删除文件名末尾的点
第7关没有这一行代码还记得我们是怎么绕过的吗?是不是这样shell.php.
,在文件名后面多加一个点,但是这一关有了这一行代码会删除文件名末尾的点,那我们可以加两个点,删了一个不还有一个吗。所以我们可以这样构造payload:
shell.php. .
,上传文件成功之后执行phpinfo()
命令
Pass-10
这一关我们查看源码发现是将敏感后缀全部替换成空,关键代码如下:
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
但是没有循环过滤,说明它只是删除了一次,所以我们可以进行双写绕过,payload:shell.pphphp
上传文件成功之后读取/etc/passwd
文件
Pass-11
这一关的关键代码如下:
# 一个白名单
$ext_arr = array('jpg','png','gif');
# 这个是获取上传文件的后缀
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
# 这个save_path是保存路径,后面拼接上一个随机的文件名跟后缀
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
这一关的save_path
我们是可控的,所以我们可以用%00
截断,但是这个东西的利用需要两个条件:
- php版本小于5.3.4
- php的magic_quotes_gpc为OFF状态
所以说如果你没有上传成功的话,最好去检查一下满不满足这两个条件!👻
我们尝试上传:
上传成功之后执行phpinfo()
命令
Pass-12
好家伙,这一关我刚开始还以为和第11关一样呢,仔细一看就是把GET改成了POST去传输save_path
了,但是有一点要注意的就是%00
在GET中会自动解码,但是在POST中不会,所以需要我们手动在16进制里面进行修改00
,这里用的就是16进制00截断漏洞。
我们直接上传payload:
上传成功之后执行phpinfo();
命令
Pass-13
这一关是让我们上传图片码,然后利用文件包含漏洞进行利用,而且让我们上传3种格式的图片码。
我们查看源码发现如下代码:
# 只是检查文件的开头两个字节是不是正确的
$bin = fread($file, 2); //只读2字节
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
所以我们可以伪造文件开头的两个字节就可以,下面展示三种图片码的开头文件字节:
图片类型 | 开头两个字节 | 编码后的字符 |
---|---|---|
jpg | ff d8 | ÿ Ø |
png | 89 50 | P |
gif | 47 49 | G I |
GIF图片码
- 上传GIF图片
- 通过文件包含漏洞读取
/etc/passwd
文件
PNG图片码
- 上传PNG图片
- 通过文件包含漏洞读取
/etc/passwd
文件
JPG图片码
- 上传JPG图片
- 通过文件包含漏洞读取
/etc/passwd
文件
Pass-14
本关利用的是getimagesize
这个函数对上传的图片做限制。
getimagesize
的作用:getimagesize 这个函数是检查图片的前面16进制来检查是否为图片。如果说在在16进制后面加入恶意代码,就可以神不知鬼不觉的上传图片和本地文件包含漏洞(改URL的)结合 达到入侵的目的!即制作包含恶意代码的图片!
制作方法:window+R cmd 输入 copy /b ai.png + phpinfo.php ccc.png
- GIF图片码
copy /b 1.gif + shell.php 2.gif
- JPG图片码
copy /b 1.jpg + shell.php 2.jpg
- PNG图片码
copy /b 1.png + shell.php 2.png
上传图片码之后,通过文件包含漏洞访问图片读取/etc/passwd
文件:
http://192.168.33.222:24007/include.php?file=./upload/3420220117013703.jpeg
Pass-15
这一关用第14关的图片码即可解决
Pass-16
这一关会对图片进行重新渲染,所以有可能我们上传的图片码里面写入的一句话木马被重新渲染了,导致执行不了。所以我们对比渲染之后的图片码和之前的进行对比,看哪些地方进行了渲染,在没有被渲染的地方重新插入一句话木马,用winhex直接改就行。
上传图片成功之后读取/etc/passwd
文件
Pass-17
这一关网上说是用条件竞争的方式上传文件,但是我上传一个图片码之后通过文件包含直接访问到了,读取/etc/passwd
文件
Pass-18
------------恢复内容开始------------
# Upload-labs文件上传靶场通关教程🐶Pass-01
首先直接上传一个webshell,果然被禁止了,弹出不允许上传php类型的文件
然后我准备抓包改改文件类型的,发现压根抓不到,弹框在抓包之前,就说明这是做的一个前端限制,所以我们只需要找到前端js代码把它删掉然后上传就行了
把上面这个限制的js代码删掉,然后直接上传一个webshell即可,上传成功之后我们读取/etc/passwd
看看
Pass-02
这一关查看网页源码发现还是有前端限制,但是应该没那么简单不然就跟第一关一样了,我们尝试删除前端js代码限制,然后抓包修改文件的MIME类型为 image/jpeg
然后上传,发现上传成功
Pass-03
这一关我们经过测试发现是检查文件上传的后缀不允许是本pass禁止上传.asp|.aspx|.php|.jsp后缀文件
,然后查看源码发现会进行小写转换,所以大写绕过肯定是不行的,但是我们可以用 php3
和 php5
这些后缀进行绕过,上传文件读取/etc/passwd
文件
Pass-04
第四关我们查看提示发现禁止上传下面这些常用后缀
所以这个时候我们就可以上传 .htaccess
重写文件解析绕过
.htaccess
文件的作用:.htaccess文件是Apache服务器的一个配置文件,负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
我们这里用到的就是.htaccess
文件的改变文件扩展名的功能
.htaccess
代码:
<FilesMatch "shell.jpg"
SetHandler application/x-httpd-php
</FilesMatch>
这个时候我们上传一个shell.jpg
的文件,他的后缀会以php文件解析。上传成功读取/etc/passwd
Pass-05
这一关我们看提示发现.htaccess
文件也被禁止上传了
但是我们看源码发现没有了转换小写函数,就是这个:strtolower()
,所以这一关我们可以大小写混写绕过,上传成功读取/etc/passwd
文件
Pass-06
这一关增加了转换小写的函数,所以说大小混写肯定不行了,但是删掉了去掉文件首尾去空的函数
$file_ext = trim($file_ext); //首尾去空
所以说这关我们可以在文件名末尾加空格绕过,上传成功读取phpinfo()
文件
Pass-07
这一关查看提示还是禁止了所有能上传的后缀,但是少了这一行代码
$file_name = deldot($file_name);//删除文件名末尾的点
这样我们就可以这样构造文件名绕过shell.php.
多加一个点,因为这一行代码下面就是这一行代码
# 意思是截取最后一个.后面的字符串
$file_ext = strrchr($file_name, '.');
经过我们构造payload之后,他就会截取一个空的字符串去黑名单里面比较,发现都不在从而进行绕过了。上传成功执行phpinfo()
命令
Pass-08
这一关跟上一关相比少了这样一行代码
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
- ::$DATA的作用
在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。
例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"
所以说这是windows独有的特性,如果你的环境搭在linux系统就行不通了。
所以我们可以这样构造进行绕过:文件名+::$DATA
上传文件成功之后执行phpinfo();
命令
Pass-09
我们查看源码发现基本就是前面的综合,都加了。然后我们再看看这一关跟第7关的区别是不是就加了这一行代码
$file_name = deldot($file_name);//删除文件名末尾的点
第7关没有这一行代码还记得我们是怎么绕过的吗?是不是这样shell.php.
,在文件名后面多加一个点,但是这一关有了这一行代码会删除文件名末尾的点,那我们可以加两个点,删了一个不还有一个吗。所以我们可以这样构造payload:
shell.php. .
,上传文件成功之后执行phpinfo()
命令
Pass-10
这一关我们查看源码发现是将敏感后缀全部替换成空,关键代码如下:
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
但是没有循环过滤,说明它只是删除了一次,所以我们可以进行双写绕过,payload:shell.pphphp
上传文件成功之后读取/etc/passwd
文件
Pass-11
这一关的关键代码如下:
# 一个白名单
$ext_arr = array('jpg','png','gif');
# 这个是获取上传文件的后缀
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
# 这个save_path是保存路径,后面拼接上一个随机的文件名跟后缀
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
这一关的save_path
我们是可控的,所以我们可以用%00
截断,但是这个东西的利用需要两个条件:
- php版本小于5.3.4
- php的magic_quotes_gpc为OFF状态
所以说如果你没有上传成功的话,最好去检查一下满不满足这两个条件!👻
我们尝试上传:
上传成功之后执行phpinfo()
命令
Pass-12
好家伙,这一关我刚开始还以为和第11关一样呢,仔细一看就是把GET改成了POST去传输save_path
了,但是有一点要注意的就是%00
在GET中会自动解码,但是在POST中不会,所以需要我们手动在16进制里面进行修改00
,这里用的就是16进制00截断漏洞。
我们直接上传payload:
上传成功之后执行phpinfo();
命令
Pass-13
这一关是让我们上传图片码,然后利用文件包含漏洞进行利用,而且让我们上传3种格式的图片码。
我们查看源码发现如下代码:
# 只是检查文件的开头两个字节是不是正确的
$bin = fread($file, 2); //只读2字节
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
所以我们可以伪造文件开头的两个字节就可以,下面展示三种图片码的开头文件字节:
图片类型 | 开头两个字节 | 编码后的字符 |
---|---|---|
jpg | ff d8 | ÿ Ø |
png | 89 50 | P |
gif | 47 49 | G I |
GIF图片码
- 上传GIF图片
- 通过文件包含漏洞读取
/etc/passwd
文件
PNG图片码
- 上传PNG图片
- 通过文件包含漏洞读取
/etc/passwd
文件
JPG图片码
- 上传JPG图片
- 通过文件包含漏洞读取
/etc/passwd
文件
Pass-14
本关利用的是getimagesize
这个函数对上传的图片做限制。
getimagesize
的作用:getimagesize 这个函数是检查图片的前面16进制来检查是否为图片。如果说在在16进制后面加入恶意代码,就可以神不知鬼不觉的上传图片和本地文件包含漏洞(改URL的)结合 达到入侵的目的!即制作包含恶意代码的图片!
制作方法:window+R cmd 输入 copy /b ai.png + phpinfo.php ccc.png
- GIF图片码
copy /b 1.gif + shell.php 2.gif
- JPG图片码
copy /b 1.jpg + shell.php 2.jpg
- PNG图片码
copy /b 1.png + shell.php 2.png
上传图片码之后,通过文件包含漏洞访问图片读取/etc/passwd
文件:
http://192.168.33.222:24007/include.php?file=./upload/3420220117013703.jpeg
Pass-15
这一关用第14关的图片码即可解决
Pass-16
这一关会对图片进行重新渲染,所以有可能我们上传的图片码里面写入的一句话木马被重新渲染了,导致执行不了。所以我们对比渲染之后的图片码和之前的进行对比,看哪些地方进行了渲染,在没有被渲染的地方重新插入一句话木马,用winhex直接改就行。
上传图片成功之后读取/etc/passwd
文件
Pass-17
这一关网上说是用条件竞争的方式上传文件,但是我上传一个图片码之后通过文件包含直接访问到了,读取/etc/passwd
文件
Pass-18
这一关网上说是要用条件竞争的方式上传,但是我就上传了一个图片码发现也成功了,但是上传目录不是uplaod
,变成了根目录下面。
读取/etc/passwd
文件:
Pass-19
后面两关我还没有复现出来,看了网上教程,但是我没有成功😭,等后面再回来试试吧。