title: 文件上传
tags: 文件上传
abbrlink: 592e5fba
date: 2022-07-30 08:21:18

文件上传漏洞

Wb应用程序通常会有文件上传的功能,例如,在BBS发布图片、在个人网站发布ZP压缩包、在招聘网站上发布DOC格式简历等。只要Wb应用程序允许上传文件,就有可能存在文件上传漏洞。
上传漏洞与SQL注射相比,其风险更大,如果Wb应用程序存在上传漏洞,攻击者甚至可以直接上传一个WebShell到服务器上。
那么如何确认Wb应用程序是否存在上传漏洞呢?比如:我的网站是一个BBS论坛,由PHP语言编写,用户可以上传自己的个性头像,也就是图片文件,但文件上传时并没有对图片格式做验证,导致用户可以上传任意文件,那么这就是一个上传漏洞。

漏洞解析

攻击者在利用上传漏洞时,通常会与Wb容器的解析漏洞配合在一起。
常见的Web容器有IS、Nginx、Apache、Tomcat等,下面将以IIS、Apache容器为例讲解。


  1. 上传文件和文件执行是两个东西
  2. 漏洞分类:解析漏洞、cms漏洞、其他漏洞【编辑器漏洞、cve漏洞、安全修复】

思路:
如果有一个网站,要从文件上传的方向开始
第一步:先看中间件,看是否存在解析漏洞/CMS/编辑器漏洞/CVE/
如果有,如何找:
字典扫描:扫描会员中心,文件上传的位置
找到后,如何利用:
验证/绕过

文件解析漏洞

IIS 5.x/6.0解析漏洞

IIS 6.0解析利用方法有两种

  1. 目录解析

在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
例如创建目录 test1.asp,那么

将被当作asp文件来执行。假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了

  1. 文件解析
    test1.asp;.jpg
  • 第二种,在IIS6.0下,分号后面的不被解析,也就是说
    test1.asp;.jpg 会被服务器看成是wooyun.asp还有IIS6.0 默认的可执行文件除了asp还包含这三种
/test1.asa
/test1.cer
/test1.cdx

IIS 7.0/IIS 7.5/IIS8.0/8.5 /10.0解析漏洞

在默认Fast-CGI开启状况下,上传一个名字为test2.jpg,内容为

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

的文件,然后访问test2.jpg/.php,在这个目录下就会生成一句话木马 shell.php

