描述

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情 恶意攻击者使用精心构造的JSON数据包,向spring-data-rest服务器提交恶意PATCH请求,可以执行任意的Java代码。

  • 影响范围:

环境搭建

使用Vulfocus项目提供的镜像进行测试。

搜索该漏洞的镜像,下载并启动容器。

复现

查找漏洞

进入容器提供的地址页面:http://10.9.21.12:21745/

看到页面返回的是一个json信息,并且存在 http://10.9.21.12:21745/personshttp://10.9.21.12:21745/profile 两个链接。

可以尝试打开这两个链接。

我们可以看到对于persons这个链接,存在一个空的数组 "persons" : []

而profile链接没有更多的有用信息了。

然后在这两个链接的返回信息中还会发现一个新的链接 http://10.9.21.12:21745/profile/persons

我们进入这个链接,会发现它描述了person对象的属性和方法。

我们可以根据这些信息来构造对象:

测试漏洞

REST语法支持的curd操作包括POST、DELETE、UPDATE/PATCH、GET。

对于PATCH方法,请求格式为JSON。根据RFC 6902,发送JSON文档结构需要注意以下几点:

1.请求头为Content-Type: _application/json-patch+json_;

2.需要参数op。其中op所支持的方法很多:

  • add,添加数据

  • remove,删除数据

  • replace,修改数据

  • move,移动数据

  • copy,拷贝数据

  • test,测试给定数据与指定位置数据是否相等

3.需要参数path。 值必须使用斜杠分割。

4.需要参数value。指定path变量修改后的值。

通过POST进行增加数据操作:

通过PATCH进行修改数据操作:

通过PATCH进行修改数据实现反弹shell:

  • 在监听端启动监听:

  • 构造用于反弹shell的payload:

该payload并不能直接使用,需要进行base64编码操作,然后获取ascii码,再通过java.lang.Runtime.getRuntime().exec(new java.lang.String())方法来绕过java限制。用于编码的python脚本如下:

代码执行结果:

  • 将代码输出的结果放到post请求参数的path中,重新发送请求:

如上图,该请求虽然会返回错误提示,但不影响payload执行,但是如果执行出错也是无法得知的。

  • payload执行成功后,监听端会获得一个shell连接。

进入/tmp目录,即可获取flag。