文件上传 漏洞
0x00文件上传漏洞 概述
什么是文件上传漏洞
- 文件上传漏洞是指程序员在开发仼意文件上传功能时, 并未考虑文件格式后缀的合法性校验或者是只考虑在前端通过 js 进行后缀检验 。这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如 jsp、asp、php、aspx 文件后缀)到服务器上,从而攻击者访问这些恶意脚本对包含的恶意代码动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。
漏洞的成因
-
未过滤或 Web 前后端过滤被绕过
-
文件检测被绕过
-
中间件解析
-
不完善的黑名单扩展名
-
文件路径截断
-
HTTP 不安全方法(PUT 协议)
文件上传漏洞的高危触发点
- 常见存在漏洞的位置
-
头像、相册上传
-
视频、照片分享
-
论坛发帖、留言、邮箱附件上传
-
添加文章图片
-
编辑器文件上传
-
后台添加模板类
-
存在漏洞的网站类型
-
存在文件上传功能的网站皆有可能出现文件上传漏洞
文件上传漏洞的利用条件
-
Web 服务器开启文件上传功能 ,并且上传 api 对外“开放”(Web 用户可以访问)
-
Web 用户对目标目录具有可写权限,甚至具有执行权限 。一般情况下,Web 目录都有执行权限。
-
要想完美利用文件上传漏洞,上传的文件要可以执行,即 web 容器可以解析上传的脚本 ,无论脚本以什么样的形式存在。
-
无视以上条件的情况就是服务器配置不当 ,开启了 PUT 方法
0x01 文件上传漏洞 原理
- 对上传的文件后缀没有进行合法性校验就直接存储到服务器中
0x02 文件上传漏洞 危害
-
上传漏洞与 SQL 注入或 ⅩSS 相比,其风险更大 ,如果 web 应用程序存在上传漏洞,攻击者上传的文件是 web 脚本语言,服务器的 web 容器解释并执行了用户上传的脚本,导致代码执行。
-
比如:如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
-
攻击者甚至可以直接上传一个 webshell 到服务器上完全控制系统或致使系统瘫痪。
0x03 文件上传漏洞 利用
文件上传漏洞的分类
前端检测
前端JS检测
如何进行前端 JS 检测
-
在客户端使用 JS 脚本判断上传的文件名是否在白名单之内,如果不符合则拒绝上传
-
经典代码
前端 JS 检测绕过方法
-
JS 代码通常采用白名单策略 ,检测文件后缀名 。配合表单事件使用。前端 JS 脚本检测的安全防御是十分薄弱的 。可以非常轻松的绕过。
-
绕过方法
-
方法一:因为 JS 脚本的运行环境是浏览器,我们可以修改 JS 代码 ,甚至删除表单事件 ,禁用 JS 。
-
方法二:使恶意文件后缀名符合白名单策略,用 Burp 挂代理抓包 ,然后修改文件后缀名即可。
-
说明:对于文件上传,Web 应用系统虽然对用户上传的文件进行了校验,只从 Web 前端进行检测防护不足 ,由于恶意用户可以对前端 javascript 进行修改 或者是通过抓包软件篡改 上传的文件,就会导致基于 js 的校验很容易被绕过 。
-
注意:仅前检测文件上传是远远不够的,需要结合后端服务器进行检测检测
后端检测
MIME-TYPE 检测
MIME 概述
-
MIME(Multipurpose Internet Mail Extensions)是描述消息内容类型 的因特网标准。
-
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,当具有该扩展名的文件被访问时,浏览器会自动使用指定的应用程序打开。
-
协议中,使用 Content-Type 字段表示文件的 MIME 类型
-
常见的 MIME 拓展名:
MIME-TYPE 检测
-
MIME-TYPE 检测 也称 content-type 检测,在服务器端如果上传文件的 MIME-TYPE 与白名单一致,则允许上传
-
经典代码
MIME-TYPE 检测 绕过方法
- 由于服务器在检测 Content-Type 类型的时候,取得的变量来自于用户,所以可以用 Burp 抓包,修改字段使其合法 ,即可绕过限制上传任意文件。
- 上传一个 php 文件,该文件的 content-type 类型不在白名单中
- 通过 Burp 抓包修改这个字段,改为常见的图片类型,如 image/jpeg ,从而绕过校验
文件内容检测
什么是文件头?
- 文件头是位于文件开头的一段承担一定任务的数据,就是为了描述 文件的一些重要属性,比如图片的长度、宽度、像素尺寸等,一般都在开头的部分
- 常见的图片格式文件头(文件幻数)
- 常见的文件头对应关系
文件头检测概述
-
介绍
-
文件头检测是使用对于文件内容 的验证机制,这种方法利用的是:每一个特定类型的文件都会有不太一样的开头或者标志位,也就是我们常说的文件幻数
-
文件幻数:可以用来标记文件 或者协议的格式 ,很多文件都有幻数标志来表明该文件的格式
-
相关函数
-
函数名: getimagesize()
-
说明:这个函数本意是检查图片的大小 ,但是在检查之前,该函数会判断目标文件是否是一张图片 。因此,可以用该函数来检测文件的内容
-
检测过程
-
getimagesize() 函数
-
用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条错误信息。
-
语法:getimagesize ( string filename )
-
例子:
-
浏览器显示如下:
- 相关代码:
文件内容检测的绕过方法
-
说明
-
通过伪造合法的文件头可以绕过这种检测
-
通常检测函数根据文件的前 10 个字节,就可以判断出文件的类型,而图片的文件头一般都是固定的
-
方法
-
在恶意脚本前加上文件头 即可,如 GIF89a
-
制作图片马 ,可以通过命令行生成 copy 1.jpg/b + 1.php/a 2.jpg
-
使用 010 editor 等编辑工具打开一张图片,在图片中加上 webshell 脚本
-
过滤 PHP 代码中的 <?
-
绕过:可以使用 PHP 的 JS 风格绕过
<script language="php">phpinfo();</scirpt>
黑白名单检测
黑白名单介绍
-
原因:对于文件上传模块来说,尽量避免上传可执行的脚本文件,为了防止上传脚本需要设置对应的验证方式
-
分类:
-
基于白名单验证:当上传的文件后缀名是在白名单中有的 后缀名,文件才能上传成功
-
基于黑名单验证:当上传的文件后缀名是在黑名单中没有 的后缀名,文件才能上传成功
黑名单检测方法
- 经典代码:
- 代码中 $deny_ext 数据就是一个黑名单,数组元素就是不允许上传的类型
白名单检测方法
-
介绍:会有个专门的白名单数组,对于后缀名白名单策略,我们只能上传在白名单内的文件后缀名
-
经典代码:
绕过黑名单检测
大小写、双写绕过
-
用像 AsP,pHp,phphpp 之类的文件名,如果黑名单上不存在的话就可以绕过黑名单检测
-
过滤严格的话一般会用 strtolower() 函数把后缀名全变为小写,此时就不能绕过黑名单了
特殊文件名绕过
Windows 系统下
-
上传不符合 windows 文件命名规则的文件名,会被 windows 系统自动去掉不符合规则符号 后面的内容
-
常见的特殊文件名绕过有
- windows 流文件详解
Linux / Windows 系统下
- 可以尝试后缀名大小写,比如如果上传 php 不被解析,可以试试上传 pHp 后缀的文件名
黑名单不全
- php3\php5\phtml asp.cer\aspx\asmx
绕过白名单检测
- 白名单策略相比黑名单策略更安全,但依然可以被绕过
解析漏洞
-
什么是文件解析
-
是指当服务器接收到一个 HTTP 请求的时候,web 容器(如 IIS、Apache)首先会根据文件的后缀名,决定如何处理这个请求
-
当服务器获取到所请求的页面的后缀(如 php)后,接下来就会在服务器端寻找可以处理这类后缀名的应用程序 ,如果找不到则直接把这个文件返还给客户端
-
漏洞的利用
-
由于中间件(如 IIS、 Apache)本身的缺陷,在对上传文件进行解析时会出现一些不可预料 的错误从而导致被利用进行文件上传绕过
-
常见的解析漏洞
-
Apache 解析漏洞
-
IIS6.0 解析漏洞
-
PHP CGI 解析漏洞
-
Nginx 解析漏洞
Apache 解析漏洞
- 多后缀
-
存在的版本:Apache1.x 和 Apache2.x ,2.4不存在此漏洞
-
解析规则:从右向左 开始判断解析,如果后缀名为不可识别文件解析,就再往左判断,若都不认识 ,则会暴露源码
-
举例:
-
可以上传一个 test.php.aaa.bbb 文件,绕过验证且服务器依然会将其解析为 php
-
访问/ test.php.aaa.bbb,由于 Apache 不认识 aaa 和 bbb,会从右向左一直谝历到后缀 .php 为止
-
apache 能够识别的文件在 mime.types 文件可以查看
-
修复方案:后缀验证尽量使用白名单 的方式,这样即使使用不存在的后缀名,也无法绕过
- 配置问题导致漏洞
-
漏洞产生原因:
-
如果在 Apache 的 conf 里有这样一行配置 AddHandler php5- script .php 这时只要文件名里包含.php,即使文件名是 test2.php.jpg 也会以 php 来执行
-
如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行
-
修复方案
- 在 apache 配置文件中,禁止.php. 这样的文件执行,配置文件里面加入
-
用伪静态能解决这个问题,重写类似 php 这类文件,打开 apache 的 httpd.conf 找到
-
.htaccess 文件解析
-
.htaccess 文件可以配置很多事情,如是否开启站点的图片缓存、自定乂错误页面、自定义默认文档、等等。但我们这里只关心 htaccess 文件的一个作用 ———— MIME 类型修改
-
如果 Apache 中 .htaccess 可被执行并可被上传,那么可以尝试在 .htaccess 中写入
<FilesMatch"sheLl.jpg"> SetHandler application/x-httpd-php </FilesMatch>
-
该语句会让 Apache 把 shell.jpg 文件当作 php 文件来解析
-
另一种写法是:
AddType application/x-httpd-php .xxx
- 如果写入,就成功地使该 .htaccess 文件所在目录及其子目录 中的后缀为.xxx 的文件被 Apache 当做 php 文件
IIS6.0 解析漏洞
- 目录解析
-
形式:/x.asp/x.jpg
-
原理:在网站下创建文件夹名字为.asp、.asa 的文件夹,其目录内的任何扩展名的文件都被当作 asp 文件来解析 并执行。因此只要攻击者只需通过该漏洞上传图片马,不用修改后缀名
- 文件解析
-
形式:/x.asp;.jpg (利用特殊符号";")
-
原理:在 IIS6.0 下,服务器默认不解析; 号后面的内容,所以 xx.asp;.jpg 被解析为 asp 脚本
- 解析文件类型
-
形式:/ test.asa、/test.cer、/test.cdx
-
原理:IIS6.0 默认的可执行文件 除了 asp,还包含这三种 asa、cer、cdx ,会将这三种扩展名文件解析为 asp 文件
-
修复:
-
目前尚无微软官方补丁,可以通过自己编写正则,阻止上传 xx.asp;.jpg 类型的文件名
-
做好权限设置 ,限制用户创建文件夹
路径修复漏洞
-
别名:PHP CGI 解析漏洞 或 畸形解析漏洞
-
适用于:IIS7.0 / IIS7.5 / Nginx1.x
-
利用条件:
-
Fast-CGI 运行模式
-
php. ini 里 cgi.fix_pathinfo=1 (默认为 1)
-
取消勾选 php-cgi.exe 程序的 "lnvoke handler only if request is mapped to"
- 形式:如果在一个文件路径 /xx.jpg 后面加上/xx.php 会将 /xx.jpg/xx.php 解析为 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",以此类推
-
修复方法:
-
配置 php.ini 里 cgi.fⅸ_patinfo=0,并重启服务器
-
在模块映射中勾选请求限制
Nginx 0.5,0.6 ,0.7<=0.7.65,0.8<=0.8.37
-
00截断,和php-fpm
-
1.jpg%00.php
文件名解析总结
其他绕过方式
配合文件包含绕过
00截断
-
原理:0x00 是字符串的结束标识符 ,可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测,00 就是 Null(空)字符,∪RL 中表现为 %00
-
利用条件
-
php 版本小于 5.3.4
-
php 的 magic_quotes_gpc 为 OFF 状态
- 方法:
-
知道上传路径:用 burp 抓包在上传路径后面加上 1.php%00 ,然后将 %00 进行 url 编码
-
不知道上传路径:文件名改为 1.php+.jpg,这个 + 其实就是个标识作用,burp 抓包后,用 hex 打开将 + 的数值改为 00
编辑器漏洞
什么是编辑器?
-
编辑器就是网站后台编辑网页的在线编辑器 ,自动集成了文件上传 、图片视频上传、远程下载等功能,减少了程序开发的时间
-
编辑器比网站自带的上传按钮安全性髙,但这些编辑器某些版本存在文件上传漏洞 ,因此也存在通用型漏洞 带来的危害
常见的文本编辑器
-
FCKeditor
-
Ewebeditor
-
Ueditor
-
KindEditor
-
XHeditor
FCKeditor 概述
-
FCKeditor 编辑器介绍
-
FCKeditor 是一款开放源码的 HTML 文本编辑器,可以为用户提供微软 office 软件一样的在线文档编辑 服务。
-
FCKeditor 不需要安装任何形式的客户端,且兼容绝大多数主流浏览器,支持 PHP、jsp、asp、 python 等编程环境
-
FCKeditor 各个版本的漏洞
FCKeditor 编辑器文件上传漏洞
- 以较高版本为例,文件上传 "." 变 "_" 下划线:
- 查看编辑器版本 ,使用以下两种方法判断 FCKeditor 版本:
-
/fckeditor/editor/dialog/fck_about.html
-
/fckeditor/_whatsnew.html
- FCKeditor 中 test 文件的上传地址
- test 文件常见上传地址:
fckeditor/editor/filemanager/connectors/test.html
fckeditor/editor/filemanager/connectors/upload/test.html
fckeditor/editor/filemanager/browser/default/connectors/test.html
fckeditor/editor/filemanager/upload/test.html
- 在上传页面创建一个文件夹 test.asp,结果却变成了 test_asp
- 由于直接创建失败,进行文件夹图谱,方法就是:递归创建 ,二次创建。这样一级目录名就不会变为"_"下划线
- 在一级目录 test.asp 中上传一个木马。然后就可以 getshell 了
Ewebeditor 编辑器概述
-
Ewebeidtor 编辑器介绍
-
EWebEditor 是一款著名的 web 编辑器 ,由于功能强大因此在很多网站都使用它来作为一款编辑器
-
EWebEditor 中安全风险最高的就是使用默认的 EWebEditor 编辑器配置 ,默认情况下其 EWebEditor 的数据库可以通过浏览器下载 ,一旦破解其 EWebEditor 后台管理账号和密码,则可以通过修改其样式管理 ,达到上传 asp 网页木马 的目的
-
因此配置不当极有可能导致整个网站处于危险状态,在一定条件下还有可能完全控制提供该 web 服务的服务器
-
Ewebeidtor 编辑器的默认信息
-
默认数据库路径:/db/ewebeditor.mdb /db/db.mdb /db/%23ewebeditor.mdb
-
默认密码:admin/admin888 或 admin/admin 进入后台,也可尝试 admin/123456/admin888
-
系统默认:ewebeditor.asp?id=content1&style=standards
-
默认管理地址:2.80 以前:ewebeditor/admin_login.asp;以后版本: admin/logIn.asp
Ewebeditor 编辑器漏洞
PUT上传
0x04文件上传漏洞 防御
-
关于文件上传的防御,防住危险的脚本类型 是最基本的防御,最理想的是能够过滤掉图片马中的恶意代码 。如果一个 Web 应用能够上传图片木马,那么我们认为这个 Web 应用是不安全的。文件上传漏洞的防御主要从以下几个方面考虑。
-
代码角度
-
采用白名单策略 ,严格限制上传文件的后缀名。
-
进行二次渲染 ,过滤掉图片马中的恶意代码。
-
上传文件重命名 ,尽量少的从客户端获取信息。
-
避免文件包含 漏洞。
-
严格处理文件路径 ,防御 00 截断漏洞,避开空格、点、::$DATA 等 windows 特性。
-
服务器角度
-
及时更新 web 容器 ,防止解析漏洞的产生。
-
可写目录不给执行权限 。