Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

Outline

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方法
Morty Proxy This is a proxified and sanitized view of the page, visit original site.