关于Spring Cloud Function SpEL的表达式注入漏洞分析
该篇文章记录了漏洞包装的过程在这个过程中克服的一些难点如:
无session情况下的冰蝎连接及Netty下通过Header头获取POST的body内容等。
在Spring Cloud Function SpEL RCE细节的公布后,所分析的文章有很多,在这里不需要再对其漏洞进行分析,我们一直以来的习惯就是对漏洞进行包装,Java中能够让RCE的漏洞尽量都注入冰蝎/哥斯拉/蚁剑内存马等,而不是满足于一些简单的回显或一句话内存马,然而我们这样做的好处其实是大家在实战利用的过程中更加方便,提升效率。
该文章可以分为三个部分:
1.漏洞复现
2.Spring Cloud Function在Netty下如何注入冰蝎内存马
3.Spring Cloud Function在Tomcat下如何注入冰蝎内存马
当我们确定了漏洞sink点之后,需向上寻找并找到四处调用的地方,且均在
org.springframework.cloud.function.context.config.RoutingFunction#route中
其中有一处是属于可控的调用点
我们将header头作为
spring.cloud.function.routing-expression的值当作spel表达式来解析的话
那么我们会看到如何执行到此处代码,紧接着寻找调用route的
org.springframework.cloud.function.context.config.RoutingFunction#apply 方法,到这里向上寻找调用点就变得很多了,回过头来看一下测试代码的例子
greeter路由对应的处理代码如下
回到我们的Routing-Function类同样是实现了Function接口,并存在apply方法,可以看到该类实现了Function接口,并自动调用apply方法,那我们这样如果能够直接访问RoutingFunction对应的路由,然后发送特定header的数据包,即可实现spel表达式注入,并查看该类是否发现其设置了FUNCTION_NAME属性。
这样的话就可以通过发送如下数据包来执行spel的表达式
url localhost:8080/functionRouter -H "Content-Type: text/plain" -H"spring.cloud.function.routing- expression:T(java.lang.Runtime).getRuntime().exec(\"calc\")" -d "aa,bb,cc,dd,ee"
在实际利用的时候不难发现其实我们只要去实现并去做对应的修改那样所有的安全漏洞都能化解。