文件上传漏洞小结与Upload-labs 靶场纪实

WEB安全——文件上传靶场记录


文件上传的思路与分类(图片转自小迪):

在这里插入图片描述

一、前端验证的绕过 Pass 01

由于网站使用的是 前端js验证 checkfile函数 并会弹出弹框不允许脚本格式图片上传
所以可以直接修改网页代码删除checkfile函数,再上传图片。
这种情况用burp是抓不到包的,只有上传时有提交动作(上传到服务器)才能抓到包 ,当对方页面为html或在js代码写的本地端代码则抓不到
在这里插入图片描述

二、验证绕过——白名单

1.MIME验证绕过 pass02

MIME的解释:链接: link.
查看源代码发现,后端PHP代码只对content-type进行了检查,文件类型验证方式为白名单绕过中的查看文件(头)类型,则可以通过修改文件类型绕过 。
在这里插入图片描述
上传正常的图片并抓包发现:
在这里插入图片描述
文件类型为:image/jpeg,按照题目要求只要文件头类型content-Type为image/jpeg格式就可以上传成功。当我们上传php格式文件时:文件类型为Content-Type:application/octet-stream,所以我们在bp中 将其改为
content-Type: image/jpeg,打开代理放包即可上传成功。

2. %00 /00截断与0x00截断 pass12、13

适用于php版本5.3以下
这个链接中的大佬将原理讲诉的很清楚 ——>链接: link.

1.%00截断:

在这里插入图片描述
原理:
在 url 中的%00(不是普通文本!!)表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。比如: https://mp.csdn.net/upfiles/?filename=test.txt 此时输出的是test.txt
加上%00 https://mp.csdn.net/upfiles/?filename=test.php%00.txt此时输出的是test.php 就绕过了后缀限制,可以上传webshell了。
Pass12 解析:
在这里插入图片描述

因为上传方式为get方式,自动解析为url,所以直接在bp中修改后缀为:
在这里插入图片描述

原理:后缀验证的返回结果 采用文件名拼接在目录名后的验证方法即文件名为1.php后缀名为1.jpg则拼接后为1.php1.jpg 。所以利用%00的特性实现绕过。

2. 0X00截断

在这里插入图片描述
这时候就要利用0x00截断原理了,具体原理是 系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
注意:
是文件的16进制内容里的00,而不是文件名中的00 !系统按16进制读取文件(或者说二进制),遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00,用0x开头表示16进制,也就是所说的0x00截断。
0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制
操作:
在这里插入图片描述
这里在php的后面添加了一个空格和字母a,其实a写不写都可以,这里加a是为了显示空格的位置。空格是为了占位,方便修改00。
然后打开hex,(空格的16进制为0x20)修改16进制内容,把20改成00:
在这里插入图片描述
修改完成后,原来的文本显示也发生了 变化:
在这里插入图片描述
那个方框的位置就是0x00,只不过这是一个不可见字符,无法显示。
当系统读取到方框,也就是0x00时,认为已经结束,不会再读取后面将要拼接的1.jpg,认为是php文件,完成绕过:
在这里插入图片描述
这就是0x00的原理,总之就是利用ascii码为零这个特殊字符,让系统认为字符串已经结束。

Pass 13解析:
在这里插入图片描述
观察代码发现为post解析方式,抓包,扔给重发器,找到对应行,php后加个空格
在这里插入图片描述到hex中找到这行php后边的空格 即20(url编码空格为%20)
在这里插入图片描述将20改为00,返回raw,php后面得空格变成一个口,发送即可。

注意:
get会自动解码,post不会自动解码只有进行url编码后%00才被解析。即:经过post上传,并且/uploads/是隐藏在post表单里的数据,则这个路径因为放在post中内,没有经过URL编码而直接进入了验证函数,所以0x00会成功截断。

三、验证绕过——黑名单

1. 文件后缀验证绕过 pass03

通过分析源代码得知
在这里插入图片描述
在这里插入图片描述
此验证类型为验证文件后缀类型,即:如果文件类型为array数组里的类型时,is_upload=false,阻止上传,所以可以在bp中通过抓包修改文件后缀类型达到绕过效果。
在这里插入图片描述
同样可以上传其它格式或版本后缀名达到绕过,能否正确实行取决于web所属服务器配置

2. htaccess解析绕过 (基于使用apache服务器搭建的网站) pass-4

先上传一个.htaccess后缀的文件,文件包含:
在这里插入图片描述
在这里插入图片描述

其中"muna"为接下来上传文件的文件名,由于.htaccess会将""中的文件解析为php格式,直接解析其中的php代码,所以可以达到绕过效果,都是注意要修改上传的执行文件的后缀为jpg等,虽然上传的时图片格式,但是会解析为php格式。(注意创建文件不要用记事本,可以用note+)

3. 大小写绕过 pass06

如果原码中为出现大小写检验,或不将文件信息统一转换为大/小写(未出现下图下划线意思的检验方式),则可以使用大小写绕过。如禁用了PHP、php、pHP则可以使用Php、phP后缀进行绕过
在这里插入图片描述

3. 空格/点绕过 pass07/08

