WebSocket内存马之tomcat-websocket源码实现(内存马系列篇七)

news2024/11/14 20:36:57

写在前面

这篇主要是分析一下WebSocket协议在Tomcat容器中的源码实现,方便大家在后面能够更好的了解下一篇Websocket型内存马的原理。

这个也是内存马系列第七篇

Websocket

什么是websocket?

首先来了解一下什么是websocket

WebSocket全双工通信协议,在客户端和服务端建立连接后,可以持续双向通信,和HTTP同属于应用层协议,并且都依赖于传输层的TCP/IP协议。

虽然WebSocket有别于HTTP,是一种新协议,但是RFC 6455中规定:

it is designed to work over HTTP ports 80 and 443 as well as to support HTTP
proxies and intermediaries.

  • WebSocket通过HTTP端口80和443进行工作,并支持HTTP代理和中介,从而使其与HTTP协议兼容。

  • 为了实现兼容性,WebSocket握手使用HTTPUpgrade头从HTTP协议更改为WebSocket协议。

  • Websocket使用wswss的统一资源标志符(URI),分别对应明文和加密连接。

建立连接

在双向通信之前,必须通过握手建立连接。Websocket通过 HTTP/1.1
协议的101状态码进行握手,首先客户端(如浏览器)发出带有特殊消息头(Upgrade、Connection)的请求到服务器,服务器判断是否支持升级,支持则返回响应状态码101,表示协议升级成功,对于WebSocket就是握手成功。

请求头实例

GET /test HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: tFGdnEL/5fXMS9yKwBjllg==
Origin: http://example.com
Sec-WebSocket-Protocol: v10.stomp, v11.stomp, v12.stomp
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Version: 13
  • Connection必须设置Upgrade,表示客户端希望连接升级。

  • Upgrade: websocket表明协议升级为websocket。

  • Sec-WebSocket-Key字段内记录着握手过程中必不可少的键值,由客户端(浏览器)生成,可以尽量避免普通HTTP请求被误认为Websocket协议。

  • Sec-WebSocket-Version表示支持的Websocket版本。RFC6455要求使用的版本是13。

  • Origin字段是必须的。如果缺少origin字段,WebSocket服务器需要回复HTTP403状态码(禁止访问),通过Origin可以做安全校验。

响应头实例

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HaA6EjhHRejpHyuO0yBnY4J4n3A=
Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15
Sec-WebSocket-Protocol: v12.stomp

Sec-WebSocket-Accept的字段值是由握手请求中的Sec-WebSocket- Key的字段值生成的。成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。

贴一个网上的示例图

image-20220927144735539.png

其优点

  • 较少的控制开销。在连接建立后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对于HTTP请求每次都要携带完整的头部,显著减少。

  • 更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少。

  • 保持连接状态。与HTTP不同的是,Websocket需要先建立连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。

  • 更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。

  • 支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。

  • 更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著提高压缩率。

源码实现

我们知道想要在Tomcat中使用Websocket服务有多种方法:

  1. @ServerEndpoint注解的方式

  2. 继承抽象类Endpoint

  3. ServerApplicationConfig的实现类

那么在源码层面上Tomcat是如何提供对应的服务的呢?

首先来看一下内部是如何加载相应的websocket服务的?

Tomcat提供了一个org.apache.tomcat.websocket.server.WsSci来加载WebSocket服务,利用了SCI机制,什么是SCI机制呢?

从源代码上面来讲主要是一个实现了javax.servlet.ServletContainerInitializer接口的,会在这时候触发对应的onStartup方法,做出一些初始化操作。

我们看看这个接口。

image-20220927152017586.png

从注释中我们也知道能够调用其onStartup方法,同样,我们也来看看WsSci类的源码。

image-20220927152200411.png

他实现了ServletContainerInitializer接口,并且重写了他的onStartup方法,这个类主要是注册一下以ServerEndpoint注解了的类,使得其类能够可以通过
WebSocket 服务器发布 Endpoint。那流程就比较清楚了,WsSci主要做了一件事,就是扫描加载Server Endpoint,并将其加到WebSocket容器里

主要的逻辑在onStartup方法中,我们跟进一下。

image-20220927152908033.png

首先调用init方法创建了一个WsServerContainer类对象sc

跟进方法

image-20220927152945269.png

通过new了一个WsServerContainer传入servlet上传文创建了一个WsServerContainer对象。

之后在上下文中设置了一个属性,这个属性SERVER_CONTAINER_SERVLET_CONTEXT_ATTRIBUTEjavax.websocket.server.ServerContainer

之后注册了一个WsSessionListener监听器给了上下文中,导致在http的session销毁的时候同样会导致ws session也会被消毁,达到了两者的一致性。

再然后判断是否是初始化的时刻,如果是将会注册一个ws上下文监听器WsContextListener给servlet的上下文,导致在servletContext初始化的时候调用WsSciinit方法进行初始化,在其消毁的时候同样也会消毁。

