【文件上传漏洞-07】中间件文件解析漏洞概述及实例——Apache、IIS和Nginx


定义:解析漏洞主要是一些特殊文件被IIS、Apache、Nginx等服务在某种情况下 解释成脚本文件格式并得以执行而产生的漏洞。

1 Apache解析漏洞

1.1 概述

(1)第一种:未知扩展名解析漏洞
Apache对文件的解析主要是从右到左开始判断并进行解析,如果判断为不能解析的类型,则继续向左进行解析,如xx.php.wer.xxxxx将被解析为PHP类型。

(2)第二种:局部配置
通过分布式配置文件.htaccess文件进行局部配置,定义不同文件名及后缀的解析方式。参考《【文件上传漏洞-06】分布式配置文件攻击实验—以upload-labs-4为例

1.2 Apache解析漏洞实例

1.2.1 实验目的

(1)加深理解Apache的两种解析漏洞原理;
(2)掌握两种解析漏洞的检测及绕过方法。

1.2.2 实验环境

靶场:基于WAMP环境的upload-labs靶场。其中WAMP环境的部署可参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》、upload-labs靶场的搭建可参考《【环境搭建-03】基于WAMP环境的upload-labs漏洞靶场的搭建》,请务必将PHP版本设置为小于5.3.4版本。

攻击机:使用真实机浏览器。

1.2.3 实验一:验证解析顺序漏洞

(1)真实机使用浏览器访问upload-labs靶场,进入第4关。点击“显示源码”或“查看提示”可以看到部分后缀被列入黑名单,结合之前的文章中,我们可以有以下几种思路:

  • 修改同类型后缀:先尝试将文件后缀名修改为同类型文件的后缀,比如将php修改为php5等,看看哪些后缀能成功执行文件代码,这样上传的文件就会在网站成功执行。
  • 修改为其他类型后缀:当文件后缀修改为其他类型后,往往无法顺利执行文件内代码,需要配合.htaccess修改局部配置。
  • 当中间件是Apache时,可以尝试利用其解析漏洞来绕过。当信息收集发现中间件为apache时,该方法建议优先于前两种进行测试。
    在这里插入图片描述
    在这里插入图片描述

(2)准备上传文件。新建一个txt文件,文件内容为<?php phpinfo(); ?>,并将其重命名为info.php.xxx。
(3)上传info.php.xxx文件。选择info.php.xxx,点击上传,可以看到文件已经成功上传,但是由于文件内容并非图片,所以在网页上不能成功解析。
在这里插入图片描述

(4)右键该图片,在新标签打开,代码执行失败(打开后一片空白,暂时找不到原因)。可以看到该文件图片的存储路径为:http://172.16.1.1/upload-labs/upload/info.php.xxx,并没有对文件名及其后缀名进行修改。
在这里插入图片描述

小结

  • 该解析漏洞绕过的方式需要网站中间件为apache;
  • 同时需要网站对上传文件名未做修改。

1.3 总结

文件上传漏洞第一个条件是文件成功上传且没能过滤掉恶意代码;第二个条件是让代码执行。
对于第一个条件,存在着前端JS检测绕过、服务端MIME类型绕过、服务端后缀名绕过、文件内容绕过等,其根本目的是要上传文件。
对于第二个条件,当中间件为Apache时:
(1)优先考虑绕过后缀名时采用恶意代码能够执行的后缀,这样文件能直接执行;
(2)其次考虑利用解析顺序漏洞执行该文件;
(3)最后才是考虑通过修改局部配置来执行。

2 IIS 解析漏洞

2.1 概述

2.1.1 文件解析漏洞

定义在iis6.0下,分号后面的不被解析,所以xx.asp;.jpg被解析为asp脚本得以执行。

防御:对所上传的文件重命名后再保存,比如,所上传的xx.asp;.jpg重命名为xxxxxx.jpg再保存。

2.1.2 目录解析漏洞

定义在网站下创建名字为.asp、.asa的文件夹,其下任何扩展名的文件都被IIS当做asp文件来解析并执行。攻击者利用该漏洞,创建文件夹并往文件夹内上传图片马,不需修改后缀名便可直接执行!

目录解析漏洞格式,例如: /xx.asp/xx.jpg。

适用版本:IIS 5.x/6.0。对于高版本暂未实验。

2.1.3 文件类型解析漏洞

定义:在 iis6.0 中,默认的可执行文件除了asp还包含这三种asacercdx

防御:黑白名单过滤时要全面。

2.1.4 CGI-PHP 解析漏洞

定义:该漏洞常见于IIS7.0、IIS7.5、Nginx <8.03等中间件+PHP环境,当浏览器采用1.jpg/.php的方式访问1.jpg文件时,jpg文件会以PHP程序执行。

