腾讯云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为例:
-
服务器收到请求,进入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方法通过反射调用任意方法
- 如Springboot中的
示例对比:
-
被拦截的调用栈:
_jspService org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute ProcessImpl.start -
绕过的调用栈:
在新线程中执行,不包含请求线程标记
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示例:
// 通过DriverManager.getConnection触发(静态方法调用被禁用)
// 改用PgConnection构造方法
Properties props = new Properties();
// 设置恶意参数
new PgConnection(new HostSpec[]{...}, props)
2.3.2 文件写入绕过
两种写入方法:
FileOutputStream.write- 接近native方法,hook严格- NIO API (
Files.newOutputStream) - 调用链长,hook点可能在后端
NIO API调用链:
Files.newOutputStream
-> FileSystemProvider.newOutputStream
-> 底层实现
绕过思路:
- 通过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点,可以找到多种绕过路径。防御方需要不断完善检测规则,实施深度防御策略,才能有效应对日益复杂的绕过技术。