upload-labs靶场通关——文件上传

Pass-1 (js前端验证)

提示:本pass在客户端使用js对不合法图片进行检查

 这里直接跳出弹窗提示 了,可以看出来这个验证是在前端进行的,众所周知,直接禁用掉就好了 。

 

Pass-2 (MIME验证)

提示:本pass在服务端对数据包的MIME进行检查!

 从源代码中可以看出只对文件类型(type)进行了验证,必须要是image/jpeg或者image/png或者image/gif的格式,没有对后缀进行验证,只需要使用bp抓包将Content-Type:的参数修改成image/jpeg或者image/png或者image/gif其中的一种,进行绕过就好

$_FILES['myfile']['type']文件的MIME类型,需要浏览器提供该信息的支持,例如"image/gif"

MIME 给出的是文件的MIME信息 ,此信息可以用来在HTTP Conten-type 头 信息中发送 正确的信息,如:header("Cotent-type:image/gif")

常见的MIME类型(通用型):
超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
任意的二进制数据 application/octet-stream

操作步骤:

第一步:开始BP抓包。

第二步:上传php的 文件,修改Conten-type

 上传成功

 

 

Pass-3 (黑名单验证,特殊后缀)

提示:本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!

查看原代码

 分析一下代码:

这里使用了数组的方式,设置的黑名单,不允许.asp .aspx .php .jsp的后缀名进行上传。

绕过思路:php不止只有这一个文件名,我们可以使用其他的php的别名进行绕过:.php3 .php4 .php5 .phtml .phtm .phps .phpt .php345 (但是这里是有前提条件的)就是对方的服务器的配置有对这些php其他的文件名配置了解析的设置,否认就算你上传上去了,还是解析失败。配置好了对应的解析,直接修改文件名就好了把1.php修改成你配置的对应的解析的文件名。

比如:1.php修改后1.phtml
 

Pass-4 (黑名单验证,.htaccess)

提示:

 禁止传上.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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后缀文件!

源代码中可以看出,还是使用了一个黑名单的限制,对文件的后缀进行验证,并且限制的比之前的更多了,但是我们可以从黑名单中看出没有对.htaccess进行验证,那么我们就可以使用.htaccess进行绕过

.htaccess功能介绍:htaccess文件是Apache服务器中的一个配置文件。这个文件的可以不用获得root的权限,就可以更改这个目录下的所有的文件配置。那么说明只要创建一个.htaccess的文件,并且写入php的 配置,上传到这个服务器上,那么这个.htaccess所在的目录下的所有文件的配置就会都修改成转换成php的解析格式。(.htaccess文件只对Apache服务器有效)。

操作步骤:

1.首先先创建一个.htaccess的文件在文件中写入

<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch>

2.把这个文件上传到服务器上。

3.将一句话木马文件名修改成gif/png/jpe其中格式的一种。比如2.png

4.将1.gif(一句话木马的文件)上传到服务器

 

上传成功。

这里的关键点就是.htaccess这个文件,把所有的目录下的文件的解析方式都修改成了php,

所以我们第二次上传的图片2.png “png”不在黑名单中,但是由于.htaccess文件所以又把他解析成了php的格式,所以可以完成正常的解析。

Pass-5 (黑名单验证,.user.ini)

1.上传一个.user.ini文件, php.ini是php默认的配置文件,其中包括了很多php的配置,而.user.ini实际上就是一个可以由用户“自定义”的php.ini,内容为:

auto_prepend_file=1.png

2.上传.user.ini文件,.user.ini配置参考的PHP 通过.user.ini 绕过黑名单限制,在.user.ini设置auto_prepend_file属性
下方的配置的意思是在.user.ini相同的目录下,所有的php文件都包含5.png这个文件
所以之后我们就可以利用到readme.php包含一个我们上传的木马文件,再连接readme.php文件达到连接一句话木马的目的

 

Pass-6 (黑名单验证,大小写绕过)

查看源码:

 这里和之前的源码进行对比一下,可以发现没有使用strtolower()这个函数,把后缀都转换成小写,那么我们就可以使用大小写的方式绕过黑名单。

操作步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据

 第三步:放包

 

Pass-7 (黑名单验证,空格绕过)

查看源码:

 从源码中可以看出没有对文件名后缀的空白使用trim()进行过滤,借助windows系统的特性,文件名中的空格在最后保存文件时会被作为空处理,最后在保存的时候把后面的空格自动删除掉。

但是在程序中检查代码的时候检查到空格却不能自动删除空格。同时又绕过了黑名单的验证

操纵步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据,在文件名的后缀添加空格
  第三步:放包

 

Pass-8 (黑名单验证,点号绕过)

提示:本pass禁止上传所有可以解析的后缀!

查看源码

 

对比发现,没有对末尾的点使用deldot(),进行过滤,没有删除末尾的点,再次利用windows的特性,在文件名的后缀加上点号,在最终保存的文件windows系统自动去除掉后面的点,保存文件。同时绕过黑名单的验证。

操纵步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据,在文件名的后缀添加点号 绕过

第三步:放包 

 

Pass-9 (黑名单验证,特殊字符::$DATA绕过)

查看源码

对比之前的源码发现这里没有使用 str_ireplace()对::$DATA进行过滤,没有替换成空。

什么是::$DATA呢?

::$DATA这是一种windows操作系统处理文件时的特性,为文件流,如果文件名后有此标记::$DATA

,并且没有做过滤,windows会不检查,直接保存该文件。使用他的目的就是不检查后缀名。

所以我们只要在文件名后面加上::$DATA就可以成功绕过

操作步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据,在文件名的后缀添加::$DATA绕过
第三步:放包

 把后面的::$DATA删除掉就可以看到刚刚上传的文件了 

 Pass-10 (黑名单验证,点+空格+点绕过)