原因:该漏洞的产生原因与中间件无关,主要是PHP配置上CGI.fix_pathinfo参数值默认为1,将其设置为0可以避免这个漏洞。
在这里插入图片描述

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 IIS 解析漏洞实例

2.2.1 实验目的

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

2.2.2 实验环境

2.2.2.1 实验环境一:IIS6.0

(1)由于没有找到方便直接使用的靶场环境,此处新建一个网站来作为靶场。

(2)按以上步骤安装后,点击开始→管理工具→Internet(信息服务IIS)。
在这里插入图片描述
(3)新建网站目录upload及文件。在D盘新建目录upload,在该目录下新建txt文件,输入内容<%=time()%>,该内容为asp语句,执行后返回当前时间,并将文件名修改为time.asp作为动态网页访问。
在这里插入图片描述
(4)在第2步的界面,即IIS管理器界面,先右键默认网站→停止。然后再右键网站→新建→网站→输入描述(随便写)→下一步→分配本机IP给该网站→下一步。
在这里插入图片描述
在这里插入图片描述

(5)选择网站的路径。选择刚刚新建文件的文件夹D:\upload→下一步→勾选全部权限→下一步。

在这里插入图片描述
在这里插入图片描述

(6)回到IIS管理器界面,设置新建站点的属性。右键该网站→属性→选项→启用父路径。
在这里插入图片描述

(7)右键Web服务扩展→在右侧找到 Active Server Gages →点击允许。
在这里插入图片描述

(8)在真实机浏览器,输入虚拟机IP并加上文件名访问指定文件http://172.16.1.8/time.asp,如下,访问成功,说明实验环境搭建结束。
在这里插入图片描述

2.2.2.2 实验环境二:IIS7.0

(1)由于没有找到方便直接使用的靶场环境,此处新建一个网站来作为靶场,并设置映像链接来处理PHP语句。

  • 在虚拟机中,安装win2008系统,步骤参考文章《第2节 部署虚拟机及常用系统配置》。
  • 在win2008中,部署IIS服务器。右键计算机→管理→添加角色→下一步→如下勾选IIS服务器→下一步。
    在这里插入图片描述

(2)在设置角色服务时,“应用程序开发”全部勾选,点下一步直到开始安装。
在这里插入图片描述

(3)停止默认网站。安装完成后,点击开始→管理工具→Internet信息服务(IIS)管理器IIS,打开网址,然后按如下操作将默认网址停止。
在这里插入图片描述
在这里插入图片描述

(4)建立网站目录及相关文件。在D盘下新建文件夹,本实验命名为upload,新建TXT文件,输入内容<?PHP fputs(fopen('shell.php','w'),'<?php phpinfo()?>');?>,并将文件重命名为1.jpg。

(5)新建网站upload。在IIS管理器,右键网站→添加网站→如下设置名字和路径信息(网站路径为D:\upload)→确定。
在这里插入图片描述

(6)安装phpstudy8.1及扩展php5.4.45。

  • 在虚拟机系统上安装phpstudy8.1,下载可前往官网,本实验按默认路径安装。

在这里插入图片描述
在这里插入图片描述

  • 安装后,在小皮面板的软件管理处,安装php5.4.45版本。在C盘下phpstudy的安装目录下,可以找到该版本PHP的路径为:D:\phpstudy_pro\Extensions\php\php5.4.45nts

在这里插入图片描述

(7)让IIS调用php。

  • 为IIS服务器添加映射到PHP。打开IIS管理器,选中新建的网站upload→双击处理程序映射→添加模块映射→按要求填写:其中第一行表示任意以php结尾的文件;第二行选择FastCgi模块;第三行是在PHP安装目录下找到响应的可执行程序,参考下一张图设置;第四行随便写点。点击确定。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 选中IIS服务器→双击打开FastCGI配置→按下步骤让CGI跟随PHP配置文件而修改配置。
    在这里插入图片描述

在这里插入图片描述

(3)至此,就可以让IIS支持PHP脚本。在网站目录D:\upload下新建TXT文件,输入内容为<?php phpinfo();?>并重命名为info.php。在真实机输入win2008虚拟机IP地址并指定文件名进行访问,可以看到文件PHP代码成功执行。
在这里插入图片描述

2.2.3 实验一:验证IIS6.0文件解析漏洞

由于没有可直接利用的靶场,此处就跳过文件上传的环节,直接验证文件能否被解析。步骤如下:
(1)在win2003虚拟机中的D:\upload目录下,复制time.asp文件(上文搭建环境时建立的文件)黏贴后重命名为time.asp;1.jpg
在这里插入图片描述

