绿盟二面面试题

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

相关推荐
-曾牛13 分钟前
Yak:专注安全能力融合的编程语言快速入门
安全·网络安全·golang·渗透测试·编程语言·yakit·yak
薛晓刚20 分钟前
MySQL的replace使用分析
android·adb
DengDongQi43 分钟前
Jetpack Compose 滚轮选择器
android
stevenzqzq43 分钟前
Android Studio Logcat 基础认知
android·ide·android studio·日志
代码不停1 小时前
MySQL事务
android·数据库·mysql
朝花不迟暮1 小时前
使用Android Studio生成apk,卡在Running Gradle task ‘assembleDebug...解决方法
android·ide·android studio
yngsqq1 小时前
使用VS(.NET MAUI)开发第一个安卓APP
android·.net
Bug.ink1 小时前
BUUCTF——WEB(8)
web安全·网络安全·buuctf
Android-Flutter1 小时前
android compose LazyVerticalGrid上下滚动的网格布局 使用
android·kotlin
Android-Flutter1 小时前
android compose LazyHorizontalGrid水平滚动的网格布局 使用
android·kotlin