漏洞复现 - Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
基础知识
今天和昨天的漏洞都跟SpEL有关。SpEL是Spring的表达式语言,支持在运行时查询和操作对象图,可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,可节省大量Java代码。
用bean做实验:
调用结果:
漏洞原理
在REST API的Patch方法中(实现RFC6902),path的值被传入setValue
,导致执行了SpEL表达式,触发远程命令执行漏洞。
复现环境
在ubuntu 16.04虚拟机中用vulhub靶场提供的docker容器来复现
jdk版本1.7
影响版本
pivotal Spring Data REST < 2.5.12 2.6.7 3.0 RC3
pivotal Spring Boot < 2.0.0M4
pivotal Spring Data < Kay-RC3
复现过程
1. 进入vulhub目录:spring/CVE-2017-8046,启动docker容器
2.发送如下请求,利用SpEL表达式执行恶意代码:
3.查看结果,恶意代码执行成功
这里的SpEL用的就是基础知识里面提到的第二种使用方式,使用了java.lang.Runtime类的getRuntime().exec方法,可是这里为啥要转成byte[],不直接传字符串?
试了下直接调SpelExpression是可以直接传字符串的:
再发一次之前的PATCH请求,直接传字符串T(java.lang.Runtime).getRuntime().exec(new java.lang.String('touch /tmp/success')),没有成功,好吧,可能是源程序里面的参数类型是byte[]吧。。
看了一下Spring目录后面的几个目录,都是SpEL命令执行造成的,原理差不多,就不一一复现了。
本文仅用于技术学习和交流,严禁用于非法用途,否则产生的一切后果自行承担。
相关文章
- 算法系列15天速成——第八天 线性表【下】
- 算法系列15天速成——第七天 线性表【上】
- 算法系列15天速成——第六天 五大经典查找【下】
- 算法系列15天速成——第五天 五大经典查找【中】
- 算法系列15天速成——第四天 五大经典查找【上】
- 算法系列15天速成——第三天 七大经典排序【下】
- 算法系列15天速成——第二天 七大经典排序【中】
- 算法系列15天速成——第一天 七大经典排序【上】
- wcf系列学习5天速成——第五天 服务托管
- wcf系列学习5天速成——第四天 wcf之分布式架构
- wcf系列学习5天速成——第三天 事务的使用
- wcf系列5天速成——第二天 binding的使用(2)
- wcf系列5天速成——第一天 binding的使用(1)
- 介绍一个小工具 Linqer
- 好奇!仅 13kB 大小的游戏,源码长啥样?
- 桀骜不驯的代码又搞事情?我找来 10 个开源项目帮你驯服它们!
- 这款开源测试神器,圆了我玩游戏不用动手的梦想
- 任由文字肆意流淌,更自由的开源 Markdown 编辑器
- 解锁 VS Code 更多可能性,轻松入门 WebView
- 最简单的人工神经网络