查看源码

 抓包修改后缀为php. . .

 去掉文件后的点

 成功

Pass-11 (黑名单验证,双写绕过)

查看一下源码

这一关重点的是str_ireplace($deny_ext,"", $file_name);这个函数,将文件名中出现在黑名单的这些后缀都替换成空,假如我们上传一个phpinfo.php被过滤后就变成了phpinfo,就没有后缀无法解析了,但是她这次也是使用的是一次性过滤,比如说我们上传phpinfo.phpphp,那么在一次性被过滤后我们原本上传的phpinfo.phpphp,就变成了phpinfo.php。 前面的php被匹配到替换成功,但是后面的第二个php没有被替换成空。

 操作步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据,在文件名的后缀添加php绕过。

 第三步:放包

 

Pass-12 (GET方式00截断绕过)

查看一下源码

 

分析源码:

 1.$ext_arr = array('jpg','png','gif'); 这里使用了数组做了一个白名单

 2.$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);

截取文件名的后缀从点的位置开始截取,并且使用的是循环的方式截取,不是采用 一次性

对($_FILES['upload_file']['name']进行验证

3. if(in_array($file_ext,$ext_arr)){  判断上传的文件名后缀是否在白名单中,如果在进入循环。

4.       $temp_file = $_FILES['upload_file']['tmp_name']; 进入循环,给上传的文件放在一个临时的目录下,并且生成一个临时文件名

5.$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;(这一步是关键)

使用$_GET['save_path']接受自定义的路径,并且随机从10,99的数组在随机生成一个文件名,

在拼接上$file_Ext 前面截取的后缀名。

6.(move_uploaded_file($temp_file,$img_path)){
最终将前面保存的$temp_file临时文件移动 到$img_path

原理 :

00截断利用的是php的漏洞,php的基础是C语言实现的,在C语言中认为%00是结束的符号,所以就基础了c的特性,在PHP<5.3.4的版本中,在进行存储文件时碰见了move_uploaded_file这个函数的时候,这个函数读取到hex值为00的字符,认为读取结束,就终止了后面的操作,出现00截断

绕过思路:

首先使用的是白名单,从代码中可以看出他首先对上传的文件名的后缀进行了验证。

所以我们在第一步上传$_FILES['upload_file']['name'],文件名的时候必须后缀是.jpg.png.gif的格式。绕过后缀名的验证后,进入到循环。最后重点他保存的文件是

 $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;,由上传路径决定的,原参数$_GET['save_path'],save_path=../upload/。 那么上传路径可控的 。我们就使用%00截断,把上传的路径修改为文件名。最后利用move_uploade_file这个函数发挥出%00截断的功能。

假如我们没有使用%00截断前最终上传的文件名可能是

../upload/ 237298.png

$_GET['save_path']     rand(10, 99).date("YmdHis")    $file_ext;

使用%00截断后

../upload/1.php%00237298.png

$_GET['save_path']  rand(10, 99).date("YmdHis")     $file_ext;

最后 保存的文件就变成了

../upload/1.php

操作步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据,filename="phpinfo.png"  后缀修改成图片格式,

替换文件中的内容。修改?save_path=../upload/1.php%00

访问图片 地址 

 将后面的参数删掉 ,因为我们最终保存在目录下的是1.php

 上传成功

注意:过这关和下一个需要把php换成<5.3.4的版本,并且php.ini中关闭magic_quotes_gpc选项。 

Pass-13 (POST方式00截断绕过)

这关原理和上一关一样,不过是使用POST 方式进行传参的。所以需要在%00的时候进行编码。

GET会自动解码%00

比如说你在url输入空格,他自己会进行判断并且把他进行编码知道你想要的%00,在url干嘛的。

但是POST里面 加%00 POST不会自动解码,你在POST中输入的%00 他会认为是普通文本的%00,那么普通文本他就会编码成%25%30%30.不是我们想要的%00,所以我们需要自己把他先进行编码 。

操作步骤:

第一步:上传一个.php的文件

第二步:开启bp抓包修改数据,filename="phpinfo.png"  后缀修改成图片格式,

save_path"=../upload/1.php%00

选中%00进行编码

第三步:放包

Pass-15 (文件内容检测,图片马绕过)

查看一下源代码

 

代码分析:这一关对图片的内容进行了验证,本题给了提示此关检查的是文件头部信息,通过检查文件的前2个字节,检查上传文件二进制的头部信息,来进行判断文件的类型。所以这一关修改后缀是没有用的。使用图片码的方式绕过。

操作步骤:

1。制作图片码 准备一张图片,在准备一个一句话木马的php文件

2.打开cmd  使用命令制作图片码

copy 1.jpg /b + 1.php /a shell.php

复制图片链接地址

4.点击"文件包含漏洞"的地址,进行传参。

 

Pass-16 (文件内容检测,exif_imagetype函数绕过)

注意!!!先开启php_exif模块(点击phpstudy中其他选项菜单—>PHP扩展及设置—>PHP扩展—>找到php_exif,确保其打勾)

查看源码,查看提示发现有重新渲染

imagecreatefromjpeg()函数,二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
按照前几关的方式上传,可以上传,但是包含漏洞无法解析。原因就是二次渲染将图片马里面的php代码删了。接下来把原图和修改后的图片进行比较,看哪里没有被渲染,在这里插入php代码。推荐使用beyond compare。为了方便大家测试,这里再推荐网上大佬的二次渲染专用图片https://wwe.lanzoui.com/iFSwwn53jaf

 把上传的图片在右键保存本地,看没有被渲染的地方,加入php代码

再重新上传 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值