原理与大小写绕过大致相同,如果源代码中没有收尾去空的功能,可以使用php (空格)进行绕过;
利用系统原理,在数据包中时可以加上空格的,但是在系统中会强行去除空格,在网站服务器中也会将空格去掉,所以我们用bp抓包,在数据包中添加空格,达到绕过效果。点绕过原理相同。
f i l e n a m e = d e l d o t ( file_name = deldot( filename=deldot(file_name);//删除文件名末尾的点

5. 递归过滤 pass 10

在这里插入图片描述

通过分析代码,发现文件尾部空格与点只检查并去除了一次,没有使用循环检查并去除的方法。又因为系统数据包中(文件后缀)可以出现 点空格等 特殊符号,并且在数据包解析时会自动将其去除。所以根据上述代码:使用文件为XXX.PHP. (空格) . 时上述代码去除末尾点和空格还剩一个点XXX.PHP. 此后缀PHP.并为出现在黑名单中,因此可以实现绕过。

6. ::$$DATA绕过 pass09

因为在window系统中,如果使用文件名+"::DATA"会把 ::DATA之前的文件名,他的目的就是不检查后缀名。例如 :"phpinfo.php::DATA变成"phpinfo.php"。同样使用抓包,在数据包中修改。注意中英文符号。

7. 重复后缀名绕过 pass11

在这里插入图片描述
分析源代码,发现上图划线句子的作用为如果查找到array数组中的元素时(file_name),使用(空)替换file_name。使上传文件失效。利用其在后缀中查找第一个出现的php字符并将其替换的特性,我们可以构造后缀名为XXX.PPHPHP的文件,这样第一个php后缀被替换后仍然存在一个php后缀的文件,达到绕过效果。

四、验证内容绕过

1. 文件包含漏洞中的文件头检测绕过 pass14/15/16

文件头检测代码:
下图代码功能为只读取上传文件的前两个字节来判断文件类型,后端根据所得类型重新上传
在这里插入图片描述

先分析一下下列含有包含漏洞的代码(下图)
文件包含漏洞:将上传文件中所包含的代码类型按它所属的代码类型执行
例如本站含有文件包含漏洞,那么在jpg中加入php代码,上传到本站,jpg中的php代码将会被解析并执行。
分析下图可知本站含有文件包含漏洞。
在这里插入图片描述
接收变量‘file’参数给变量file,使用include函数包含file文件
那么就可以向包含漏洞的页面传递文件名为图片地址的信息:
在这里插入图片描述

file=图片地址,因为是本地上传,可以直接使用file=上传文件名
在这里插入图片描述

Execute,执行
在这里插入图片描述

打开hackbar使用post注入,因为一句话马使用的是<?php eval($_POST['x']); ?>,参数为x,使用x=phpinfo();函数检测注入在执行,执行成功。
在这里插入图片描述

Pass 15/16
只是检测方式不同,同样可以使用pass13的图片马上传
在这里插入图片描述

Pass16
在这里插入图片描述

exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块。

五.二次渲染绕过

原理:在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
绕过
1、配合文件包含漏洞:
   将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数
据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取
webshell。
2、可以配合条件竞争:
   这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传

pass 17
因为二尺渲染会将上传的文件名重新命名,那么我们上传的木马会消失,如果把我们上传的图片用winhex打开:
在这里插入图片描述
发现我们添加的php代码被删除了。用上传图片对比被处理后的图片,发现有一部分是没有被修改的,在那一部分重新插入一句话木马,上传后在下载到本地使用16进制编辑器打开,可以看到php代码没有被去除.成功上传图片马。
详细原理可以参考大佬的博客:链接: link.

六.条件竞争

在这里插入图片描述
pass18:
分析源码,服务器先将上传的文件保存下来,再将文件的后缀名进行白名单验证,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件。
这样如果我们还是上传一个图片马,假设网站依旧存在文件包含漏洞那么也可以利用以上方法。但是如果没有文件包含漏洞,我们上传的图片马在上传后就会被删除。但是我们可以利用程序在执行到删除图片马之前的时间内完成访问,实现目的,这就是竞争上传。通过利用burp多线程发包,然后不断在浏览器访问我们的webshell,会有一瞬间的访问成功。

六.服务器解析漏洞

pass 19-21都是利用服务器解析漏洞与上述方法结合的办法完成文件上传的。

文件上传漏洞不止在web层面,也纯在于中间件等之中。
在这里插入图片描述
解析漏洞,是指中间件(Apache、nginx、iis等)在解析文件时出现了漏洞,从而,黑客可以利用该漏洞实现非法文件的解析。
在这里插入图片描述

1. Apache 解析漏洞:

Apache解析文件规则是从右到左。例如shel.php.gix.ccc,apache会先识别ccc,ccc不被识别,则识别gix,以此类推,最后会被识别为php来运行。
链接: Apache解析漏洞详解.

2. IIS6.0 漏洞

1.目录解析 :
目录名为.asp、.asa、.cer,则目录下的所有文件都会被作为ASP
url/test.asp/shell.jpg会被当作asp脚本运行。
2.文件解析 :
文件名中分号后不被解析,例如.asp;、.asa;、.cer;。
url/test.asp;shell.jpg会被当作asp脚本运行。
3.文件类型解析 :
asa,.cer,.cdx都会被作为asp文件执行。
url/shell.asa会被作为asp文件执行。
链接: IIS6.0容器之解析漏洞复现.

3.Nginx 漏洞

PHP+nginx默认是以cgi的方式去运行,当用户配置不当,会导致任意文件被当作php去解析。
利用条件:
以FastCGl运行
cgi.fix_pathinfo=1(全版本PHP默认为开启)
例如如果满足上述条件,当你访问url/shell.jpg/shell.php时,shell.jpg会被当作php去执行。

Nginx 解析漏洞:
Nginx 文件名逻辑漏洞(CVE-2013-4547)
影响版本:Nginx 0.8.41 ~ 1.4.3/1.5.0 ~ 1.5.7
利用过程:
上传一个shell.jpg文件,注意最后为空格
访问url/shell.jpg[Ox20][Ox00].php
(两个中括号中的数字是用Burp在Hex界面中更改)
• 漏洞复现参考链接
链接: nginx文件名逻辑漏洞_CVE-2013-4547漏洞复现.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值