jak je vidět výše, kód dává chybu „výjimka ve vlákně „hlavní“ java.lang.ClassCastException: testserialization.ExploitDeser nemůže být obsazen testserializace.Zaměstnanec “ což znamená, že typ-casting není správné, ale kód stále dostane vykonán. Funkce readObject třídy DeserializeDemo je schopna provést vlastní implementaci readObject třídy ExploitDeser.,
Toto je to, co je nejistá rekonstrukci zde, že i když tam je type-casting chyba stále, pokud serializovaná data z vlastní třídy s vlastní provádění readObject je k dispozici jako vstup, se dostane popraven jako je uvedeno výše.
Toto je to, co je děláno tím, že gadget řetězy používané ysoserial a další java rekonstrukci využívání nástrojů, kde hledají řetězení tříd, aby konečně pozemků do vlastní realizace readObject, které může provádět systémové úrovni kódu za předpokladu, jako součást uživatelského vstupu.,
sanace
nyní, když jsme se podívali na to, co je Deserializace a jak se využívá, podívejme se na nápravu.
sanace, o které budeme diskutovat, se nazývá „ověření třídy Look-ahead“, kde můžeme whitelistovat seznam tříd, které chceme získat deserialized. Příklad. v našem scénáři jsme očekávali, že umožňují pouze Zaměstnanec objekt třídy data získat rekonstruován a pro zbývající, to by nemělo umožnit rekonstrukci.,
Takže, v podstatě to, co tato metoda dělá, je, přepíše funkci „resolveClass“, který je součástí „ObjectInputStream“(používá se při rekonstrukci) třída a provádí bílou výpis seznamu hodiny, které musí být rekonstruován.
Nyní, když jsme hotovi s teorií, umožňuje přejít k implementaci.,
Umožňuje vytvořit novou třídu „LookAheadObjectInputStream“ rozšířit na ObjectInputSteam třídy, takže to můžeme přepsat členské funkce resolveClass:
výše uvedený kód řádku:
if (!desc.getName().equals(Employee.class.getName())) {
je v podstatě hledat, jestli serializoval obsahu obsahuje objekt Zaměstnanec třídy ostatní, že poskytuje chybu „Neoprávněný pokus o rekonstrukci“ a brání jeho výkon.,
Nyní, konečný upravený kód pro „DeserializedDemo“ je, jak je uvedeno níže:
Ve výše uvedeném kódu, sledovat zvýrazněný kód, v němž místo volání ObjectInputStream třídy, LookAheadObjectInputStream třídy je stále volal, která přepíše resolveClass metoda, při běhu a způsobem provedení.
nyní umožňuje předat škodlivý.,ser soubor vytvořen dříve jako vstup pro rekonstrukci a sledujte výstup:
Jak lze vidět výše, tento čas na vlastní realizaci readObject z vlastní třídy „ExploitDeser“ není vykonán během deserializace., Místo toho jsme jsou k dispozici s vlastní chybovou zprávu „Neoprávněný pokus o rekonstrukci“, která byla založena v potlačené resolveClass funkce pod LookAheadObjectInputStream třídy.
jedná se o velmi jednoduchý příklad použití metody ověřování třídy look-ahead, aby se zabránilo nezabezpečené deserializaci. Rozsáhlou implementací této myšlenky je knihovna „serialKiller“. Odkaz lze nalézt níže:
proto to lze považovat za jedno z řešení pro zmírnění nezabezpečené deserializace v Javě.,
stále se zabývám dalšími metodami zmírňování, o kterých budu později blogovat.
poskytněte svou cennou zpětnou vazbu. Do té doby pokračujte v hackování a učení….