文件上传漏洞
1、文件上传漏洞简介
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
2、文件上传漏洞危害
攻击者绕过上传验证机制上传恶意文件,通过上传的web后门获得整个web业务的控制权,复杂一点的情况是结合web服务器的解析漏洞来获取权限。
3、文件上传检测流程
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web服务器,web服务器收到请求并同意后,用户与web服务器将建立连接,并传输数据。
1、绕过黑名单检查实现文件上传
首先,我们建立一个后缀名为php的文件,作为我们要上传的文件,内部写有木马。
在上传文件的web页,使用brupsuite作为代理
(1)后缀大小写实现文件上传
上传文件,使用BP抓包,将文件的后缀名改为phP,然后点击go,提交。
(2)空格绕过实现文件上传
使用BP抓包后,将文件后缀改为php+空格。
(3)利用Windows系统的文件名特性,通过点绕过实现文件上传。
使用BP抓包后,将文件后缀名改为.php.
(4)利用Windows特性,通过> ::$DATA
绕过实现文件上传
如果发现没有对后缀名进行去‘> ::$DATA
’处理,利用Windows下NTFS文件系统的一个特性,即NTFS文件系统存储数据流的一个属性
D
A
T
A
,
当
我
们
访
问
a
a
.
a
s
p
:
:
DATA,当我们访问aa.asp::
DATA,当我们访问aa.asp::DATA时,就是请求aa.asp本身的数据。可以在后缀名后加‘::
D
A
T
A
’
,
绕
过
对
黑
名
单
的
检
测
。
使
用
B
P
抓
包
,
将
后
缀
名
改
为
>
.
p
h
p
:
:
DATA’,绕过对黑名单的检测。 使用BP抓包,将后缀名改为> .php::
DATA’,绕过对黑名单的检测。使用BP抓包,将后缀名改为>.php::DATA
(5)配合解析漏洞,构造‘点+空格+点’的形式实现文件上传。
使用BP抓包,将后缀名改为.php. .
(6)双后缀名绕过实现文件上传
使用BP抓包,将后缀名改为.pphphp
2、绕过白名单检查实现文件上传
常见的mime类型
1)超文本标记语言.html文件的MIME类型为:text/html
2)普通文本.txt文件的MIME类型为:text/plain
3)PDF文档.pdf的MIME类型为:application/pdf
4)MicrosoftWord文件.word的MIME类型为:application/msword
5)PNG图像.png的MIME类型为:image/png
6)GIF图像.gif的MIME类型为:image/gif
7)MPEG文件.mpg、.mpeg的MIME类型为:video/mpeg
8)AVI文件.avi的MIME类型为:video/x-msvideo
00截断
1) 0x00截断
0x00是十六进制表示方法,表示ASCII码为0的字符,在一些函数处理时,会把这个字符当作结束符。
0x00可以用在对文件名的绕过上,具体原理:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。也就是说系统是按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII码为0的位置在十六进制中是00。 总之就是利用ASCII码为0这个特殊字符,让系统认为字符串已经结束。
2) %00截断
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。总之就是%00被服务器解码为0x00发挥了截断作用。
3) 0x0a
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置。
(1)修改MIME类型,达到上传恶意文件的目的
使用BP,修改content-type即可
(2)$img_path直接拼接,利用%00截断进行绕过,上传恶意文件
上传test.jpg并使用burpsuite抓包,save_path改为…/upload/test.php%00:
(3)0x00截断绕过,利用burpsuite的hex功能将save_path改成…/upload/test.php[二进制00]形式,上传恶意文件
上传test.jpg并使用burpsuite抓包,利用burpsuite的hex功能将save_path改成…/upload/test.php[二进制00]形式:
在…/upload/后添加test.php (.php后面加空格),filename不用修改,然后点击‘Hex’:
将0d前面的20改为00,然后重传
3、绕过文件内容检查实现文件上传
(1)假设要上传图片马
我们上传一个后缀为gif的文件,使用BP抓包,添加GIF图片的文件头GIF89a。
(2)修改Content-Type,添加GIF图片的文件头GIF89a进行绕过
防御手段
1、前端限制(不配称为一种防御措施)
2、检查扩展名(黑白名单)
文件在被传到服务器端时,对文件名的扩展名进行检查
但存在一些webserver中,存在解析漏洞
1.老版本的IIS中的目录解析漏洞,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析
2.老板本的IIS中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg
3.旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行
4.nginx空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行
5.apache的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的
3、检查HTTP Header中的Content-type
HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改,不过加上一层防护也是可以有一定效果的
反制
使用各种各样的工具(如burpsuite)强行篡改Header就可以
4、分析文件头内容来检查文件类型
每一个特定类型的文件都有不同的开头和标志位,通过检查头几位字节,就可以分辨是否为正确文件。
5、限制web server对于特定文件的行为
导致文件上传漏洞的根本原因在于服务把用户上传的本应是数据的内容当作了代码,一般来说,用户上传的内容都会被存储到特定的一个文件夹下,比如我们很多人习惯于放在 ./upload/ 下面要防止数据被当作代码执行,我们可以限制web server对于特定文件夹的行为。
大多数服务端软件都可以支持用户对于特定类型文件的行为的自定义,以Apache为例:
在默认情况下,对与 .php文件Apache会当作代码来执行,对于 html,css,js文件,则会直接由HTTP Response交给客户端程序对于一些资源文件,比如txt,doc,rar等等,则也会以文件下载的方式传送的客户端。我们希望用户上传的东西仅仅当作资源和数据而不能当作代码
因此可以使用服务器程序的接口来进行限制
以Apache为例,我们可以利用 .htaccess 文件机制来对web server行为进行限制
在这里插一句,如果不是专门的文件下载目录,请务必关掉文件夹浏览的权限,以防止嗅探和可能的越权,也是使用.htaccess文件,在其中加上一句
Options All -Indexes
即可。
禁止脚本执行有多种方式可以实现,而且分别有不同的效果,我们分别来看一下
1.指定特定扩展名的文件的处理方式,原理是指定Response的Content-Type可以加上如下几行
AddType text/plain .pl .py .php
这种情况下,以上几种脚本文件会被当作纯文本来显示出来,你也可以换成其他的Content-Type
2.如果要完全禁止特定扩展名的文件被访问,用下面的几行
Options -ExecCGI
AddHandler cgi-script .php .pl .py . jsp .asp .htm .shtml .sh .cgi识别
在这种情况下,以上几种类型的文件被访问的时候,会返回403 Forbidden的错误
3.也可以强制web服务器对于特定文件类型的处理,与第一条不同的是, 下面的方法直接强行让apache将文件识别为你指定的类型,而第一种是让浏览器
ForceType text/plain
看代码就可以很明白的知道,符合上面正则的全部被认为是纯文本,也可以继续往里面加入其他类型。
4.只允许访问特定类型的文件
order deny,allow
deny from all
在一个上传图片的文件夹下面,就可以加上这段代码,使得该文件夹里面只有图片扩展名的文件才可以被访问,其他类型都是拒绝访问。
这又是一个白名单的处理方案
永远记得,白名单是最有保障的安全措施
反制http://www.pvc123.com/b-bydz/
可以通过 move_uploaded_file 函数把自己写的.htaccess 文件上传,覆盖掉服务器上的文件,来定义文件类型和执行权限如果做到了这一点,将获得相当大的权限。