(2)在真实机浏览器,输入网址http://172.16.1.8/time.asp;1.jpg访问time.asp;1.jpg文件,如下。可以看到在iis6.0下,分号后面的不被解析,所以xx.asp;.jpg被解析为asp脚本得以执行。
在这里插入图片描述

2.2.4 实验二:验证IIS6.0文件夹解析漏洞

由于没有可直接利用的靶场,此处就跳过文件上传的环节,直接验证文件能否被解析。步骤如下:
(1)在win2003虚拟机中,在网站根目录下(D:\upload)新建文件夹,命名为1.asp(1可以为任意字符,只要是.asp结尾即可),将time.asp文件(上文搭建环境时建立的文件)复制进去并重命名为time.jpg。
在这里插入图片描述
(2)在真实机浏览器,输入网址访问指定文件time.jpg,如下。可以看出,当文件夹名字中含有后缀.asp时,其目录内的任何扩展名的文件都被iis当做asp文件来解析并执行(.asa同理)。因此只要攻击者可以通过该漏洞直接上传图片马,并且可以不需要改后缀名!
在这里插入图片描述

2.2.5 实验三:验证IIS7.0下的CGI+PHP解析漏洞

2.2.5.1 实验过程

(1)将info.php文件(上文搭建环境时建立的文件)复制黏贴并重命名为info.jpg。
在这里插入图片描述

(2)在真实机访问该文件,

  • 输入网址:http://192.168.1.3/info.png,图片代码无法执行

在这里插入图片描述

  • 输入网址:http://192.168.1.3/info.png/.php,代码成功执行。访问时只要在URL后加了/.php就能让该文件以PHP格式运行,成功执行该文件内的PHP代码。
    在这里插入图片描述
2.2.5.2 防御

(1)方法一
(1)在win2008系统中,打开IIS管理器界面,找到搭建环境时建立的映射文件。
在这里插入图片描述

(2)选中该映射文件,点击右侧的编辑,点击请求限制,在限制栏下,勾选上并点击确定。
在这里插入图片描述

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

在这里插入图片描述

2.3 总结

文件上传漏洞第一个条件是文件成功上传且没能过滤掉恶意代码;第二个条件是让代码执行。
对于第一个条件,存在着前端JS检测绕过、服务端MIME类型绕过、服务端后缀名绕过、文件内容绕过等,其根本目的是要上传文件。
对于第二个条件,当中间件为IIS时:
(1)优先考虑绕过后缀名时采用恶意代码能够执行的后缀,这样文件能直接执行;
(2)当IIS版本为5.x或6.x时,考虑利用文件解析漏洞、目录解析漏洞执行该文件;
(3)当IIS版本为7.x时,考虑利用CGI-PHP解析漏洞来执行该文件。

3 Nginx 解析漏洞

3.1 概述

3.1.1 空字节解析漏洞

概述:该漏洞影响版本为:0.5*, 0.6*, 0.7 <= 0.7.65, 0.8 <= 0.8.37,版本较老。

原因:在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可以在非PHP文件中嵌入PHP代码,然后通过访问xxx.jpg%00.php来执行其中的代码。

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

概述:该漏洞影响版本为: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7,范围较广。

原因:这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。

漏洞产生过程

  • Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的代码写法如下。
  • 正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。而存在CVE-2013-4547的情况下,我们请求 1.gif[0x20][0x00].php ,这个URI可以匹配上正则 .php$,可以进入这个Location块;但进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
  • fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。
  • 所以,我们只需要上传一个空格结尾的文件,然后在访问文件时诱导其以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;
}

3.1.3 CGI-PHP 解析漏洞

概述:该漏洞常见于IIS7.0、IIS7.5、Nginx <8.03等中间件,当浏览器采用1.jpg/.php的方式访问1.jpg文件时,jpg文件会以PHP程序执行。

原因:该漏洞的产生原因与中间件无关,主要是PHP配置上CGI.fix_pathinfo参数值默认为1,将其设置为0可以避免这个漏洞。
在这里插入图片描述
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”,以此类推。

3.2 Nginx 解析漏洞实例

3.2.1 实验目的

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

3.2.2 实验环境

(1)在虚拟机安装CentOS系统,可以参考文章《【Linux系统】第1节 CentOS7虚拟机安装》。
(2)部署Vulhub靶场环境。参考文章《【环境搭建-04】CentOS上搭建Vulhub靶场》。
(3)需要不同靶场环境时,在官网查询相关靶场路径,进入对应路径进行实验即可。

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

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

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

3.2.4.1 启用实验环境

(1)参考Vulhub官网关于该漏洞的使用介绍,使用命令cd /usr/vulhub/nginx/CVE-2013-4547进入靶场安装目录(根据自己安装的位置灵活调整)。

