渗透测试技术----常见web漏洞--文件上传攻击原理及防御

一、文件上传漏洞介绍

1.文件上传漏洞简介
在现在的互联网中,上传文件是一种常见的功能,用户可以上传图片、视频、头像和许多其他类型的文件。然而向用户提供的功能越多,web应用收到的风险就越大,用户可以通过上传一些恶意脚本到服务器,这些恶意脚本又被称为WebShell,WebShell具有很强大的功能,可以获取网站的权限,比如查看服务器目录、服务器中的文件、执行系统命令等。

2.文件上传漏洞的前提条件

  • 存在一个可以上传文件的位置
  • 上传的文件可以被执行
  • 清楚文件上传后的路径

3.常见的一句话木马
(1):<?php @eval($_GET[cmd]); ?>(使用菜刀连接)
(2):<?php system($_GET[cmd]); ?>(执行系统命令)
(3):<?php echo exec($_GET[cmd]); ?>(执行系统命令)
(4):<?php echo shell_exec($_GET[cmd]); ?>(执行系统命令)

4.制作图片马
(1):直接在文件中修改
将图片使用notepad++或记事本等工具打开,在最后一行(重起一行)添加一句话木马,然后文件名为png、jpg等格式。
(2):使用命令制作图片马
copy a.png/b + a.php/a b.jpg
a.png/b表示以二进制方式打开,a.php/a表示以ASCII码方式打开,b.jpg表示生成一个b.jpg的文件。加号两边最好带上空格。

二、文件上传漏洞的原理

文件上传漏洞是由于程序开发者在对用户上传部分的控制不足或者处理缺陷,没有进行严格的验证和过滤,从而导致用户可以绕过其本身权限向服务器上传可执行的动态脚本,比如asp、aspx、php、jsp等格式的文件。这样攻击者就可以上传一些恶意脚本,从而控制服务器。

三、ByPass文件上传

1.JS检测绕过(最常用的方法之一)
JS检测绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹窗警告,但是,此时上传的文件并没有上传到服务器端,只是在前端进行了验证,因此可以有两种方法来绕过客户端JavaScript的检测

  • 使用浏览器插件,删除检测文件后缀的JS代码,然后上传文件
  • 首先将上传的文件后缀名改成允许上传的类型,例如jpg、png等类型,然后使用BurpSuite进行抓包,将文件后缀名改成可以执行的后缀名,如php类型,然后将数据包放过

2.大小写绕过
有些服务器会将小写的脚本后缀名(如php)过滤掉,因此可以使用大写后缀名(Php)来绕过

3.双重后缀名绕过
有些服务器会将文件后缀名过滤掉,例如"php"字符串被过滤,可以使用双写来进行绕过,如将php改为phphpp来进行绕过

4.文件后缀名绕过
在Apache的解析顺序中,是从由往左进行解析文件后缀的,如果最右侧的扩展名不可识别,就继续往左判断,直到遇见可以解析的文件后缀即可。例如上传的文件名为1.php.xxx,因为后缀名xxx不可解析,所以从右向左解析解析后缀名php,如果其中包含php代码,那么就会执行其中的php代码

5.文件类型绕过
有些服务器端只是验证Content-Type的值来判断文件的类型,那么就可能存在被绕过的可能,因为Content-Type的值是通过客户端传递的,可以任意修改。当上传一个php格式的文件时,可以看到数据包中的Content-Type的值是application/octet-stream,而上传一个jpg格式的文件时,数据包中的Content-Type的值是image/jepg。因此,如果服务器端只验证Content-Type的值的话,可以通过BurpSuite抓包来绕过

6.使用图片马来进行绕过
可以通过上传制作的图片马来绕过限制,这种绕过主要是针对对文件内容进行检测的服务器(这种服务器只会检测文件内容是否是允许的类型,比如看文件内容是否是图片类型,而不去查看文件后缀名)。因此可以上传一个图片马,但是后缀名为php,可以这样做的原因是因为对于大多数web服务器来说,都可以支持用户对于特定类型文件的行为的自定义,以Apache为例,在默认情况下,对于后缀名为php的文件Apache会当作php代码来执行,因此图片马中的图片内容会被忽略,但是会执行其中的php代码。

7.使用图片头来绕过
有些服务器只检测文件头部是否是图片内容,而不会去检测具体的内容,这样就可以上传一个后缀名为php类型的文件,通过在php代码前添加图片头来绕过服务器限制,和图片马原理相同。最常使用的图片头是GIF类型的图片头,其文本格式为"GIF89a",即在php代码前加上"GIF89a"来绕过

8.文件截断绕过
前提条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc=Off
截断原理:由于00代表结束符,所以会把00后面的所有字符删除
有些服务器会使用substr()函数获取文件的后缀,然后判断后缀是否是规定的类型,如果是,则可以上传,否则不允许上传该文件。在这可以利用00截断来绕过服务器限制。在上传的时候,当文件系统读到%00或者A00时,会认为文件已经结束。因此可以通过BurpSuite修改后缀名为1.php%00.jpg或者1.phpA00.jpg,这样,该文件会被当作php类型的文件进行解析,这样就可以绕过后缀名限制

9.竞争条件绕过
一些网站的上传文件逻辑是允许先上传任意文件,然后检测上传的文件是否包含WebShell脚本,如果包含则删除该文件。因此攻击者就可以利用这个时间差完成恶意脚本的上传并利用该恶意脚本进行攻击。

四、文件上传与文件包含组合

对于PHP类型的服务器,所有上传上去的文件会首先被当作是php文件进行解析。因此对于一个有文件包含和文件上传的服务器,如果服务器对上传的文件进行了限制,比如只能上传图片类型的文件,因此可以通过上传制作的图片马来绕过限制。上传一个图片马,并且后缀名为jpg,这样就可以绕过上传的限制;并且该服务器还存在文件包含,这样当执行这个文件时,由于文件包含,这个文件会被首先当作php代码来执行,因此会执行其中的php代码。

五、Web服务器解析漏洞

在一些Web server中,存在解析漏洞
1.老版本的IIS6中的目录解析漏洞:如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析,可以通过上传jpg类型的木马进行白名单绕过,然后将该文件上传到/.asp/目录下,这样该文件就会被当作ASP类型的文件执行。
2.老板本的IIS6中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来进行白名单绕过,如 a.asp;jpg,这样可以绕过白名单限制,在解析的时候也会被当作asp文件执行。
3.旧版Windows Server中存在空格和dot漏洞:类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破一些黑名单限制,成功上传木马,并且被当作php代码来执行。
4.Nginx(0.5.x, 0.6.x, 0.7 <= 0.7.65, 0.8 <= 0.8.37)空字节漏洞:类似于xxx.jpg%00.php、xxx.jpgA00.php这样的文件名会被解析为php代码运行(fastcgi会把这个文件当php看,不受空字节影响,但是检查文件后缀的那个功能会把空字节后面的东西抛弃,所以识别为jpg)
5.Apache1.x,2.x的解析漏洞:上传如a.php.rar、a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,而相应的也会执行其中的php代码

六、防御文件上传的方法

1.使用白名单的方式来判断文件名后缀是否合法
2.将上传后的文件进行修改路径或重命名,这样攻击者就难以找到上传的路径,无法执行该文件
3.将文件上传的路径设置为不可执行,这样即使上传了恶意脚本也无法执行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值