mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/basic-java-deserializati
This commit is contained in:
parent
9322280ed6
commit
9e8168439c
@ -1,15 +1,27 @@
|
||||
# Msingi wa Java Deserialization na ObjectInputStream readObject
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Katika POST hii itafafanuliwa mfano ukitumia `java.io.Serializable`.
|
||||
Katika POST hii itafafanuliwa mfano unaotumia `java.io.Serializable` **na kwa nini kuandika upya `readObject()` kunaweza kuwa hatari sana ikiwa mtiririko wa kuingia unadhibitiwa na mshambuliaji**.
|
||||
|
||||
# Serializable
|
||||
## Serializable
|
||||
|
||||
Java `Serializable` interface (`java.io.Serializable` ni interface ya alama ambayo darasa zako lazima zitekeleze ikiwa zinapaswa kuwa **serialized** na **deserialized**. Uandishi wa serialization ya kitu cha Java unafanywa na [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html) na usomaji wa deserialization unafanywa na [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html).
|
||||
Interface ya Java `Serializable` (`java.io.Serializable`) ni interface ya alama ambayo madarasa yako yanapaswa kutekeleza ikiwa yanapaswa kuwa **serialized** na **deserialized**. Serialization ya kitu cha Java (kuandika) inafanywa na [`ObjectOutputStream`](http://tutorials.jenkov.com/java-io/objectoutputstream.html) na deserialization (kusoma) inafanywa na [`ObjectInputStream`](http://tutorials.jenkov.com/java-io/objectinputstream.html).
|
||||
|
||||
Tuone mfano wa **darasa la Person** ambalo ni **serializable**. Darasa hili **linakandamiza** kazi ya readObject, hivyo wakati **kitu chochote** cha **darasa hili** kinapokuwa **deserialized** kazi hii itatekelezwa.\
|
||||
Katika mfano, **kazi ya readObject** ya darasa la Person inaita kazi `eat()` ya mnyama wake na kazi `eat()` ya Mbwa (kwa sababu fulani) inaita **calc.exe**. **Tutashuhudia jinsi ya kuunda na kuondoa kitu cha Person ili kutekeleza kalkuleta hii:**
|
||||
### Kumbusho: Ni mbinu zipi zinazoitwa kimya kimya wakati wa deserialization?
|
||||
|
||||
**Mfano ufuatao unatoka [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)**
|
||||
1. `readObject()` – mantiki ya kusoma maalum kwa darasa (ikiwa imeandikwa na *binafsi*).
|
||||
2. `readResolve()` – inaweza kubadilisha kitu kilichodeserialized na kingine.
|
||||
3. `validateObject()` – kupitia `ObjectInputValidation` callbacks.
|
||||
4. `readExternal()` – kwa madarasa yanayotekeleza `Externalizable`.
|
||||
5. Waandishi hawatekelezwi – kwa hivyo mnyororo wa gadget unategemea pekee callbacks za awali.
|
||||
|
||||
Mbinu yoyote katika mnyororo huo inayomaliza kwa kuita data inayodhibitiwa na mshambuliaji (utendaji wa amri, utafutaji wa JNDI, reflection, nk.) inageuza utaratibu wa deserialization kuwa gadget ya RCE.
|
||||
|
||||
Hebu tuone mfano na **darasa la Person** ambalo ni **serializable**. Darasa hili **linandika upya** kazi ya readObject, hivyo wakati **kitu chochote** cha **darasa hili** kinapokuwa **deserialized** kazi hii itatekelezwa.\
|
||||
Katika mfano, kazi ya **readObject** ya darasa la Person inaita kazi `eat()` ya mnyama wake na kazi `eat()` ya Mbwa (kwa sababu fulani) inaita **calc.exe**. **Tutashuhudia jinsi ya kuandika na kusoma kitu cha Person ili kutekeleza kalkuleta hii:**
|
||||
|
||||
**Mfano ufuatao unatoka <https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649>**
|
||||
```java
|
||||
import java.io.Serializable;
|
||||
import java.io.*;
|
||||
@ -80,8 +92,63 @@ payloadTest("test.ser");
|
||||
}
|
||||
}
|
||||
```
|
||||
## Hitimisho
|
||||
### Hitimisho (hali ya kawaida)
|
||||
|
||||
Kama unavyoona katika mfano huu wa msingi, "udhaifu" hapa unaonekana kwa sababu **readObject** inaita **kazi nyingine zenye udhaifu**.
|
||||
Kama unavyoona katika mfano huu wa msingi, “udhaifu” hapa unatokea kwa sababu ya **method ya readObject()** **kuita nambari nyingine inayodhibitiwa na mshambuliaji**. Katika mnyororo wa vifaa wa ulimwengu halisi, maelfu ya madarasa yaliyomo katika maktaba za nje (Commons-Collections, Spring, Groovy, Rome, SnakeYAML, nk.) yanaweza kutumika vibaya – mshambuliaji anahitaji tu *moja* ya vifaa vinavyoweza kufikiwa ili kupata utekelezaji wa nambari.
|
||||
|
||||
---
|
||||
|
||||
## 2023-2025: Nini kipya katika mashambulizi ya deserialization ya Java?
|
||||
|
||||
* 2023 – CVE-2023-34040: Deserialization ya vichwa vya rekodi za makosa ya Spring-Kafka wakati bendera za `checkDeserExWhen*` zimewezeshwa ziliruhusu ujenzi wa vifaa vya kiholela kutoka kwa mada zilizochapishwa na mshambuliaji. Imerekebishwa katika 3.0.10 / 2.9.11. ¹
|
||||
* 2023 – CVE-2023-36480: Dhana ya mteja wa Java wa Aerospike ya seva inayotegemewa imevunjwa – majibu ya seva yenye uharibifu yalikuwa na mzigo wa serialized ambao ulitafsiriwa na mteja → RCE. ²
|
||||
* 2023 – CVE-2023-25581: Ufafanuzi wa sifa za wasifu wa mtumiaji wa `pac4j-core` ulikubali blobs za Base64 zilizo na `{#sb64}` na kuziunda licha ya `RestrictedObjectInputStream`. Sasisha ≥ 4.0.0.
|
||||
* 2023 – CVE-2023-4528: Huduma ya JSCAPE MFT Manager (bandari 10880) ilikubali vitu vya Java vilivyoandikwa kwa XML vinavyosababisha RCE kama root/SYSTEM.
|
||||
* 2024 – Mnyororo mpya wa vifaa kadhaa uliongezwa kwa ysoserial-plus(mod) ikiwa ni pamoja na madarasa ya Hibernate5, TomcatEmbed, na SnakeYAML 2.x ambayo yanapita baadhi ya filters za zamani.
|
||||
|
||||
## Kinga za kisasa unazopaswa kutekeleza
|
||||
|
||||
1. **JEP 290 / Ufiltraji wa Serialization (Java 9+)**
|
||||
*Ongeza orodha ya ruhusa au orodha ya kukataa ya madarasa:*
|
||||
```bash
|
||||
# Kubali tu DTO zako na java.base, kataa kila kitu kingine
|
||||
-Djdk.serialFilter="com.example.dto.*;java.base/*;!*"
|
||||
```
|
||||
Mfano wa programu:
|
||||
```java
|
||||
var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/*;!*" );
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
2. **JEP 415 (Java 17+) Kiwanda Maalum cha Filters** – tumia `BinaryOperator<ObjectInputFilter>` kutekeleza filters tofauti kwa kila muktadha wa utekelezaji (kwa mfano, kwa kila wito wa RMI, kwa kila mtumiaji wa foleni ya ujumbe).
|
||||
3. **Usifichue `ObjectInputStream` mbichi kwenye mtandao** – pendelea uandishi wa JSON/Binary bila maana ya utekelezaji wa nambari (Jackson baada ya kuzima `DefaultTyping`, Protobuf, Avro, nk.).
|
||||
4. **Mipaka ya Ulinzi wa Kina** – Weka urefu wa juu wa array, kina, marejeleo:
|
||||
```bash
|
||||
-Djdk.serialFilter="maxbytes=16384;maxdepth=5;maxrefs=1000"
|
||||
```
|
||||
5. **Kuchunguza vifaa kwa muda mrefu** – endesha zana kama `gadget-inspector` au `serialpwn-cli` katika CI yako ili kushindwa kwa ujenzi ikiwa kifaa hatari kinapatikana.
|
||||
|
||||
## Orodha ya zana iliyosasishwa (2024)
|
||||
|
||||
* `ysoserial-plus.jar` – tawi la jamii lenye > 130 mnyororo wa vifaa:
|
||||
```bash
|
||||
java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
```
|
||||
* `marshalsec` – bado ni rejeleo kwa uzalishaji wa vifaa vya JNDI (LDAP/RMI).
|
||||
* `gadget-probe` – ugunduzi wa haraka wa vifaa vya black-box dhidi ya huduma za mtandao.
|
||||
* `SerialSniffer` – wakala wa JVMTI unaochapisha kila darasa lilosomwa na `ObjectInputStream` (linafaida katika kuunda filters).
|
||||
* **Ushauri wa kugundua** – wezesha `-Djdk.serialDebug=true` (JDK 22+) ili kuandika maamuzi ya filter na madarasa yaliyokataliwa.
|
||||
|
||||
## Orodha ya haraka ya ukaguzi kwa utekelezaji salama wa `readObject()`
|
||||
|
||||
1. Fanya method iwe `private` na ongeza annotation ya `@Serial` (inasaidia uchambuzi wa statiki).
|
||||
2. Kamwe usiite mbinu zinazotolewa na mtumiaji au ufanye I/O katika method – soma tu maeneo.
|
||||
3. Ikiwa uthibitisho unahitajika, fanya baada ya deserialization, nje ya `readObject()`.
|
||||
4. Pendelea kutekeleza `Externalizable` na fanya usomaji wa maeneo wazi badala ya serialization ya kawaida.
|
||||
5. Jisajili `ObjectInputFilter` iliyoimarishwa hata kwa huduma za ndani (muundo unaostahimili kuathiriwa).
|
||||
|
||||
## Marejeleo
|
||||
|
||||
1. Spring Security Advisory – CVE-2023-34040 Java Deserialization katika Spring-Kafka (Agosti 2023)
|
||||
2. GitHub Security Lab – GHSL-2023-044: Deserialization Hatari katika Mteja wa Java wa Aerospike (Julai 2023)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user