腾讯云RASP挑战赛绕过思路挖掘
字数 1826 2025-09-01 11:26:03

RASP绕过技术深度分析与实践指南

1. RASP技术概述

1.1 RASP定义与特点

RASP(Runtime Application Self-Protection,运行时应用自我保护)是一种应用安全防护技术,它将安全防护逻辑嵌入到应用程序内部,在应用运行时实时监测并阻断攻击。

核心特点

  • 检测能力精准,误报率低
  • 具备0Day漏洞发现能力
  • 相比传统WAF更深入应用内部
  • 通过Java Instrumentation API实现类插桩

1.2 RASP检测流程

以Springboot + SpEL + ProcessBuilder.start为例:

  1. 服务器收到请求,进入hook点

    • 标记当前线程为请求线程
    • 开启检测开关
    • 缓存请求和响应对象
  2. 执行ProcessImpl创建逻辑

  3. 进入ProcessBuilderHook点

    • Hook了ProcessImpl和UNIXProcess类的创建
    • 判断当前线程是否为请求线程
  4. 检测逻辑

    • 传递堆栈信息、方法名、方法参数给检测插件
    • 使用恶意命令执行来源名单进行匹配
    • 检测反射调用
  5. 根据检测结果决定拦截或放行

  6. 拦截处理

    • 输出报警日志
    • 302跳转或重置响应内容
    • 输出拦截页面JS脚本

2. RASP绕过技术详解

2.1 请求线程绕过

原理
RASP通过判断当前线程是否为请求线程来决定是否进行检测。如果能在非请求线程中执行恶意操作,则可绕过检测。

实现方法

  1. 寻找能创建新线程并执行危险方法的类

    • java.util.concurrent.Executors.newSingleThreadExecutor()
    • 获取ThreadPoolExecutor对象,通过submit执行Runnable
  2. 寻找可执行恶意操作的Runnable实现类

    • 如Springboot中的org.springframework.scheduling.support.ScheduledMethodRunnable
    • run方法通过反射调用任意方法

示例对比

  • 被拦截的调用栈:

    _jspService
    org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute
    ProcessImpl.start
    
  • 绕过的调用栈:
    在新线程中执行,不包含请求线程标记

2.2 Hook点组合绕过

绕过点分析

  1. 方法hook绕过 - 执行不在RASP拦截hook类中的方法
  2. 调用栈检测绕过 - 执行恶意操作但调用栈中无已知命令执行来源

绕过条件

  • 找到可调用任意方法的source
  • 找到不受限制的sink

云环境限制

  • 禁止反射调用:Class.forName().getMethod().invoke()
  • 禁止静态方法调用:A.b()
  • 禁止链式调用:new A().b().c()

2.3 具体绕过实现

2.3.1 利用PostgreSQL漏洞(CVE-2022-21724)

步骤

  1. 获取当前applicationContext对象
  2. 利用ClassPathXmlApplicationContext加载恶意XML执行代码

Payload示例

// 通过DriverManager.getConnection触发(静态方法调用被禁用)
// 改用PgConnection构造方法
Properties props = new Properties();
// 设置恶意参数
new PgConnection(new HostSpec[]{...}, props)

2.3.2 文件写入绕过

两种写入方法

  1. FileOutputStream.write - 接近native方法,hook严格
  2. NIO API (Files.newOutputStream) - 调用链长,hook点可能在后端

NIO API调用链

Files.newOutputStream
-> FileSystemProvider.newOutputStream
-> 底层实现

绕过思路

  • 通过XML手动实现文件写入逻辑
  • 避免直接触发RASP hook点

2.3.3 命令执行绕过

限制

  • 直接系统命令执行被严格拦截
  • 反射调用命令执行被拦截

替代方案

  1. 利用classloader加载字节码
    • 风险:操作classloader易被检测
  2. 上传JSP/class文件让系统加载
    • 更隐蔽,利用系统自身机制

JSP魔改技术

  • 修改JSP代码结构避免检测
  • 结合线程切换清除栈信息

3. 防御建议

3.1 对开发者的建议

  • 避免使用危险函数和反射调用
  • 严格控制文件上传和动态加载
  • 定期更新依赖库修复已知漏洞

