绿盟二面面试题

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

相关推荐
Danny_姜20 分钟前
Android Studio Quail 4 稳定版发布:本地 Gemma 4 + Android Skills
android·ide·android studio
平头哥AI10 小时前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
聚美智数11 小时前
图片广告检测-图片审核-图片广告识别-图像广告检测
android
早睡早起身体好12313 小时前
用 XGrammar 约束大模型工具调用:解决参数为空的问题
android·人工智能·神经网络·机器学习·自然语言处理·vllm
大佐不会说日语~15 小时前
Android 16 下 uni-app APP 提示“网络连接失败”的排障与修复
android·uni-app
2501_9151063216 小时前
苹果App Store上架费用及流程全面解析
android·ios·小程序·https·uni-app·iphone·webview
YF021118 小时前
Android 16系统App开机自启动方案
android
hm宋19 小时前
安卓手机卡顿优化 —— 背景与使用指南
android
OxYGC20 小时前
[Android] [WatchOS]智能手表第一篇: 实用工具与应用推荐
android·智能手表
Eason_LYC20 小时前
你天天用的AI工具,藏着无需登录的高危后门 CVE-2025-3248
网络安全·渗透测试·漏洞复现·白帽子·langflow·远程代码执行·cve-2025-3248