目录

  • 1 文件解析漏洞概述
    • 1.1 概述
    • 1.2 Nginx 解析漏洞
      • 1.2.1 空字节解析漏洞
      • 1.2.2 文件名逻辑漏洞 CVE-2013-4547
      • 1.2.3 CGI-PHP 解析漏洞
  • 2 实验
    • 2.1 实验目的
    • 2.2 实验环境
    • 2.3 实验一:空字符解析漏洞
    • 2.4 实验二:文件名逻辑漏洞
      • 2.4.1 启用实验环境
      • 2.4.2 踩坑排雷过程
      • 2.4.3 实验步骤
    • 2.5 实验三:CGI-PHP 解析漏洞
      • 2.5.1 启用实验环境
      • 2.5.2 实验步骤
      • 2.5.3 防御
  • 3 总结
  • 参考文献

1 文件解析漏洞概述

1.1 概述

  1. 定义:解析漏洞主要是一些特殊文件被IIS、Apache、Nginx等服务在某种情况下解释成脚本文件格式并得以执行而产生的漏洞。
  2. 相关文章分布:
    Nginx相关的文件解析漏洞参考本文;
    Apache相关的文件解析漏洞参考《中间件文件解析漏洞基础知识及实验——Apache》;
    IIS相关的文件解析漏洞参考《中间件文件解析漏洞基础知识及实验——IIS》。

1.2 Nginx 解析漏洞

1.2.1 空字节解析漏洞

  1. 概述:该漏洞影响版本为:0.5*, 0.6*, 0.7 <= 0.7.65, 0.8 <= 0.8.37,版本较老。
  2. 原因:在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可以在非PHP文件中嵌入PHP代码,然后通过访问xxx.jpg%00.php来执行其中的代码。

1.2.2 文件名逻辑漏洞 CVE-2013-4547

  1. 概述:该漏洞影响版本为: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7,范围较广。
  2. 原因:这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
  3. 漏洞产生过程:
    1. Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的代码写法如下。
    2. 正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。而存在CVE-2013-4547的情况下,我们请求 1.gif[0x20][0x00].php ,这个URI可以匹配上正则 .php$,可以进入这个Location块;但进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
    3. fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。
    4. 所以,我们只需要上传一个空格结尾的文件,然后在访问文件时诱导其以PHP解析。
location ~ \.php$ {include        fastcgi_params;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;fastcgi_param  DOCUMENT_ROOT /var/www/html;
}

1.2.3 CGI-PHP 解析漏洞

  1. 概述:该漏洞常见于IIS7.0、IIS7.5、Nginx <8.03等中间件,当浏览器采用1.jpg/.php的方式访问1.jpg文件时,jpg文件会以PHP程序执行。
  2. 原因:该漏洞的产生原因与中间件无关,主要是PHP配置上CGI.fix_pathinfo参数值默认为1,将其设置为0可以避免这个漏洞。
  3. cgi.fix_pathinfo参数作用:看名字就知道是对文件路径进行“修理”。何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。

2 实验

2.1 实验目的

  1. 加深对Nginx几种解析漏洞的理解;
  2. 掌握漏洞的检验及利用方法。

2.2 实验环境

  1. 在虚拟机安装CentOS系统,并完成图形化设置,可以参考文章《CentOS7虚拟机安装及界面图形化》。
  2. 部署Vulhub靶场环境。参考文章《CentOS上部署Vulhub靶场》。
  3. 需要不同靶场环境时,在官网查询相关靶场路径,进入对应路径进行实验即可。

2.3 实验一:空字符解析漏洞

  1. 暂时没有找到Nginx空字符漏洞环境,无法进行实验,仅简要描述该漏洞攻击的方式,以后有机会时间再练习。
  2. 步骤一,以图片马的方式提交文件以绕过。
  3. 步骤二,访问所上传的文件时,在文件后加上%00.php让服务器以PHP形式执行该文件,如IP+info.jpg%00.php

2.4 实验二:文件名逻辑漏洞

2.4.1 启用实验环境

  1. 参考Vulhub官网关于该漏洞的使用介绍,使用命令cd /usr/CVE/vulhub/nginx/CVE-2013-4547进入靶场安装目录(根据自己安装的位置灵活调整)。
  2. 使用命令docker-compose up -d启动靶场。
  3. 使用命令docker ps -a查询启动的容器。可以看到所启动的容器是采用8080端口来访问的。

