绿盟二面面试题

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执行命令。

相关推荐
世界尽头与你2 小时前
CVE-2022-46463 Harbor public 镜像仓库信息泄露
安全·网络安全·渗透测试
zhaoyufei1334 小时前
Android13删除Taskbar
android
6***B486 小时前
存储过程(SQL)
android·数据库·sql
学困昇7 小时前
C++中的异常
android·java·c++
Jerry8 小时前
问题记录 - Android IdleHandler 没有执行
android
没有了遇见8 小时前
Android ButterKnife Android 35情况下 适配 Gradle 8.+
android
方白羽8 小时前
Android多层嵌套RecyclerView滚动
android·java·kotlin
wanhengidc9 小时前
云手机中的数据通常存储在哪里?
运维·服务器·安全·web安全·智能手机
菜就多学10 小时前
SurfaceControlViewHost 实现跨进程UI渲染
android·设计
2501_9151063210 小时前
iOS App 测试工具全景分析,构建从开发调试到线上监控的多阶段工具链体系
android·测试工具·ios·小程序·uni-app·iphone·webview