文件上传漏洞的小总结

目录

  • 一.原理
  • 二. 高危触发点
  • 三.前端处理
  • 四. 后端处理
  • 五. 上传分类
    • 1. js验证
      • 绕过方法
    • 2. 文件扩展名检测
      • (1). htaccsee上传漏洞
      • (2). Apache1.x,2.x解析漏洞
      • (3). iis解析漏洞
      • (4).编辑器解析漏洞
      • (5). iis 7.0/7.5解析漏洞
    • 3. MIME-type检测
      • 定义
      • 常见的mimetype类型:
      • 怎么检测
      • 绕过方法
    • 4. 文件头检测
      • 定义
      • 绕过文件头校验
      • 常见的文件头上传方式
    • 5. 条件竞争
      • 原理和绕过方法
  • 六. 防御
    • 修改配置
    • 判断文件类型
    • 使用随机数改写文件名和文件路径
    • 单独设置文件服务器的域名
    • 二次渲染
  • 七. 黑白名单
    • 黑名单
    • 白名单

一.原理

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

二. 高危触发点

相册、头像上传
视频、照片分享
附件上传(论坛发帖、邮箱)
文件管理器

三.前端处理




"upload_file.php"规定了处理上传数据的后台php脚本文件。
“method” 规定上传的方法为post方法
"enctype"规定了上传数据的编码方式,
multipart/form-data表示不进行编码,文件上传的表单一般采用这种

四. 后端处理

 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "
"; } else { echo "Upload: " . $_FILES["file"]["name"] . "
"; echo "Type: " . $_FILES["file"]["type"] . "
"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } ?>

服务器拿到上传的文件数据之后,会先将其存为一个临时文件,由$_FILES这个全局变量调取使用。
$_FILES里面有很多文件对应的属性,'type’表示上传文件的文件类型,'name’表示长传文件的文件名,'size’表示长传文件的文件大小,'tmp_name’表示临时文件的存储位置。
通过对这些属性进行判断与限制,可以控制文件上传的类别,大小等…

五. 上传分类

1. js验证

Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。

绕过方法

(1).删除或者禁用js
火狐浏览器禁用js:在页面输入about:config,打开后关闭javascript.enabled
(2).使用代理上传文件,比如Burp Suite

2. 文件扩展名检测

(1). htaccsee上传漏洞

在localhost目录的某目录下创建一个.htaccess文件
文件加效果内容

AddHandler php5-script .gif

那么该目录下所有的后缀名为.gif都可以被当成php文件执行,误伤范围较广,而且相对于php2018版本里5.5之后通通报错。

SetHandler application/x-httpd-php
AddHandler php5-script .gif

那么该目录下所有的后缀名为.gif都可以被当成php文件执行,针对单个文件使用,而且相对于php2018版本里5.5之后通通报错。

(2). Apache1.x,2.x解析漏洞

由于apache1和2点几的版本存在解析漏洞,会将文件名识别顺序由右至左的顺序,导致aaa.php.bbb会被识别成aaa.php,从而造成文件上传漏洞。
由于apache配置文件含有AddHandler php5-script .php这句话时,那么只要文件名含有.php,即使是.php.jpg后缀名的也可以当作php文件执行,经实验2018phpstudy可以执行成功的有5.4.45和5.5这两个版本,其他版本均出现以下内容。

(3). iis解析漏洞

打开虚拟机windows2003,然后安装好iis,然后在默认web的目录下新建后缀名为.asp的目录,再里面新建一个文本文档,内容为<%=now()%>,那么通过web网站浏览将会导致该文本被当作asp文件执行,即可造成asp攻击。
还可以直接新建一个文本,内容为<%=now()%>,然后改名为xx.asp;.jpg,由于服务器默认不解析;后面的内容,所有通过网页浏览该文件会被当成asp文件执行。

(4).编辑器解析漏洞

首先将文本编辑器放置windows2003虚拟机的iis默认网站目录下,对这个文件夹设置权限,对iis和internet来宾用户允许其完全控制。
利用iis远程打开/eweb/admin_login.asp,打开之后发现需要登陆账号密码,可以使用admin/admin,admin/admin888, admin/admin666,或者打开默认数据库路径 eweb/db/ewebeditor.mdb下载账号和密码。
然后就可以用mdbview.exe打开下载文件获得经md5加密后的账号和密码
登陆文本编辑器的网页,进入上传文件管理,然后在url输入&dir=…出现以下情况。
调整文本编辑器的环境,打开iis服务器,打开默认网站的属性,打开主目录下的配置里的选项,勾上启用父路径。
在网页加上&dir=…/…/…/…/windows/system32/drivers/etc即可出现host文件了。
由于浏览器版本问题,使用虚拟机win3打开该网页的样式管理,然后设置属性,保证可以上传asp文件。
打开预览选中插入或修改图片这个按钮上传asp文件,然后点下面代码按钮查看地址,在浏览器打开即可。