2.4.2 踩坑排雷过程

  1. 上传文件名为info.php,内容代码为<?php phpinfo();?>
  2. 真实机打开BurpSuite,在代理界面打开自带浏览器,访问靶机8080端口,URL为192.168.1.10:8080
  3. 开启拦截功能,在网页中选中文件并点击提交按钮,可以看到BurpSuite成功拦截到请求,将该请求发送到Repeater模块。
  4. 将BurpSuite切换到repeater模块界面,将刚刚发送过来的请求点击send,可以看到响应为上传文件失败。
  5. 将文件名后缀修改为.jpg ,点击send,发现响应中说move_uploaded_file函数执行出错了,结合之前《文件截断绕过攻击实验》中对该函数的了解,其出错可能是路径出了问题或是写入权限出了问题,但是在该实验中其实是SELinux设置的问题,相关解决方案参考文章《CentOS7部署Vulhub靶场后,在启动漏洞容器时弹出SELinux警告,致使网站无法正常执行文件上传功能》。
  6. 经过上面文章设置之后,接着继续实验。
  7. 再次将请求发送到repeater模块,将文件名修改为jpg后缀,并点击发送。可以看到右侧文件成功上传,说明靶场环境搭建成功。

2.4.3 实验步骤

  1. 将上述请求的后缀名后面再加一个空格,并点击发送。可以看到文件成功上传,且后缀带有空格。
  2. 使用火狐浏览器访问刚刚上传的文件,可以看到文件是存在的,但是由于不是图片格式所以显示不了。
  3. 本来想使用BurpSuite拦截该请求,不知道为什么拦不到,只能先复制上面浏览器访问时的URL,然后在repeater模块中新建一页,右键点击"Paste URL as request"。
  4. 点击后出现以下请求,点击发送收到响应。可以看到响应正常并回显了文件的内容,但是由于后缀名格式问题并没有执行。
  5. 在请求的文件后缀加上 ..php,注意最前面是一个空格,点击发送手动响应如下,没有找打对应的文件。
  6. 将请求切换到十六进制模式,修改第一个点对应的值变为空字符,原理类似空字符截断,发送后可以看到响应中执行了文件代码。

2.5 实验三:CGI-PHP 解析漏洞

2.5.1 启用实验环境

  1. 参考Vulhub官网关于该漏洞的使用介绍,使用命令cd /usr/CVE/vulhub/nginx/nginx_parsing_vulnerability进入靶场安装目录(根据自己安装的位置灵活调整)。
  2. 使用命令docker-compose up -d启动靶场。
  3. 使用命令docker ps -a查询启动的容器。

2.5.2 实验步骤

  1. 真实机打开浏览器,输入靶机IP访问靶场。
  2. 使用命令http://192.168.1.10/uploadfiles/nginx.png访问靶机网站下的文件,可以看到图片正常显示。
  3. 使用命令http://192.168.1.10/uploadfiles/nginx.png/.php访问靶机网站下的文件,可以看到文件中的PHP代码被成功执行,由此也可知该图片为图片马。

2.5.3 防御

将php.ini文件中的cgi.fix_pathinfo的值设置为0,并将该行代码签名的分号去掉,保存并重启phpstudy。

3 总结

  1. 文件上传漏洞第一个条件是文件成功上传且没能过滤掉恶意代码;第二个条件是让代码执行。
  2. 对于第一个条件,存在着前端JS检测绕过、服务端MIME类型绕过、服务端后缀名绕过、文件内容绕过等,其根本目的是要上传文件。
  3. 对于第二个条件,当中间件为Nginx时:
    (1)优先考虑绕过后缀名时采用恶意代码能够执行的后缀,这样文件能直接执行;
    (2)其次,当Nginx版本较老时,比如老于小于0.8.37,考虑利用空字节解析漏洞执行该文件;
    (3)最后,考虑利用CVE-2013-4547和CGI-PHP解析漏洞来执行该文件。

参考文献

  1. 《Nginx 文件名逻辑漏洞(CVE-2013-4547)》