3.2 对安全人员的建议

  • 监控非请求线程中的可疑操作
  • 加强对NIO API等长调用链的监控
  • 关注XML解析等可能引入代码执行的场景
  • 实施多层防御,不依赖单一RASP防护

4. 总结

RASP绕过技术核心在于混淆执行上下文和利用未被完全防护的调用链。通过分析RASP的检测逻辑和hook点,可以找到多种绕过路径。防御方需要不断完善检测规则,实施深度防御策略,才能有效应对日益复杂的绕过技术。

RASP绕过技术深度分析与实践指南 1. RASP技术概述 1.1 RASP定义与特点 RASP(Runtime Application Self-Protection,运行时应用自我保护)是一种应用安全防护技术,它将安全防护逻辑嵌入到应用程序内部,在应用运行时实时监测并阻断攻击。 核心特点 : 检测能力精准,误报率低 具备0Day漏洞发现能力 相比传统WAF更深入应用内部 通过Java Instrumentation API实现类插桩 1.2 RASP检测流程 以Springboot + SpEL + ProcessBuilder.start为例: 服务器收到请求,进入hook点 标记当前线程为请求线程 开启检测开关 缓存请求和响应对象 执行ProcessImpl创建逻辑 进入ProcessBuilderHook点 Hook了ProcessImpl和UNIXProcess类的创建 判断当前线程是否为请求线程 检测逻辑 传递堆栈信息、方法名、方法参数给检测插件 使用恶意命令执行来源名单进行匹配 检测反射调用 根据检测结果决定拦截或放行 拦截处理 输出报警日志 302跳转或重置响应内容 输出拦截页面JS脚本 2. RASP绕过技术详解 2.1 请求线程绕过 原理 : RASP通过判断当前线程是否为请求线程来决定是否进行检测。如果能在非请求线程中执行恶意操作,则可绕过检测。 实现方法 : 寻找能创建新线程并执行危险方法的类 如 java.util.concurrent.Executors.newSingleThreadExecutor() 获取 ThreadPoolExecutor 对象,通过 submit 执行 Runnable 寻找可执行恶意操作的 Runnable 实现类 如Springboot中的 org.springframework.scheduling.support.ScheduledMethodRunnable 其 run 方法通过反射调用任意方法 示例对比 : 被拦截的调用栈: 绕过的调用栈: 在新线程中执行,不包含请求线程标记 2.2 Hook点组合绕过 绕过点分析 : 方法hook绕过 - 执行不在RASP拦截hook类中的方法 调用栈检测绕过 - 执行恶意操作但调用栈中无已知命令执行来源 绕过条件 : 找到可调用任意方法的source 找到不受限制的sink 云环境限制 : 禁止反射调用: Class.forName().getMethod().invoke() 禁止静态方法调用: A.b() 禁止链式调用: new A().b().c() 2.3 具体绕过实现 2.3.1 利用PostgreSQL漏洞(CVE-2022-21724) 步骤 : 获取当前 applicationContext 对象 利用 ClassPathXmlApplicationContext 加载恶意XML执行代码 Payload示例 : 2.3.2 文件写入绕过 两种写入方法 : FileOutputStream.write - 接近native方法,hook严格 NIO API ( Files.newOutputStream ) - 调用链长,hook点可能在后端 NIO API调用链 : 绕过思路 : 通过XML手动实现文件写入逻辑 避免直接触发RASP hook点 2.3.3 命令执行绕过 限制 : 直接系统命令执行被严格拦截 反射调用命令执行被拦截 替代方案 : 利用classloader加载字节码 风险:操作classloader易被检测 上传JSP/class文件让系统加载 更隐蔽,利用系统自身机制 JSP魔改技术 : 修改JSP代码结构避免检测 结合线程切换清除栈信息 3. 防御建议 3.1 对开发者的建议 避免使用危险函数和反射调用 严格控制文件上传和动态加载 定期更新依赖库修复已知漏洞 3.2 对安全人员的建议 监控非请求线程中的可疑操作 加强对NIO API等长调用链的监控 关注XML解析等可能引入代码执行的场景 实施多层防御,不依赖单一RASP防护 4. 总结 RASP绕过技术核心在于混淆执行上下文和利用未被完全防护的调用链。通过分析RASP的检测逻辑和hook点,可以找到多种绕过路径。防御方需要不断完善检测规则,实施深度防御策略,才能有效应对日益复杂的绕过技术。