文件上传

1. 定义

  • 文件上传时,未考虑文件****格式、后缀的合法性校验问题,或只考虑在前端通过js进行后缀校验
    文件上传漏洞

2. 产生条件

  1. 未过滤或未严格过滤文件格式、后缀

    1. 文件检测被绕过
    2. 不完善的黑名单扩展名
    3. 文件路径被截断
  2. 中间件存在解析漏洞

  3. HTTP****不安全方法(PUT)

3. 前提条件

  1. PUT方法未开启
  1. 存在文件上传功能点
  2. 上传目录具有****至少733权限
  3. Web容器****可以解析上传的脚本
  1. PUT方法开启
    • 忽略以上条件

4. 防御

(1). 代码角度

  1. 采用****白名单策略,严格限制上传文件的后缀名
  2. 进行****二次渲染,过滤掉图片马中的恶意代码
  3. 上传****文件重命名,尽量少的从客户端获取信息
  4. 避免****文件包含漏洞
  5. 严格****处理文件路径、防御00截断漏洞,避开空格、点、::$DATA $Windows特性

(2). 服务器角度

  1. 及时更新Web容器,防止解析漏洞的产生
  2. 可写目录不给执行权限

5. 漏洞查找步骤

文件上传漏洞寻找步骤

6. 绕过方式

(1). 前端js检测

  • JS代码通常采用****白名单策略,检测文件后缀名
a. 修改JS代码
  • JS运行环境为浏览器,可以****直接修改JS代码,甚至删除表单事件,禁用JS
b. 修改文件后缀
  1. 先使用****白名单后缀名,绕过JS检测,上传数据包
  2. 再使用****Burp拦截数据包,修改后缀名为原后缀

(2). 后端文件类型检测

a. MIME类型检测

抓包修改上传包的****Content-Type字段的MIME文件类型为服务器允许的类型

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状态
②使用方法
  1. 知道上传路径

    利用burp抓包,在上传路径后面加上1.php%00,然后将%00进行url编码。

  2. 不知道上传路径

    **文件名改为1.php+.jpg,使用burp抓包后,**将+的hex数值改为00

b. 配合文件包含漏洞
  1. 制作图片马 **copy shell.php + 1.png shell.png **
  2. 上传图片马
  3. 通过文件包含漏洞使用图片马 上传后的相对路径 + include?file=/upload/shell.png
c. 中间件解析漏洞
①Apache
  1. 多后缀

    1. 存在版本
    • Apache1.xApache2.x
    1. 解析规则
      • 从右向左开始判断解析,如果后缀名为不可识别文件解析,则往左判断,直到能识别,否则会暴露其源码
      • 能够识别的文件可以在****mime.types文件中查看
      • 访问/test.php.aaa.bbb		apache会右往左解析,直到.php
        
    2. 修复建议
      • 后缀验证尽量使用白名单的方式
  2. 配置问题

    1. 产生原理
      • 如果Apache的conf里有这样一行配置 AddHandler php5-script.php,这时只要文件名里包含.php,即使文件名是其他后缀,也会以php来执行
      • 如果在Apache的conf里有这样一行配置 AddType application/x-httpd-php .jpg即使扩展名是.jpg,一样以php方式执行
    2. 修复建议
      • apache配置文件中,禁止 .php.* 这样的文件执行,配置文件里面加入以下代码
        <Files~".(php.|php3.)">
        	Order Allow,Deny
        	Deny from all
        </Files>
        
      • 使用****伪静态能解决这个问题,重写类似.php.*这类文件,打开apache的httpd.conf找到
  3. .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
  1. 目录解析
    1. 形式
      • /xx.asp/xx.jpg
        
    2. 原理
      • 在网站下创建文件夹名字为 .asp.asa的文件夹,其目录内的任何扩展名的文件都被当做asp文件来解析并执行
  2. 文件解析
    1. 形式
      • /xx.asp;.jpg	(利用特殊符号冒号;)
        
    2. 原理
      • 在IIS6.0下,服务器****默认不解析 ;后面的内容
  3. 解析文件类型
    1. 形式
      • /test.asa 、 /test.cer 、 /test.cdx
        
    2. 原理
      • IIS6.0默认的可执行文件除了asp还包括这三种 asa cer cdx,会将这三种扩展文件解析为asp文件

③PHP CGI解析漏洞
  • 又称为IIS7.0/IIS7.5/Nginx1.x畸形解析漏洞
    1. 利用条件
      1. Fast-CGI运行模式
      2. php.ini文件cgi.fix_pathinfo=1(默认为1)
      3. 取消勾选****php.cgi.exe程序的 “Invoke handler only if request is mapped to”
    2. 形式
      • 如果在一个文件路径/xx.jpg后面加上/xx.php,会将/xx.jpg/xx.php解析为php文件
        
    3. 修复方法
      1. 配置php.ini例cgi.fix_pathinfo=0,并重启服务器
      2. 在模块映射中勾选请求限制

④空字节代码执行漏洞
  • Nginx<8.03
    1. 影响版本
      • 0.5、0.6、0.7<=0.7.65,0.8<0.8.37
    2. 原理
      • 在使用php-FastCGI执行php时,URL遇到**%00空字节时,与FastCGI处理不一致**,导致可以在图片中嵌入PHP代码然后通过访问``xx.jpg%00.php` 来执行其中的代码
    3. 修复方法
      1. 在nginx中配置,禁止在上传目录下执行php,或在fcgi.conf配置中加入如下代码:
        if($request_filename~*(.*)\.php) {
        	set$php_url$1;
        }
        if(!-e$php_url.php){
        return403;
        }
        
      2. 升级到最新版的nginx

(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. 默认信息
  1. 默认数据库路径
    /db/ewebeditor.mdb
    /db/db.mdb
    /db/%23ewebeditor.mdb
    
  2. 默认密码
    admin/admin888
    admin/admin
    admin/123456
    
  3. 系统默认
    ewebeditor.asp?id=content1&style=standards
    
  4. 默认管理地址
    #2.80以前
    	ewebeditor/admin_login.asp
    #以后版本
    	admin/login.asp
    
b. 存在的漏洞