文件上传
1. 定义
- 文件上传时,未考虑文件****格式、后缀的合法性校验问题,或只考虑在前端通过js进行后缀校验
2. 产生条件
-
未过滤或未严格过滤文件格式、后缀
- 文件检测被绕过
- 不完善的黑名单扩展名
- 文件路径被截断
-
中间件存在解析漏洞
-
HTTP****不安全方法(PUT)
3. 前提条件
- PUT方法未开启
- 存在文件上传功能点
- 上传目录具有****至少733权限
- Web容器****可以解析上传的脚本
- PUT方法开启
- 忽略以上条件
4. 防御
(1). 代码角度
- 采用****白名单策略,严格限制上传文件的后缀名
- 进行****二次渲染,过滤掉图片马中的恶意代码
- 上传****文件重命名,尽量少的从客户端获取信息
- 避免****文件包含漏洞
- 严格****处理文件路径、防御00截断漏洞,避开空格、点、::
$
DATA$
等Windows特性
(2). 服务器角度
- 及时更新Web容器,防止解析漏洞的产生
- 可写目录不给执行权限
5. 漏洞查找步骤
6. 绕过方式
(1). 前端js检测
- JS代码通常采用****白名单策略,检测文件后缀名
a. 修改JS代码
- JS运行环境为浏览器,可以****直接修改JS代码,甚至删除表单事件,禁用JS
b. 修改文件后缀
- 先使用****白名单后缀名,绕过JS检测,上传数据包
- 再使用****Burp拦截数据包,修改后缀名为原后缀
(2). 后端文件类型检测
a. MIME类型检测
抓包修改上传包的****Content-Type字段的MIME文件类型为服务器允许的类型
b. 文件头检测
在恶意脚本开始处加上文件头,绕过服务器的后端文件类型检测
- 文件头是****位于文件开头的一段承担一定任务的数据,就是为了描述文件的一些重要属性,例如图片长度、宽度、像素尺寸等
①常用图片文件幻数
图片格式 | 文件幻数(image number) |
---|---|
PNG | 89 50 4E 47 0D 0A 1A 0A |
JPG | FF D8 FF E0 00 10 4A 46 |
GIF | 47 49 46 38 39 61 |
②常用图片文件头
文件类型 | 文件头 |
---|---|
jpeg、jpg、png | JPGGraphic File |
gif | GIF89A |
doc、xls、ppt | MS Compound Document v1 or Lotus APProach APRfile |
zip | Zip Compressed |
(3). 白名单绕过
- 白名单策略:文件扩展名不在白名单中为不合法
a. 00截断
①利用条件
- php版本小于****5.2.4
- php的****Magic_quotes_gpc为OFF状态
②使用方法
- 知道上传路径
利用burp抓包,在上传路径后面加上1.php%00,然后将%00进行url编码。
- 不知道上传路径
**文件名改为1.php+.jpg,使用burp抓包后,**将+的hex数值改为00
b. 配合文件包含漏洞
- 制作图片马 **copy shell.php + 1.png shell.png **
- 上传图片马
- 通过文件包含漏洞使用图片马 上传后的相对路径 + include?file=/upload/shell.png
c. 中间件解析漏洞
①Apache
-
多后缀
- 存在版本
- Apache1.x和Apache2.x
- 解析规则
- 从右向左开始判断解析,如果后缀名为不可识别文件解析,则往左判断,直到能识别,否则会暴露其源码
- 能够识别的文件可以在****mime.types文件中查看
-
访问/test.php.aaa.bbb apache会右往左解析,直到.php
- 修复建议
- 后缀验证尽量使用白名单的方式
-
配置问题
- 产生原理
- 如果Apache的conf里有这样一行配置
AddHandler php5-script.php
,这时只要文件名里包含.php,即使文件名是其他后缀,也会以php来执行 - 如果在Apache的conf里有这样一行配置
AddType application/x-httpd-php .jpg
,即使扩展名是.jpg,一样以php方式执行
- 如果Apache的conf里有这样一行配置
- 修复建议
- apache配置文件中,禁止
.php.*
这样的文件执行,配置文件里面加入以下代码<Files~".(php.|php3.)"> Order Allow,Deny Deny from all </Files>
- 使用****伪静态能解决这个问题,重写类似.php.*这类文件,打开apache的httpd.conf找到
- apache配置文件中,禁止
- 产生原理
-
.htaccess文件解析
- htaccess文件可以****修改MIME类型,如果.htaccess文件可以上传,就尝试使用**.htaccess来配置其他文件**
- .htaccess文件内写入以下内容,成功后可以将指定后缀名文件解析为.php文件
<FileMatch ".jpg"> SetHandler application/x-httpd/php</FilesMatch> or AddType application/x-httpd/php .jpg or SetHandler application/x-http-php
②IIS6.0
- 目录解析
- 形式
-
/xx.asp/xx.jpg
-
- 原理
- 在网站下创建文件夹名字为
.asp
、.asa
的文件夹,其目录内的任何扩展名的文件都被当做asp文件来解析并执行
- 在网站下创建文件夹名字为
- 形式
- 文件解析
- 形式
-
/xx.asp;.jpg (利用特殊符号冒号;)
-
- 原理
- 在IIS6.0下,服务器****默认不解析
;
后面的内容
- 在IIS6.0下,服务器****默认不解析
- 形式
- 解析文件类型
- 形式
-
/test.asa 、 /test.cer 、 /test.cdx
-
- 原理
- IIS6.0默认的可执行文件除了asp还包括这三种
asa
cer
cdx
,会将这三种扩展文件解析为asp文件
- IIS6.0默认的可执行文件除了asp还包括这三种
- 形式
③PHP CGI解析漏洞
- 又称为IIS7.0/IIS7.5/Nginx1.x畸形解析漏洞
- 利用条件
- Fast-CGI运行模式
- php.ini文件cgi.fix_pathinfo=1(默认为1)
- 取消勾选****php.cgi.exe程序的 “Invoke handler only if request is mapped to”
- 形式
-
如果在一个文件路径/xx.jpg后面加上/xx.php,会将/xx.jpg/xx.php解析为php文件
-
- 修复方法
- 配置php.ini例cgi.fix_pathinfo=0,并重启服务器
- 在模块映射中勾选请求限制
- 利用条件
④空字节代码执行漏洞
- Nginx<8.03
- 影响版本
- 0.5、0.6、0.7<=0.7.65,0.8<0.8.37
- 原理
- 在使用php-FastCGI执行php时,URL遇到**%00空字节时,与FastCGI处理不一致**,导致可以在图片中嵌入PHP代码然后通过访问``xx.jpg%00.php` 来执行其中的代码
- 修复方法
- 在nginx中配置,禁止在上传目录下执行php,或在fcgi.conf配置中加入如下代码:
if($request_filename~*(.*)\.php) { set$php_url$1; } if(!-e$php_url.php){ return403; }
- 升级到最新版的nginx
- 在nginx中配置,禁止在上传目录下执行php,或在fcgi.conf配置中加入如下代码:
- 影响版本
(4). 黑名单绕过
a. 后缀名变形
①大小写
Windows服务器:使用pHp、PhP等词替换
②特殊后缀解析
php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml
③双写
若只过滤一次后缀名,双写即可
b. 特殊字符绕过
- Windows特性,在****结尾的点和语句中的空格以及文件流标识**::$Data**会被去除
- ::$Data后的数据会被当做文件流处理,不会检测后缀名
c. 00截断
d. 中间件解析漏洞
e. 配合文件包含漏洞
7. 编辑器漏洞
(1). FCKeditor
a. 漏洞版本
版本 | 漏洞说明 |
---|---|
Version2.2 | Apache + Linux环境下,在上传文件后面加个 . 突破 |
Version<=2.4.2 for php | 上传的地方并未对Media类型进行上传文件类型的控制,导致用户上传任意文件 |
Version <=2.4.3 | FCKeditor被动限制策略所导致的过滤不严问题 |
较高版本 | FCKeditor文件上传 . 变成 _ 下划线 |
b. 较高版本对应漏洞
①查看版本
方法1: /fckeditor/editor/dialog/fck_about.html
方法2: /fckeditor/_whatsnew.htm
②查看上传地址
/fckeditor/editor/filemanager/connectors/test.html
/fckeditor/editor/filemanager/connectors/uploadtest.html
/fckeditor/editor/filemanager/browser/default/connectors/test.html
/fckeditor/editor/filemanager/upload/test.html
③验证漏洞
#1. 在上传页面创建一个文件夹test.asp,结果变成了test_asp
#2. 使用递归创建or二次创建
#指令:
/fckeditor/editor/filemanager/connectors/asp/connectors.asp?command= CreateFolder&Type=类型&CurrentFolder=/一级目录名&Newfoldername=二级目录名
- 在一级目录
test.asp
中上传一个木马,然后就可以getshell了
(2). Ewebeditor
- 使用****默认的EWebEditor编辑器配置安全风险最高,默认情况下其编辑器的数据库可以通过浏览器下载,一旦破解其后台管理账号和密码,则可以通过修改其样式管理,达到上传asp网页木马的目的
a. 默认信息
- 默认数据库路径
/db/ewebeditor.mdb /db/db.mdb /db/%23ewebeditor.mdb
- 默认密码
admin/admin888 admin/admin admin/123456
- 系统默认
ewebeditor.asp?id=content1&style=standards
- 默认管理地址
#2.80以前 ewebeditor/admin_login.asp #以后版本 admin/login.asp