绿盟二面面试题

5000篇网安资料库https://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247486065&idx=2&sn=b30ade8200e842743339d428f414475e&chksm=c0e4732df793fa3bf39a6eab17cc0ed0fca5f0e4c979ce64bd112762def9ee7cf0112a7e76af&scene=21#wechat_redirect

1. 原理深度:Java反序列化漏洞的底层机制是什么?为什么反序列化可能导致RCE?

参考答案

  • 机制 :Java反序列化通过ObjectInputStream将二进制数据还原为对象。若攻击者控制输入,可构造恶意对象,在反序列化时触发危险操作(如动态代理、反射调用)。

  • RCE成因

    1. Gadget链 :利用类库中多个可串联的类(如InvokerTransformerTemplatesImpl),通过链式调用执行任意代码。

    2. 动态加载 :某些类(如URLClassLoader)允许加载远程代码,结合反序列化触发类初始化逻辑。

    3. 反射调用 :利用Method.invoke()Runtime.exec()等实现命令执行。

  • 关键点 :反序列化过程中未对输入数据进行校验,导致恶意类的readObject()readExternal()方法被触发。

2. 框架漏洞:Apache Commons Collections如何被用于构造反序列化利用链?请描述具体类和方法的作用。

参考答案

  • 核心类

    • InvokerTransformer:通过反射调用任意方法,如Runtime.getRuntime().exec("cmd")

    • ChainedTransformer:将多个Transformer串联,形成链式调用。

    • ConstantTransformer:返回固定值,用于传递恶意对象。

    • TransformedMap/LazyMap:在Map操作时触发Transformer链。

  • 利用链构造

    1. 构造ChainedTransformer链,串联反射调用Runtime.exec()

    2. 通过TransformedMap.decorate()包装Map,使Map的put()get()操作触发Transformer链。

    3. 利用AnnotationInvocationHandlerreadObject()反序列化入口,触发Map操作。

  • 示例Payload

    复制代码
    Transformer[] transformers = new Transformer[]{
      new ConstantTransformer(Runtime.class),
      new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
      new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
      new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"})
    };
    ChainedTransformer chain = new ChainedTransformer(transformers);

3. 防御机制:如何有效防御Java反序列化漏洞?对比黑名单与白名单方案的优缺点。

参考答案

  • 防御手段

    1. 输入验证:禁止反序列化不可信数据。

    2. 白名单 :使用ValidatingObjectInputStream(VOIS)仅允许反序列化安全类。

    3. 替换序列化机制:使用JSON(如Jackson)或Protocol Buffers替代Java原生序列化。

    4. JEP 290:JDK9+的过滤器机制,通过模式匹配限制反序列化类。

    5. 安全加固:移除危险类库(如Commons Collections 3.x升级至4+)。

  • 黑名单 vs 白名单

    • 黑名单 :拦截已知危险类(如InvokerTransformer),但易被绕过(新增Gadget或组合类)。

    • 白名单:仅允许已知安全类,安全性更高,但维护成本较大(需覆盖业务所有合法类)。

4. 框架案例:Fastjson反序列化漏洞的原理是什么?如何利用TemplatesImpl类实现RCE?

参考答案

  • 漏洞原理 :Fastjson的autoType功能允许反序列化时指定任意类。攻击者可构造恶意JSON,触发目标类的setter/getter或构造函数中的危险操作。

  • TemplatesImpl利用

    1. 构造恶意类 :生成一个继承AbstractTranslet的类,在静态代码块或构造函数中插入恶意代码。

    2. Base64编码:将类字节码Base64编码后嵌入JSON。

    3. 触发加载 :通过@type指定com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl,并设置_bytecodes_outputProperties字段,触发类加载与初始化。

  • Payload示例

    复制代码
    {
      "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
      "_bytecodes": ["恶意类Base64编码"],
      "_outputProperties": {}
    }

5. 高级绕过:如何绕过反序列化黑名单机制?请举例说明一种非传统的Gadget链构造方法。

参考答案

  • 绕过手段

    1. 利用冷门类库 :如使用groovy.util.Expandoorg.apache.xbean等非默认黑名单类构造链。

    2. 动态加载字节码 :通过BCEL ClassLoaderClassLoader.defineClass()加载远程字节码。

    3. 二次反序列化 :利用Serializable对象内部嵌套另一个反序列化入口点。

  • 示例:BCEL绕过

    复制代码
    String className = "$$BCEL$$..."; // BCEL格式的恶意类字节码
    ClassLoader loader = new ClassLoader() {};
    Class clazz = loader.loadClass(className);
    clazz.newInstance();
  • 反射+动态代理 :通过Proxy.newProxyInstance()创建代理类,结合InvocationHandler执行命令。

相关推荐
小阳睡不醒24 分钟前
小白成长之路-部署Zabbix7(二)
android·运维
mmoyula2 小时前
【RK3568 PWM 子系统(SG90)驱动开发详解】
android·linux·驱动开发
终焉暴龙王4 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
你过来啊你4 小时前
Android用户鉴权实现方案深度分析
android·鉴权
百川5 小时前
Apache文件解析漏洞
web安全·apache
kerli7 小时前
Android 嵌套滑动设计思想
android·客户端
恣艺8 小时前
LeetCode 854:相似度为 K 的字符串
android·算法·leetcode
阿华的代码王国8 小时前
【Android】相对布局应用-登录界面
android·xml·java
用户207038619499 小时前
StateFlow与SharedFlow如何取舍?
android