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

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

前言

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.mfbz.cn/a/731301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

名校介绍|英国六所红砖大学

​近年来由于美国的拒签率增加&#xff0c;很多公派申请者&#xff0c;尤其是CSC资助的访问学者、公派联合培养学生及博士后研究学者&#xff0c;把出国目标改为其它发达国家&#xff0c;尤以英国居多&#xff0c;本文知识人网小编就重点介绍六所英国红砖大学。 我们在“英国大…

乐观锁实现库存控制

一、什么是乐观锁&#xff1f; 乐观锁是一种基于版本控制的并发控制机制。在乐观锁的思想中&#xff0c;认为数据访问冲突的概率很低&#xff0c;因此不加锁直接进行操作&#xff0c;但在更新数据时会进行版本比对&#xff0c;以确保数据的一致性。 乐观锁的原理主要基于版本号…

Spring IOC 控制反转(注解版)

Spring IOC 控制反转 文章目录 Spring IOC 控制反转一、前言什么是控制反转&#xff08;IOC&#xff09;什么是依赖注入&#xff08;DI&#xff09; 二、介绍 IOC2.1 传统思想代码2.2 解决方案2.3 IOC思想代码2.4 IOC 使用&#xff08;Autowired依赖注入&#xff09;2.5 IOC 优…

Service方法增加@Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException

Service方法增加Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException 场景处理方法原因 场景 首先确认的是Service添加了Service或Component等注解&#xff0c;另外也增加了ComponentScan确定扫描的包路径是包含对应Service的&#xff0c;但就是无法找到这个bean。 通…

从艳彩山水到艳彩艺术 薛永年:郭泰来艳彩艺术填补了中国美术史的空白

薛永年先生 自6月12日开展以来&#xff0c;郭泰来现代艺术大展杭州如火如荼地进行着&#xff0c;吸引了众多艺术爱好者和专业人士前往。毫不夸张地说&#xff0c;总统和清洁工人都能在他的作品中找到自己心中的那一块共振带并与之产生强烈的共鸣&#xff0c;这便是郭泰来先生的…

Vector 例题

例题一&#xff1a; 下面这个代码输出的是( ) &#xfeff;#include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); a…

Python学习笔记16:进阶篇(五)异常处理

异常 在编程中&#xff0c;异常是指程序运行过程中发生的意外事件&#xff0c;这些事件通常中断了正常的指令流程。它们可能是由于错误的输入数据、资源不足、非法操作或其他未预料到的情况引起的。Python中&#xff0c;当遇到这类情况时&#xff0c;会抛出一个异常对象&#…

34.构建核心注入代码

上一个内容&#xff1a;33.获取入口点 以 33.获取入口点 它的代码为基础进行修改 实现的功能是把LoadLibrary函数注入到目标进程实现加载我们的模块。LoadLibrary只有有程序使用过了它的代码就会加载到内存中&#xff08;因为动态链接库是内存加载&#xff09;就是a程序要用L…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Polyp-DDPM: Diffusion-Based Semantic Polyp Synthesis for Enhanced Segmentation

Polyp- ddpm:基于扩散的语义Polyp合成增强分割 摘要&#xff1a; 本研究介绍了一种基于扩散的方法Polyp-DDPM&#xff0c;该方法用于生成假面条件下息肉的逼真图像&#xff0c;旨在增强胃肠道息肉的分割。我们的方法解决了与医学图像相关的数据限制、高注释成本和隐私问题的挑…

尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】

视频地址&#xff1a;一套上手ClickHouse-OLAP分析引擎&#xff0c;囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…

Comfy UI使用最新SD3模型,并解决报错‘NoneType‘ object has no attribute ‘tokenize‘【实测可行】

解决Comfy UI使用最新SD3模型报错’NoneType’ object has no attribute ‘tokenize’ 前几天SD3发布了&#xff0c;所以想着尝尝鲜&#xff0c;便去下载了SD3来玩一玩。使用的是Comfy UI而不是Stable Diffusion UI&#xff0c;这是一个比SD UI更加灵活的UI界面&#xff0c;使用…

内容安全复习 4 - 深度生成模型

文章目录 概述经典算法自回归模型&#xff08;Autoregressive model&#xff09;变分自编码器&#xff08;VAE&#xff09;生成对抗网络&#xff08;GAN&#xff09;扩散模型&#xff08;Diffusion model&#xff09;总结 应用 概述 深度生成模型是一类使用深度学习技术构建的…

L55--- 257.二叉树的所有路径(深搜)---Java版

1.题目描述 2.思路 &#xff08;1&#xff09;因为是求二叉树的所有路径 &#xff08;2&#xff09;然后是带固定格式的 所以我们要把每个节点的整数数值换成字符串数值 &#xff08;3&#xff09;首先先考虑根节点&#xff0c;也就是要满足节点不为空 返回递归的形式dfs(根节…

数字内容“遍地开花”,AI技术如何创新“造梦”?

文 | 智能相对论 作者 | 陈泊丞 这是春晚舞台西安分会场《山河诗长安》的一幕&#xff1a;“李白”现世&#xff0c;带领观众齐颂《将进酒》&#xff0c;将中国人骨子里的豪情与浪漫演绎得淋漓尽致。 这又是浙江义乌商品市场里的另一幕&#xff1a;只会说几个英文单词的女老板…

入门Ansible常用模块

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具&#xff0c;基于Python 开发&#xff0c;集合了众多运维工具&#xff08;puppet 、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…

小程序 如何支付后获取 Unionid

接口说明 接口英文名 getPaidUnionid 功能描述 该接口用于在用户支付完成后&#xff0c;获调用本接口前需要用户完成支付&#xff0c;用户支付完成后&#xff0c;取该用户的 UnionId&#xff0c;无需用户授权。本接口支付后的五分钟内有效。 注意事项 调用前需要用户完成…

直播websocket签名signature字段生成逻辑,一步一步带你研究学习

现在每个直播的链接都要签名字段才可以校验成功&#xff0c;所以需要开始debug逻辑&#xff0c;研究一下这个加密的签名字段哪里来的&#xff0c;先找到这个发送请求的js代码在哪里&#xff1a; 找到发送websocket的地方了&#xff0c;看了一下_getSocketParams这就是获取请求参…

String(C++)

文章目录 前言文档介绍经典题目讲解HJ1 字符串最后一个单词的长度 模拟实现框架构造函数析构函数迭代器c_str()赋值size()capacity()reserveempty()[ ]访问front/backpush_backappendoperatorinsert一个字符insert一个字符串eraseswapfind一个字符find一个字符串substr()clear(…

超级会员卡积分收银系统源码 带完整的安装代码包以及搭建部署教程

系统概述 超级会员卡积分收银系统源码是一款专为商业运营打造的综合性软件解决方案。它集成了会员卡管理、积分管理、收银管理等多种功能&#xff0c;旨在为企业提供高效、便捷、准确的运营管理工具。 该系统源码采用先进的技术架构&#xff0c;具有良好的稳定性和扩展性&…