(5). iis 7.0/7.5解析漏洞

7.0iis使用fastcgi配置会将*.php当成php执行,而7.0iis要判断php文件时会先让php软件去判断,但是由于php软件判断的文件不存在的话,会将上一层文件当成php文件去判断,从而造成漏洞注入。
搭设完环境后,在iis目录下创建一个phpinfo.php文件,内容为,文件重命名为phpinfo.png,然后使用web远程打开192.168.19.129/phpinfo.png/1.php,这时候由于1.php不存在,phpinfo.png会被当成php文件去执行。

3. MIME-type检测

定义

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

常见的mimetype类型:

	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文档)

怎么检测

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];          
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }
}

绕过方法

使用bp抓包发送到repeater模块,然后修改Content-Type的类型,修改为目标检测的类型

4. 文件头检测

定义

文件头就是为了描述一个文件的一些重要的属性,比如图片的长度、宽度、像素尺寸等,当程序打开文件时读取这些属性对文件进行处理。

绕过文件头校验

Web应用程序在校验文件类型、文件扩展名的同时,也会校验文件头,从而进一步确定文件的类型。针对这种情况,可以通过在上传的一句话木马文件的开头加入特定的文件头从而绕过这种校验方式。

常见的文件头上传方式

(1) .JPEG;.JPE;.JPG:”JPGGraphic File”
(2) .gif:”GIF 89A”
(3) .zip:”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr:”MS Compound Document v1 or Lotus Approach APRfile”

5. 条件竞争

原理和绕过方法

利用PHP代码逻辑漏洞,由于代码的逻辑造成文件先上传成功再判断是否符合要求再删除,可以利用上传之后删除之前的时间差进行漏洞攻击,由于时间较少,可以利用bp抓包使用多次攻击,使上传文件执行,因为文件会被删除,所以可以上传可执行文件,执行后产生一句话木马文件达到长久漏洞注入目的。(文件可以利用fopen函数)

六. 防御

修改配置

文件上传目录设置权限为不可执行,那么即使利用上传漏洞成功上传,上传的文件也无法执行,造成不了漏洞攻击。
指定特定扩展名的文件的处理,原理是指定Response的Content-Type可以加上AddType text/plain .pl .py .php,意思是把以上后缀名的文件当成纯文本来显示。
完全禁止特定扩展名的文件被访问,加入
Options-ExecCGI
AddHandler
cgi-script .php .pl .py .jsp .asp .htm .shtml .sh
在这种情况下,以上几种类型的文件被访问的时候,会返回403Forbidden的错误。
只允许访问特定类型的文件:

Order deny,allow
Deny from all

判断文件类型

结合使用MIME Type、后缀检查等方式,在文件类型检查中,强烈推荐使用白名单方式,黑名单方式已经无数次被正面是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码;或者使用白名单的时候,使用分割字符串(上传来的文件名),使用”.”来分割,仅允许分割后,字符串只有两个,一个是文件名,一个是文件扩展名。

使用随机数改写文件名和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写文件名和路径,将极大增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击

单独设置文件服务器的域名

把网站服务器和服务器分开,但是要保证,文件服务器的安全级别很高,且保证上传文件时相对高的可靠,直接把上传的图片存储在文件服务器,并在文件服务器把所有目录设置为可读可写不可执行。

二次渲染

将上传的图片利用imagecreatefromjpeg()函数重新生成新图片,并且将图片里的代码给去除,达到防御的目的,但是可以用条件竞争进行漏洞攻击。

七. 黑白名单

黑名单

1.截断
2.服务器的解析漏洞
3.大小写进行上传
4.使用多种后缀名方式绕过
jsp jspx jspf
asp asa cer aspx
php php3 php4 php5
exe exee
5.Windows特性
shell.php. shell.php空格 shell.php:1.jpg shell.php:: $DATA
. 空格 ntfs数据流特性

白名单

1.截断
2.服务器的解析漏洞
3.文件包含漏洞

你可能感兴趣的:(文件上传漏洞的小总结)