文件上传漏洞

文件上传漏洞

一、文件上传原理
1.在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。
文件上传漏洞_第1张图片

2.文件上传漏洞对Web应用来说是一种非常严重的漏洞。一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应用没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等Webshell,从而达到控制Web网站的目的。

二、文件上传漏洞高危触发点
1.相册、头像上传
2.视频、照片分享
3.附件上传(论坛发帖、邮箱)
4.文件管理器

三、文件上传的防御方式
1.客户端(前端js检测)文件上传漏洞_第2张图片
2.服务端
文件的扩展名检测
黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。
白名单检测:一般有个专门的 whitelist 文件,里面会包含的正常文件。
Jpg png GIF
文件上传漏洞_第3张图片

四、文件上传的绕过方式
绕过黑名单的方式
1.解析漏洞
2.截断上传
3.可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
4.双写php-比如pphphp之类
5.找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类
jsp jspx jspf asp asa cer aspx php php2 php3 php4 php5 phtml exe exe
6.利用Windows的命名机制:shell.php. shell.php空格 shell.php:1.jpg shell.php:: $DATA
绕过白名单的方式
1.解析漏洞
2.截断上传%00(条件限制)
路径可控
php参数 magic_puotes_gpc=off关闭
3.文件包含
绕过上传限制-服务端绕过MIME检测
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
常见的MIME类型
text/plain(纯文本)
text/html(HTML文档)
text/javascript(js代码)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(二进制数据)
application/pdf(PDF文档)
检测方式
在这里插入图片描述
部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。
绕过方式
文件上传漏洞_第4张图片
文件头部检测(文件头就是为了描述一个文件的一些重要的属性,比如图片的长度、宽度、像素尺寸等,当程序打开文件时读取这些属性对文件进行处理)
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条错误信息。
语法:
getimagesize( string filename ) 例子:

浏览器显示如下:
Array ( [0] => 350 [1] => 318 [2] => 2 [3] => width=“350” height=“318” [bits] => 8 [channels] => 3 [mime] => image/jpeg ) 返回结果说明
索引 0 给出的是图像宽度的像素值
索引 1 给出的是图像高度的像素值
索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的 标签
索引 bits 给出的是图像的每种颜色的位数,二进制格式
索引 channels 给出的是图像的通道值,RGB 图像默认是 3
索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如:header(“Content-type: image/jpeg”);
文件上传漏洞_第5张图片
MIME-type规定了打开文件的时候默认使用的应用程序
文件头就是用来规定文件的一些必要属性的,当应用程序打开文件时读取这些属性值来处理这些文件
同一张图片存储为jpg格式和png格式时,文件的大小是不同的,即数据在两种格式的文件中存储的方式是不同的,因此文件头也就不同
Web应用程序在校验文件类型、文件扩展名的同时,也会校验文件头,从而进一步确定文件的类型。针对这种情况,可以通过在上传的一句话木马文件的开头加入特定的文件头从而绕过这种校验方式
绕过方式
文件上传漏洞_第6张图片
常用的三个图片格式文件头(使用cs32软件)
png
89 50 4E 47 0D 0A 1A 0A
gif
47 49 46 38 39 61
JPG
FF D8 FF E0 00 10 4A 46 49 46
图片码的生成(cmd)
copy 1.png /b + 1.php /a 2.php
文件上传检测与绕过之.htaccesss
该方法使用的前提:web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的.htaccess文件
原理:.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
利用方式:上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
创建方式
win10 直接可以创建以.htaccess的文件
win10以下版本(cmd) cmd -> echo hello world > .htaccess
1.将当前目录下所有文件解析成php文件

<IfModule mime_module>
SetHandler application/x-httpd-php
</IfModule>

2.将当前目录下后缀名为jpg的文件解析成PHP文件

<IfModule mime_module>
AddHandler php5-script .jpg
</IfModule>

3.将当前目录下文件名为1.jpg的文件解析成PHP文件

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

五、常见的解析漏洞
文件上传漏洞_第7张图片
1.apache 1.x 2.x解析漏洞(实验环境:wamp2.0)
漏洞原理
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.a.b的“.a”和”.b” 这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。
漏洞形式:
www.test.com/test.php.a
其余配置问题导致漏洞
如果在 Apache 的配置文件中有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php. 即使文件名是 test2.php.jpg 也会以 php 来执行
如果在 Apache 的配置文件中有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行
如何查看Apache的版本
在phpinfo中查看
2.IIS6.0解析漏洞
目录解析
原理: 服务器默认会把xx.asp目录下的文件都解析成asp文件
形式:www.xxx.com/xx.asp/xx.jpg
文件解析
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了
形式:www.xxx.com/xx.asp;.jpg
3.nginx解析漏洞( 实验环境:Nginx1.4.6 )
漏洞原理
Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回“Access denied.”
这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行“修理”。举个例子,当php遇到文件路径“/1.jpg/2.txt/3.php”时,若“/1.jpg/2.txt/3.php”不存在,则会去掉最后的“/3.php”,然后判断“/1.jpg/2.txt”是否存在,若存在,则把“/1.jpg/2.txt”当做文件“/1.jpg/2.txt/3.php”,若“/1.jpg/2.txt”仍不存在,则继续去掉“/2.txt”,以此类推
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
4.IIS7.5解析漏洞
IIS7.5的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者iis7.5本身的漏洞
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
5.windows系统解析漏洞
旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行
漏洞形式
test.asp.
test.asp(空格)
test.php:1.jpg
test.php:: $DATA
6.条件竞争
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生
文件上传漏洞_第8张图片
六、文件上传漏洞的防御
1.文件上传目录设置为不可执行
利用.htaccess文件对web服务器进行限制,禁止执行脚本文件,前提是该类型的文件一定要禁止上传
2.文件类型判断
MIME-TYPE检测/后缀名检测,强烈推荐使用白名单
使用压缩函数或者resize函数对上传的图片进行处理,去掉图片中的HTML代码
3.使用随机数改写文件名和文件路径
4.单独设置文件服务器
在文件服务器把所有目录设置为可读可写不可执行
保证文件服务器的安全级别很高,并且上传的文件十分可靠
5.二次渲染
imagecreatefromjpeg:由文件或 URL 创建一个新图象
imagejpeg:输出图象到浏览器或文件
6.防御总结
文件上传漏洞的主要防护思路就是检测上传文件是否符合允许的文件类型,可以根据文件头部来判断文件类型;如果是图片类型文件,可利用PHP函数判断图片是否有效,或者对图片重新绘图,生成新的的图片。上传后的文件,要进行随机化重命名,让攻击者无从猜测。
无论上传的资源类型是哪一种,上传目录都要禁止执行权限;可写不执行,执行不可写。这样,就算恶意脚本绕过前面的重重限制最终上传到了服务端也没有解析,其危害也非常有限

你可能感兴趣的:(安全,web漏洞,web渗透,安全,web,服务器,程序人生,sql)