【文件上传漏洞11】中间件文件解析漏洞基础知识及实验——Nginx相关推荐

  1. 58.网络安全渗透测试—[文件上传篇8] —[. htaccess重写解析漏洞-突破上传]

    我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.. htaccess重写解析漏洞 1.重写解析漏洞的原理: 2.重写解析漏洞的利用: 一.. htacces ...

  2. php 文件上传mime 类型,php文件上传类型(MIME)对照表

    网上有很多php文件上传的类,文件上传处理是php的一个特色(至少手册上是将此作为php特点来展示的,个人认为php在数组方面的优异功能更有特色),学php的人都知道文件上传怎么做,但很多人在编程中却 ...

  3. SSM框架使用Layui文件上传插件实现多文件上传(多文件列表)

    SSM框架使用Layui文件上传插件实现多文件上传(多文件列表) pom.xml文件的配置 想要实现SSM框架实现多文件上传,必要的jar包必须要在pom.xml文件中引入.如下: <!--co ...

  4. php 上传文件后缀名,对应PHP文件上传后缀名与文件类型

    Internet上有许多PHP文件上传的处理方法,其实学习PHP的人都知道如何上传文件,但许多人可能会忽略编程中的一些细节,今天爱站技术频道小编为大家介绍对应PHP文件上传后缀名与文件类型. ie 火 ...

  5. 使用Apache文件上传控件实现文件上传

    本文使用Apache提供的第三方文件上传控件进行文件上传 1.导入第三方commons-fileupload-1.3.2.jar和commons-io-2.5.jar包 2.页面form标签需添加en ...

  6. php定义上传文件格式,对应PHP文件上传后缀名与文件类型

    Internet上有许多PHP文件上传的处理方法,其实学习PHP的人都知道如何上传文件,但许多人可能会忽略编程中的一些细节,今天爱站技术频道小编为大家介绍对应PHP文件上传后缀名与文件类型. ie 火 ...

  7. jquery文件上传插件 uploadify java_jQuery文件上传插件Uploadify使用指南

    对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持 Flash,主要特性:支持多文件上传.HTML5版本可拖拽上传.实时上传进度条显示.强大的参数 定制功能,如文件大小. ...

  8. php 拖动多个文件上传,dropzone拖拽文件上传一次上传多个文件的方法

    用dropzone插件拖拽文件上传默认情况是把一个文件拖到浏览器后就立即自动上传,参考前文<用dropzone插件拖拽文件上传>,如果需要一次上传多个文件怎么办?本文将介绍其实现方法. d ...

  9. hadoop HDFS的文件夹创建、文件上传、文件下载、文件夹删除,文件更名、文件详细信息、文件类型判断(文件夹或者文件)

    摘要: 本篇文章主要介绍的是hadoop hdfs的基础api的使用.包括Windows端依赖配置,Maven依赖配置.最后就是进行实际的操作,包括:获取远程hadoop hdfs连接,并对其进行的一 ...

  10. 基于OkHttp 、Retrofit 、Volley 、RxJava、Novate多种网络框架整合的快速项目开发框架,一行代码实现Ftp文件上传、文件下载、文件删除和进度监听的工具类的使用

    基于OkHttp .Retrofit .Volley .RxJava.Novate多种网络框架整合的快速项目开发框架,Ftp文件上传.文件下载的工具类的使用. 依赖于Ftp的jar包,对上传.下载.删 ...

最新文章

  1. Manacher 求最长回文子串算法
  2. 【论文串讲】从GPT和BERT到XLNet
  3. storm UI解释
  4. python语言key_Python语言学习:字典常用的方法
  5. 信息学奥赛一本通 2017:【例4.2】输出偶数
  6. MySQL 错误 1366:1366 Incorrect integer value
  7. lucene 增量 全量 更新索引_10年+,阿里沉淀出怎样的搜索引擎?
  8. 【优化预测】基于matlab飞蛾扑火算法优化LSSVM预测【含Matlab源码 110期】
  9. C++中使用sort函数给数组排序
  10. 北京2018积分落户名单
  11. 三菱PLC Q系列经典大型12轴Q01U 实际使用中程序,详细中文注释
  12. MapABC Flex地图官方API应用整理
  13. windows 两台电脑通过移动热点传输文件
  14. 在centos上安装vmware14
  15. 安装计算机一级出现appcrash,电脑appcrash的问题怎么修复
  16. 解决邮件附件乱码问题
  17. 表格怎么拆分成2个的简便操作
  18. 波段合成,去除黑边并提取土地利用数据....下
  19. iOS安全–看了这个,你还敢用分身版微信吗?
  20. 用koomail有条不紊分类管理邮件

热门文章

  1. 苹果14pro Max来了,做第一批吃蟹人
  2. 语义web一些简单示例
  3. 腾讯面试--测试工程师职位
  4. CREATE PROCEDURE
  5. 如何在不激活电脑的情况验机
  6. 彻底关闭华为系统更新教程,也可以激活系统更新,最全教程,亲测
  7. 使用linux集体升级系统,1.3. 利用mtd工具升级Linux系统
  8. R语言用igraph绘制网络图可视化
  9. 01.【入门必备】认识python-->Linux中python环境搭建-->Linux交互模式ipython
  10. Linux用户登录和注销