Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

Spring

谈谈Spring Whitelabel SPEL RCE(★★★)

Spring处理参数值出错时会将参数中${}中的内容当作SPEL解析实现,造成RCE漏洞

谈谈Spring Data REST SPEL RCE(★★)

当使用JSON PATCH对数据修改时,传入的PATH参数会解析SPEL

谈谈Spring Web Flow SPEL RCE(★★)

Model的数据绑定上存在漏洞,但漏洞出发条件比较苛刻

由于没有明确指定相关Model的具体属性,导致从表单可以提交恶意的表达式SPEL被执行

谈谈Spring Messaging SPEL RCE(★★)

其中的STOMP模块发送订阅命令时,支持选择器标头,该选择器充当基于内容路由的筛选器

这个筛选器selector属性的值会解析SPEL导致RCE

谈谈Spring Data Commons SPEL RCE(★★)

请求参数中如何包含SPEL会被解析,参考下方Payload

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("calc.exe")]

谈谈最新的Spring Cloud Gateway SPEL的RCE漏洞(★★★)

本质还是SPEL表达式,本来这是一个需要修改配置文件导致的鸡肋RCE漏洞

但因为Gateway提供了Actuator相关的API可以动态地注册Filter,而在注册的过程中可以设置SPEL表达式

实战利用程度可能不高,目标未必开着Actuator接口,就算开放也不一定可以正常访问注册Filter的接口

Spring Cloud Gateway SPEL的RCE漏洞可以回显吗(★★★★)

P牛在漏洞爆出的凌晨就发布了相关的环境和POC

参考P牛的回显代码:在相应头里面添加一个新的头,利用工具类把执行回显写入

{
    "name": "AddResponseHeader",
    "args": {
        "value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}",
        "name": "cmd123"
    }
}

Spring Cloud Gateway SPEL的RCE漏洞如何修复的(★★)

参考很多SPEL漏洞的修复手段,默认情况使用StandardContext可以执行Runtime.getRuntime().exec()这样的危险方法

修复是重写一个GatewayContext用来执行SPEL,这个context的底层是SimpleEvaluationContext只能执行有限的操作

Spring Cloud Function RCE漏洞了解吗(★★)

这也是Spring Cloud种的一个组件,不过并不常用

利用方式是某个请求头支持SpEL的格式并且会执行

POST / HTTP/1.1
...
spring.cloud.function.routing-expression: SPEL

修复方案比较简单,使用SimpleEvaluationContext即可

SPEL拒绝服务漏洞了解吗(★★)

参考先知社区4ra1n师傅的文章:https://xz.aliyun.com/t/11114

危害不大,但影响较广,所有能够执行SpEL的框架,都可以通过初始化巨大的数组造成拒绝服务漏洞

修复方案是限制SpEL种数组初始化的长度(一般业务也不可能在SpEL种初始化很大的数组)

谈谈Spring RCE的基本原理(★★★★)

该漏洞与很久以前的SpringMVC对象绑定漏洞有关,曾经的修复方案是:如果攻击者尝试以class.classloader获取任意class对象的loader时跳过

这里的对象绑定是指将请求中的参数绑定到控制器(Controller)方法中的参数对象的成员变量,例如通过usernamepassword等参数绑定到User对象

由于在JDK9中加入了模块module功能,可以通过class.module.classLoader得到某class对应的classloader进而利用

Tomcat环境下拿到的classloader对象中包含了context,进而通过pipeline拿到AccessLogValue对象,该类用于处理Tomcat访问日志相关。通过修改其中的字段信息,可以将webshell写入指定目录下的指定文件中,以达到RCE的目的

谈谈Spring RCE的利用条件(★★★)

  1. JDK9+(核心是利用到module功能)
  2. Tomcat(为了拿到可利用的Classloader对象)
  3. 必须存在对象绑定,如果是Stringint等基本类型参数则不生效

Spring RCE为什么在SpringBoot中不生效(★★★★)

因为在SpringBoot中拿到的classloaderAppClassloader类,该类不存在无参的getResources方法且没有其他可操作的空间,所以无法利用

谈谈Spring RCE的修复(★★★)

beanClassClass时只允许参数名为name并以Name结尾且属性返回类型不能为ClassloaderClassloader子类

SpringBoot如果有任意文件写入如何RCE(★★★★)

由于SpringBootFarJar形式的一个Jar包,因此无法在其运行的时候往classpath中增加文件,另外SpringBoot的应用通常不解析JSP等模板文件,所以传统的上传webshellRCE的思路是无效的

思路是覆盖了JAVA_HOME中没有被加载的系统Jar文件,例如charsets.jar文件,然后想办法在运行中加载该jar文件

难点在于可控的主动类初始化,主要的两种实际利用是:

  • 利用Accept: text/html;charset=GBK请求头触发Spring中的Charset.forName方法
  • 使用Fastjson1.2.76版本通过普通的JSON即可触发Charset.forName方法