内存马的错误参数获取,导致原有接口失效解决方案

news2024/12/23 13:46:24

内存马的错误参数获取,导致接口失效。

前言

java Listener 类型内存马,在使用request.getParameter(String name); 获取请求参数去判断是否是恶意请求的时候,会影响某些框架无法接收到参数。

例子

在Jersey 框架 使用 MultivaluedMap 去接收参数。正常情况下是能够接收到参数,但在Listener 类型内存马使用request.getParameter(String name)去获取参数后,就无法读取到参数。

环境搭建

本地环境:SpringBoot MVC + Jersey RESTApi

搭建接口

@Path("/")
public class JerseyMultiValueMapController {
    @POST
    @Path("/demo")
    @Consumes("application/x-www-form-urlencoded")
    public Response demo(MultivaluedMap<String, String> formData) {
        formData.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
        String result = "Processed data";
        return Response.ok(result).build();
    }
}

注意:引用javax.ws.*包

做请求:

我们正常请求能得到相关的请求数据:

内存马注入

在外面注入内存马后(这里采用 北辰的 Listener 的内存马 https://github.com/BeichenDream/GodzillaMemoryShellProject ):

添加 request.jsp 页面,做请求后就能添加 Listener 类型的内存马

这里在原本的无参构造函数有过修改,让其调用addListener()函数。每次请求该页面都会生成一个内存马。

检测内存马

这里采用 https://github.com/zzhorc/tomcat_memshell_scanner0.2 内存马检测工具,这里实测无法杀死上面的内存马,进行简单修改:

将 deleteListener 函数修改为如下:

public synchronized void deleteListener(HttpServletRequest request, String listenerName) {
    try{
        List<Object> arrayList_listeners = getListenerList(request);
        for (int i = 0; i < arrayList_listeners.size();) {
            if(arrayList_listeners.get(i).getClass().getName().equals(listenerName)){
                arrayList_listeners.remove(i);
                continue;
            }
            i++;
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

下面是注入内存马检测出的界面,这里可以检测出是否注入成功。这里杀内存马十分暴力,只要是该类的就全杀。

注入内存马后的请求

做请求:

接收到的请求

可以看到同样的请求,这里没有接收到请求参数。

通过不断调试,定点到内存马出现问题的函数:

在run函数下面的 getParameter函数的使用,这跟request.getParameter 一致,只是这里使用反射调用。

原理

经过不断调试发现,request.getParameter 和 Jersey 去实例化参数都会从 CoyoteInputStream 数据流读取数据(只能读取一次数据),去实例化请求参数。

当内存马 调用 getParameter 就会先读取 CoyoteInputStream 中的数据,导致 Jersey 去实例化请求参数无法读取到参数。

定位函数:

request.getParameter 定位到 org.apache.catalina.connector.Request#readPostBodyFully

Jersey 定位到 org.glassfish.jersey.message.internal.ReaderWriter#readFromAsString

request.getParameter 这里可以看到 this.getStream() 是 CoyoteInputStream :

Jersey :

通过调试可以看到两者是读取同一个 CoyoteInputStream 。

解决方案

在这里使用的 request.getParameter 判断参数是否能拿到期望的参数名导致的。

我们只需要用其他方式即可,例如uri、User-Agent 等即可。

总结

在内存马中若调用 request.getParameter 实例化参数,比某些框架先去实例化参数,会导致某些接口失效。
解决方案: 可以对uri进行过滤处理。

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

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

相关文章

MSPM0G3507——创建新的.c.h文件

在项目处点击右键&#xff0c;再点击New File 再命名.c.h即可

mysql中的datetime类型在Java中到底对应哪个时间类型?

因为MySQL中用的是datetime类型&#xff08;年月日 时分秒&#xff09; java.sql.Date 在Java中用 java.sql.Date 接收 但是得到的却只有年月日 前端接收到的是时间戳 java.time.LocalDateTime 在Java中使用 java.time.LocalDateTime 接收 得到的是带时区的时间 前端接收到的…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口差异切换上线IPC管道ATSC任务Impacket套件UI插件

红队内网攻防渗透 1. 内网横向移动1.1 横向移动入口知识点1.1.1、当前被控机处于域内还是域外1.1.1.1 在域内1.1.1.2 不在域内1.1.1.2.1 第一种方法提权到system权限1.1.1.2.2 第二种方法切换用户上线1.1.1.2.3 kerbrute枚举用户1.1.2、当前凭据为明文密码还是HASH1.2 横向移动…

Vue3中使用el-table遇到的问题

我在使用element-plus中el-table组件的时候&#xff0c;对于某一<el-table-column>标签内的内容设置show-overflow-tooltip属性&#xff0c;但这里溢出展示的tooltip的默认样式是无法像el-tooltip标签那样&#xff0c;直接可以修改的。默认的样式是这样&#xff1a; 因此…

江协科技51单片机学习- p11 静态数码管显示

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

包含网关的概念及案例演示

包容网关 知识点讲解 包容网关可以看作排他网关和并行网关的结合体。与排他网一样&#xff0c;可以在外出顺序流上定义条件&#xff0c;但与排他网关不同的是&#xff0c; 进行决策判读时&#xff0c;包容网关所有条件为true的后继分支都会被依次执行。如果所有分支条件都为fa…

24年火爆全网的企业信贷产品-民生惠详解

今年&#xff0c;民生惠企业信贷产品非常火爆&#xff01;客户想申请这信用贷款前&#xff0c;先确认下自己是不是在白名单里。有些地区还能加进白名单&#xff0c;不在的话就别申请了&#xff0c;这是专门给受邀的小微企业的。 这款产品的细节是这样的&#xff1a; 额度&am…

实用软件下载:会声会影2023最新安装包及详细安装教程

可以说它不仅符合家庭或个人所需的影片剪辑功能&#xff0c;甚至能够挑战专业级的影片剪辑软件&#xff0c;适合一般大众使用&#xff0c;操作简单易懂&#xff0c;界面简洁明快。从总体上来看影片制作向导模式&#xff0c;只要三个步骤就可快速做出DV影片&#xff0c;入门初学…

一篇快速教你如何创建专业级数据可视化库

Seaborn 是一个基于 matplotlib 的 Python 库,主要用于数据探索、统计可视化和交互式分析.它提供了一种更高级、更美观的方式来绘制统计图表. 安装&#xff1a; pip install seaborn示例&#xff1a; import seaborn as sns import pandas as pd import matplotlib.pyp…

服务器SSH 免密码登录

1. 背景 为了服务器的安全着想&#xff0c;设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码&#xff0c;把人折腾的很痛苦&#xff0c;所以我就在想&#xff0c;能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件&#xff0c;会自…

nvidia历史版本驱动

打开官网 https://www.nvidia.cn windows GTX-1060为例 标准

Centos Stream9 和Centos Stream10的下载网址

Index of /https://mirror.stream.centos.org/

Redis进阶 - Redis 淘汰策略

我们知道Redis是分布式内存数据库&#xff0c;基于内存运行&#xff0c;可是有没有想过比较好的服务器内存也不过几百G&#xff0c;能存多少数据呢&#xff0c;当内存占用满了之后该怎么办呢&#xff1f;Redis的内存是否可以设置限制&#xff1f; 过期的key是怎么从内存中删除的…

SQLite数据库(数据库和链表双向转换)

文章目录 SQLite数据库一、SQLite简介1、SQLite和MySQL2、基于嵌入式的数据库 二、SQLite数据库安装三、SQLite的常用命令四、SQLite的编程操作1、SQLite数据库相关API&#xff08;1&#xff09;头文件&#xff08;2&#xff09;sqlite3_open()&#xff08;3&#xff09;sqlite…

VBA技术资料MF164:列出文件夹中的所有文件和创建日期

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…

STM32驱动-ads1112

汇总一系列AD/DA的驱动程序 ads1112.c #include "ads1112.h" #include "common.h"void AD5726_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );//PORTA、D时钟使能 G…

C++入门 vector部分模拟实现

目录 vector大致框架 vector常见接口模拟实现 begin迭代器 & end迭代器 capacity( ) & size( ) reserve operator[ ] push_back( ) & pop_back( ) sort vector大致框架 vector的内部的成员变量大概有三部分构成&#xff1a; namespace bit {template<c…

python字符串如何删除后几位

1、首先在jupyter notebook中新建一个空白的python文件&#xff1a; 2、然后定义一个字符串&#xff0c;用字符串截取的方式打印出排除最后三个字符的结果&#xff0c;这里的“s[:-3]”的意思就是从字符串取第0个字符至倒数第三个字符的前一个字符&#xff0c;这样就截取了最后…

DDP(Differential Dynamic Programming)算法举例

DDP(Differential Dynamic Programming)算法 基本原理 DDP(Differential Dynamic Programming)是一种用于求解非线性最优控制问题的递归算法。它基于动态规划的思想,通过线性化系统的动力学方程和二次近似代价函数,递归地优化控制策略。DDP的核心在于利用局部二次近似来…