www.xxx.com/logo.gif/*.php 触发漏洞(有漏洞会把前面文件当做php执行)

X.asp%00jieduan%jpg
a.aspx.a;.a.aspx.jpg..jpg 第二种解析漏洞或者直接上传 xx.asp

Apache解析漏洞

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.
比如 test3.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把test3.php.owf.rar解析成php.
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个test3.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀
任意不识别的后缀,逐级向上识别

.txt
x.php.zzzz.xxxdf
Phtml
Php3
Php4 
php5
X.phtml
Php空格
Php_
PHP

htaccess文件解析

如果在Apache中.htaccess可被执行.且可被上传.那可以尝试在.htaccess中写入:

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

然后再上传shell.jpg的木马, 这样shell.jpg就可解析为php文件

Nginx 空字节代码执行漏洞

  • 影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
  • Nginx在图片中嵌入PHP代码然后通过访问
xxx.php%00.jpg

来执行其中的代码

nginx畸形解析漏洞

默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件

将shell语句,如

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

写在文本xx.txt中(或者shell语句直接写一句话,用菜刀、cknife等直连,只是容易被查杀),然后用命令将shell语句附加在正常图片xx.jpg后

copy xx.jpg/b + xx.txt/a test.jpg

上传test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会生成一句话木马 shell.php

文件上传过程

上传检测流程概述

  • 通常一个文件以 HTTP 协议进行上传时,将以 POST 请求发送至 web 服务器 web 服务器接收到请求后并同意后,用户与 web 服务器将建立连接,并传输 data

文件上传的特征

  • 从中获取特征为:
请求Header中Content-Type存在以下特征:
multipart/form-data(表示该请求是一个文件上传请求)
存在boundary字符串(作用为分隔符,以区分POST数据)
  • POST的内容存在以下特征:
Content-Disposition
name
filename
POST中的boundary的值就是Content-Type的值在最前面加了两个--,除了最后标识结束的boundary
最后标识结束的boundary最后默认会多出两个--(测试时,最后一行的boundary删掉也能成功上传)

服务器命名规则

第一种类型:上传文件名和服务器命名一致
第二种类型:上传文件名和服务器命名不一致(随机,时间日期命名等)

文件上传检测绕过

  1. 客户端 javascript 检测 (通常为检测文件扩展名)
  2. 服务端 MIME 类型检测 (检测 Content-Type 内容)
  3. 服务端目录路径检测 (检测跟 path 参数相关的内容)
  4. 服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
  5. 服务端文件内容检测 (检测内容是否合法或含有恶意代码)

客户端检测绕过(javascript 检测)

  • 首先判断JS本地验证
  • 通常可以根据它的验证警告弹框的速度可以判断,如果你电脑运行比较快,那么我们可以用burp抓包,在点击提交的时候burp没有抓到包,就已经弹框那么说明这个就是本地js验证。
  • 绕过方法:
  1. 使用burp抓包改名
  2. 使用firebug直接删除掉本地验证的js代码
  3. 添加js验证的白名单如将php的格式添加进去

客户端白名单绕过

  • 修改允许上传类型

服务端检测绕过(MIME 类型检测)

  • MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

  • web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

  • Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,你可也去看一下。

  • MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

  • web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

  • Tomcat的安装目录\conf\web.xml 中就定义了大量MIME类型 ,你可也去看一下。

  • 绕过方法:

    直接使用burp抓包,得到post上传数据后,将 Content-Type: text/plain改成 Content-Type: image/gif
    就可以成功绕过。

服务端检测绕过(目录路径检测)

  • 目录路径检测,一般就检测路径是否合法,但稍微特殊一点的都没有防御。 比如比较新的 fckeditor php <= 2.6.4 任意文件上传漏洞

当 POST 下面的 URL 的时候

/fckeditor263/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&

CurrentFolder=fuck.php%00.gif  HTTP/1.0

CurrentFolder 这个变量的值会传到 ServerMapFolder($resourceType, $folderPath, $sCommand) 中的形参 $folder 里,而 $folder 在这个函数中并没做任何检测,就被 CombinePaths()了

修改文件上传路径

  • filepath路径修改绕过
    可以用来突破自动命名规则

xxxxx.gif

  1. 改变文件上传后的路径
    /a.asp/ 需要一定 的创建权限,不一定能成功创建
    成功创建后为
  2. 直接改变文件名称
    /a.asp;.
    修改后为

服务端检测绕过(文件扩展名检测)

  1. 黑名单检测
    黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多 一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件例如 fckeditor 2.4.3 或之前版本的黑名单

  2. 白名单检测
    白名单相对来说比黑名单安全一些,但也不见得就绝对安全了

绕过黑名单

  1. 文件名大小写绕过
    用像 AsP,pHp 之类的文件名绕过黑名单检测
  2. 名单列表绕过
    用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类
  3. 特殊文件名绕过
    比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式 在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会 被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。
  4. 0x00 截断绕过
    在扩展名检测这一块目前我只遇到过 asp 的程序有这种漏洞,给个简单的伪代码 name = getname(http request) //假如这时候获取到的文件名是 test.asp .jpg(asp 后面为 0x00)
    type = gettype(name) //而在 gettype()函数里处理方式是从后往前扫描扩展名,所以判断为 jpg
    if (type == jpg)
  5. .htaccess 文件攻击 配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测
  6. 解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞

绕过白名单

  1. 0x00 截断绕过
    用像 test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑 漏洞进行攻击,目前我只遇到过 asp 的程序有这种漏洞
  2. 解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞
  • .htaccess 文件攻击
    通过一个.htaccess 文件调用 php 的解析器去解析一个文件名中只要包含"haha"这个字符串的 任意文件,所以无论文件名是什么样子,只要包含"haha"这个字符串,都可以被以 php 的方 式来解析,是不是相当邪恶,一个自定义的.htaccess 文件就可以以各种各样的方式去绕过很 多上传验证机制
    建一个.htaccess 文件,里面的内容如下
<FilesMatch "haha">
SetHandler application/x-httpd-php </FilesMatch>

同目录有个我们上传一个只有文件名并包含字符串"haha",但是却无任何扩展名的文件 里面的内容是 php 一句话木马

双文件上传

竞争上传

  • 基于上传文件后名称不改变
  • 利用多线程并发访问触发上传后的文件,让其生成一个webshell

服务端检测绕过(文件内容检测)

  • 如果文件内容检测设置得比较严格,那么上传攻击将变得非常困难 也可以说它是在代码层检测的最后一道关卡 如果它被突破了,就算没有代码层的漏洞 也给后面利用应用层的解析漏洞带来了机会

绕过检测文件头

  • 主要是检测文件内容开始处的文件幻数.
  • 要绕过 jpg 文件幻数检测就要在文件开头写上下图的值
    Value = FF D8 FF E0 00 10 4A 46 49 46
  • 要绕过 gif 文件幻数检测就要在文件开头写上下图的值
    Value = 47 49 46 38 39 61
  • 要绕过 png 文件幻数检测就要在文件开头写上下面的值
    Value = 89 50 4E 47
  • 然后在文件幻数后面加上自己的一句话木马代码就行了

文件加载检测

这个是最变态的检测了,一般是调用 API 或函数去进行文件加载测试 常见的是图像渲染测试,再变态点的甚至是进行二次渲染(后面会提到) 对渲染/加载测试的攻击方式是代码注入绕过 对二次渲染的攻击方式是攻击文件加载器自身

先说下对渲染/加载测试攻击 - 代码注入绕过 可以用图像处理软件对一张图片进行代码注入 用 winhex 看数据可以分析出这类工具的原理是
在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区 对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的

绕过二次渲染

攻击函数本身
通过上传不完整的图片让其渲染函数暴露,然后攻击之。
第二种方法
对文件加载器进行溢出攻击。

表单提交按钮

写入表单

<input type="submit" value="提交" name="bb">

上传a.asa

小结

在经过分析上传漏洞之后,上传漏洞最终的形成原因主要有以下两点:

  • 目录过滤不严,攻击者可能建立畸形目录:
  • 文件未重命名,攻击者可能利用Wb容器解析漏洞。
    如果把握好这两点,上传漏洞的风险就大大减少了。
  • 接收文件及其文件临时路径。
  • 获取扩展名与白名单做对比,如果没有命令,程序退出。
  • 对文件进行重命名。
    以上步骤在代码阶段基本可以解决上传漏洞,但不能说完全防御,因为没有绝对的安全。
    比如Web容器使用为Apache,并且不识别RAR格式,攻击者就可以上传“正常文件”,配合Apache解析漏洞入侵。所以,不仅在程序编写方面要注意,在服务器配置、Wb容器配置也要注意,安全是个整体。
    上传漏洞是完全可以避免的,你需要做的仅仅是对路径进行验证、对文件进行随机重命名。