(2)使用命令docker-compose up -d启动靶场。
在这里插入图片描述

(3)使用命令docker ps -a查询启动的容器。可以看到所启动的容器是采用8080端口来访问的。
在这里插入图片描述
在这里插入图片描述

3.2.4.2 踩坑排雷过程

(1)真实机浏览器访问nginx靶场。输入URL为192.168.1.8:8080
在这里插入图片描述
(2)准备要上传的文件。文件名为phpinfo.php,内容代码为<?php phpinfo();?>
(3)真实机的浏览器设置代理→打开BurpSuite→在代理界面开启拦截功能。具体操作可以参考《【Burp Suite工具-2】BurpSuite工作原理及菜单栏介绍
在这里插入图片描述
(4)在浏览器网页中选中phpinfo.php文件并点击提交按钮,可以看到BurpSuite成功拦截到请求,将该请求发送到Repeater模块。
在这里插入图片描述
在这里插入图片描述

(5)将BurpSuite切换到repeater模块界面,将刚刚发送过来的请求点击send,可以看到响应为上传文件失败。
在这里插入图片描述

(6)将文件名后缀修改为.png ,点击send,发现响应中说move_uploaded_file函数执行出错了,结合之前《文件截断绕过攻击实验》中对该函数的了解,其出错可能是路径出了问题或是写入权限出了问题,但是在该实验中其实是SELinux设置的问题,相关解决方案参考文章《CentOS7部署Vulhub靶场后,在启动漏洞容器时弹出SELinux警告,致使网站无法正常执行文件上传功能》。
在这里插入图片描述

(4)经过上面文章设置之后,接着继续实验。
(4)重新回到浏览器→重新上传文件→将拦截到的请求再次将请求发送到repeater模块→将文件名修改为png后缀,并点击发送。可以看到右侧文件成功上传,说明靶场环境搭建成功。
在这里插入图片描述

3.2.4.3 实验步骤

(1)在BurpSuite中的Repeater模块,将请求中文件的后缀名png后面再加一个空格,并点击发送。可以看到文件成功上传,且后缀带有空格。
在这里插入图片描述

(2)关闭BurpSuite中Proxy模块中的拦截功能,使用火狐浏览器输入网址:http://192.168.1.8:8080/uploadfiles/phpinfo.png访问刚刚上传的文件,可以看到文件是存在的,但是由于不是图片格式所以显示不了。
在这里插入图片描述

(3)本来想使用BurpSuite拦截上述中的请求,不知道为什么拦不到,只能先复制上面浏览器访问时的URL,然后在repeater模块中新建一页,右键点击"Paste URL as request"。
在这里插入图片描述

(4)点击后出现以下请求,点击发送收到响应。可以看到响应正常并回显了文件的内容,但是由于后缀名格式问题并没有执行。
在这里插入图片描述

(5)在BurpSuite中的Repeater模块,在请求的文件后缀加上 ..php,注意最前面是一个空格,点击发送手动响应如下,没有找打对应的文件。
在这里插入图片描述
(6)在BurpSuite中的Repeater模块,将请求切换到十六进制模式,修改第一个点对应的值变为空字符,原理类似空字符截断,发送后可以看到响应中执行了文件代码。
在这里插入图片描述

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

3.2.5.1 启用实验环境

(1)参考Vulhub官网关于该漏洞的使用介绍,使用命令cd /usr/vulhub/nginx/nginx_parsing_vulnerability进入靶场安装目录(根据自己安装的位置灵活调整)。(若之前启动了其他靶场,可以使用docker-compose down关闭靶场,之后再进入目标靶场路径)。

(2)使用命令docker-compose up -d启动靶场。
在这里插入图片描述
(3)使用命令docker ps -a查询启动的容器。
在这里插入图片描述

3.2.5.2 实验步骤

(1)访问nginx_parsing_vulnerability靶场。真实机打开浏览器,输入IP:192.168.1.8访问靶场。
在这里插入图片描述

(2)使用命令http://192.168.1.8/uploadfiles/nginx.png访问靶机网站下的文件,可以看到图片正常显示。
在这里插入图片描述

(3)使用命令http://192.168.1.8/uploadfiles/nginx.png/.php访问靶机网站下的文件,可以看到文件中的PHP代码被成功执行,由此也可知该图片为图片马。
在这里插入图片描述

3.2.5.3 防御

将php.ini文件中的cgi.fix_pathinfo的值设置为0,并将该行代码签名的分号去掉,保存并重启phpstudy。
在这里插入图片描述

3.3 总结

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

参考文章

[《Nginx 文件名逻辑漏洞(CVE-2013-4547)

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值