同样的,因为有着判断,所以,这个注册只会调用一次。

再次回到onStartup方法的调用。

image-20220927154427058.png

开局就创建了三个集合分别来存放不同的类对象。

在try语句中,通过遍历clazzes中的类,首先在获取了类的相关信息之后,去除掉了不是public类型 / 抽象 / 接口 /
或者没有暴露的类,接着进入了第二个if语句,将不会扫描WebSocket API的jar包,也就是javax.websocket.开头的包名都会排除掉。

接着走

image-20220927154751081.png

之后连着三个if语句将会判断满足前面条件的类是否是ServerApplicationConfig类的实现类,或者是否是Endpoint类的子类,
又或者是否该类使用了ServerEndpoint注解,如果满足上面三个条件的任何一个,将会将该类放置于上面创建的对应的集合中。

继续往下走

image-20220927155131422.png

开局一个官方给的注释//Filter the results过滤上面的到的结果,有趣,我们具体看看是过滤了哪些结果类。

同样这里创建了两个集合filteredEndpointConfigs / filteredPojoEndpoints,之后首先判断前面获取的serverApplicationConfigs结合是否为空,如果为空,将会将scannedPojoEndpoints中的所有内容传入对应集合,所以这里也说明,@ServerEndpoint的服务器端是可以不用ServerApplicationConfig的。

接下来看看不为空的情况下的逻辑

首先会遍历serverApplicationConfigs这个集合中的元素,首先从config中取出Endpoint的子类,在其不为空的时候,将会将其传入filteredEndpointConfigs集合中,同样,也会在实现了ServerEndpoint注解的类获取对应的config进行添加。

就这样得到了需要的filteredEndpointConfigs

来看看最后的处理。

image-20220927160245743.png

在遍历了这个集合之后继承抽象类Endpoint的需要使用者手动封装成ServerEndpointConfig, 而加了注解@ServerEndpoint的类
Tomcat会自动封装成ServerEndpointConfig

最后都被加载进入了WsServerContainer中去

我们可以跟进一下其addEndpoint方法中去,对于Endpoint子类是调用的是改方法。

image-20220927160749732.png

该方法主要是在特定的path路径和配置信息提供endpoint

跟进addEndpoint方法

开局就是几个判断抛出异常的if语句,没啥用,从try语句开始分析。

image-20220927161441178.png

首先从ServerEndpointConfig中获取对应的path路径,添加了一个methodMapping对象通过用户的配置

而对于使用ServerEndpoint注解的方式构造的Endpoint,我们需要包装成ServerEndpointConfig

同样从try语句开始。

image-20220927162428529.png

首先是得到了对应类的注解信息,之后通过解析注解信息,获取了path路径,并且通过ServerEndpointConfig.Builder.create方法的调用封装了一个ServerEndpointConfig

image-20220927164520827.png

并且在最后调用addEndpoint方法

image-20220927164845176.png

  • 对加了@ServerEndpoint类的生命周期方法(@OnOpen@OnClose@OnError@OnMessage)的扫描和映射封装

  • path的有效性检查和path param解析

总结

上面从Websocket的介绍,到Tomcat中的websocket协议的处理进行了源码层面的分析,为之后的Websocket层的内存马提供了基础知识

Ref。

https://stefan.blog.csdn.net/article/details/120025498

@OnMessage`)的扫描和映射封装

  • path的有效性检查和path param解析

总结

上面从Websocket的介绍,到Tomcat中的websocket协议的处理进行了源码层面的分析,为之后的Websocket层的内存马提供了基础知识

最后

分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

在这里插入图片描述

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

高清学习路线图或XMIND文件(点击下载原文件)

还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-2-16 刷题情况

神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本…

Airtest自动化测试工具介绍

官方网站:http://airtest.netease.com/ Airtest IDE: 跨平台的UI自动化测试编辑器,适用于游戏和App,详细参见官网文档:http://airtest.netease.com/docs/cn/index.html 这是Airtest测试工具标配的IDE,目…

Eclipse插件安装全方式介绍(优化版)

Eclipse插件安装方式 Eclipse插件安装有很多种方式,常见的有以下四种: [在线安装] -使用插件地址安装[在线安装] - 通过插件市场查找插件安装[离线安装]- 下载插件文件后复制文件Eclipse目录[离线安装]- 外部引用 本篇以安装Eclipse Tomcat插件为例进…

#8排序算法#

1.排序 1概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起 来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排…

AWS攻略——使用ACL限制访问

文章目录确定出口IP修改ACL修改主网络ACL修改入站规则修改子网ACL创建子网ACL新增入站规则新增出站规则关联子网假如我们希望限制只有公司内部的IP可以SSH登录到EC2,则可以考虑使用ACL来实现。 我们延续使用《AWS攻略——创建VPC》的案例,在它的基础上做…

Spring 系列 - AOP

Spring 系列 - AOP Spring 框架从使用到现在已经有相当的长的一段时间了,但总是在使用的时候,感觉一直停留在表面,对框架的底层了解的并不多,最近一段时间,打算好好折腾一下 Spring 的底层,想对 Spring 有…

智能家居项目(二)之工厂模式的实现

目录 一、举例说明:把下面的代码转换成工厂模式的方式来实现 二、用工厂模式的方式来实现 1、创建三个函数的文件 2、创建一个 Animal.h文件,把上述三个函数名都放在这个文件中 3、创建一个main主函数文件 4、用工厂模式创建的文件浏览 一、举例说…

用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(三)(2017)

文章目录用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(三)(2017)原文链接:https://doi.org/10.1017/jfm.2017.34. 讨论小结用主动游泳的三维水母模型量化美杜莎的(medusan)机械…

iptables防火墙详解

目录iptables防火墙iptables简介iptables表filter(过滤表)nat(网络地址转换表)mangle(修改表)raw(原始表)security 表处理目标REJECT(拒绝)DNAT(目的网络地址转换)SNAT(源网络地址转换)MASQUERADE(伪装)LOGREDIRECT报文处理流程规则表之间的优先顺序报文规则匹配管理防火墙规则…

单调栈---神奇的栈

我们平时用的栈多,但是我们一般用的是什么呢?用来做有效的括号匹配?还是用来记录我们的二叉树的节点? 通过对栈的理解,我们学习一个新的概念–单调栈。所谓单调栈,就是单调递增或者单调递减的栈。 那么单…

第四届宁波网安市赛初赛

由于赛后官方不给wp(绿盟一向如此),交流群也没有得到其他题解,赛后就根据自己的wp来写了,wp由队友及我共同完成。比赛共解答10题,Web 5道,Misc 2道,Crypto 3道,wp只有一部…

深度学习算法面试常问问题(一)

博主秋招遇到的面试问题以及整理其他面经相关问题,无偿分享~ 项目叙述: 算法需求及应用场景算法的调研和初步方案的制定数据的准备(包括数据标注和数据增强)算法的介绍(包括输入和输出,loss、backbone、训…

做外贸,你不能不懂的外贸流程知识

报关是履行海关进出境手续的必要环节之一,涉及两大类:进出境运输工具、物品和货物。由于性质不同,报关手续也有些不同。今天我就为大家详细介绍一下进出口报关的流程,包括出口货物报关的流程,随报关单提交的运费和商业单据&#x…

Spark中cache、persist、checkpoint三者的比较

原文链接:https://blog.csdn.net/AnameJL/article/details/124362219,再次主要是为了方便查找,把原文章复制一遍 目录 1. 三者的使用 1.1 cache的讲解与使用 1.2 persist的讲解与使用 1.3checkpoint 的讲解与使用 2. 三者的比较 2.1 优…

基于Web的智慧能源可视化管理系统

自工业革命开始,全球能源消耗持续增长,由碳循环体系破坏引发的全球变暖、海平面上升等问题严重影响着人类的可持续发展。得益于数字孪生、物联网、5G、AI识别等技术的不断成熟,以“大数据能源监控、精细化能源管理”为核心的智慧能源解决方案…

【电子学会】2022年12月图形化三级 -- 绘制雷达

绘制雷达 1. 准备工作 (1)绘制黑色背景; (2)删除默认角色小猫,添加角色Pencil。 2. 功能实现 (1)画笔的颜色设为黄色,Pencil的中心点设在笔尖位置,画笔的…

在Java 中 利用Milo通信库,实现OPCUA客户端,并生成证书

程序结构: 配置文件resources: opcua.properties 西门子PLC端口号为4840,kepserver为49320 #opcua服务端配置参数 #opcua.server.endpoint.urlopc.tcp://192.168.2.102:49320 opcua.server.endpoint.urlopc.tcp://192.168.2.11:4840 opcu…

2023年私募股权基金研究报告

第一章 概况 PE是私募,也即私募投资基金,是指以非公开发行方式向合格投资者募集的,投资于股票、股权、债券、期货、期权、基金份额及投资合同约定的其他投资标的(如艺术品、红酒等)的投资基金,简称私募基金…

【PyTorch学习3】《PyTorch深度学习实践》——反向传播(Back Propagation)

目录一、Tensor1.定义2.Tensor常见形式3.torch.tensor和torch.Tensor4.Tensor.grad二、反向传播一、Tensor 1.定义 张量的定义是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数。 在PyTorch上有这样一句话,A torch.Tensor is a multi…

TeeChart for .NET 2023.2.13 Crack

TeeChart NET Pro Edition 是一个基于 Nuget 的图表控件,旨在为您的 NET 应用程序提供即时图表、地图和仪表功能。TeeChart 拥有数十种图表类型、统计函数和开发人员工具,是当今开发人员可用的最全面的图表库之一。易于使用设计时编辑器和直观的编程结构…