Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Ten post jest poświęcony zrozumieniu, jak gadget ObjectDataProvider jest wykorzystywany do uzyskania RCE oraz jak biblioteki serializacji Json.Net i xmlSerializer mogą być nadużywane z tym gadżetem.
Gadget ObjectDataProvider
Z dokumentacji: klasa ObjectDataProvider opakowuje i tworzy obiekt, który możesz użyć jako źródło powiązania. Tak, to dziwne wyjaśnienie, więc zobaczmy, co ta klasa ma, co jest tak interesujące: Ta klasa pozwala na opakowanie dowolnego obiektu, użycie MethodParameters do ustawienia dowolnych parametrów i następnie użycie MethodName do wywołania dowolnej funkcji dowolnego obiektu zadeklarowanego przy użyciu dowolnych parametrów. W związku z tym, dowolny obiekt będzie wykonywał funkcję z parametrami podczas deserializacji.
Jak to jest możliwe
Przestrzeń nazw System.Windows.Data, znajdująca się w PresentationFramework.dll w C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, to miejsce, w którym zdefiniowano i zaimplementowano ObjectDataProvider.
Używając dnSpy możesz zbadać kod klasy, która nas interesuje. Na poniższym obrazku widzimy kod PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Nazwa metody
Jak możesz zauważyć, gdy MethodName
jest ustawione, wywoływana jest base.Refresh()
, przyjrzyjmy się, co to robi:
Dobrze, kontynuujmy, aby zobaczyć, co robi this.BeginQuery()
. BeginQuery
jest nadpisywane przez ObjectDataProvider
i to jest to, co robi:
Zauważ, że na końcu kodu wywoływana jest this.QueryWorke(null)
. Zobaczmy, co to wykonuje:
Zauważ, że to nie jest pełny kod funkcji QueryWorker
, ale pokazuje interesującą część: Kod wywołuje this.InvokeMethodOnInstance(out ex);
to jest linia, w której ustawiona jest metoda.
Jeśli chcesz sprawdzić, że ustawienie MethodName** zostanie wykonane**, możesz uruchomić ten kod:
Zauważ, że musisz dodać jako odniesienie C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll, aby załadować System.Windows.Data
ExpandedWrapper
Korzystając z poprzedniego exploit, będą przypadki, w których obiekt będzie deserializowany jako instancja ObjectDataProvider (na przykład w przypadku podatności DotNetNuke, używając XmlSerializer, obiekt został deserializowany przy użyciu GetType
). Wtedy nie będziemy mieli wiedzy o typie obiektu, który jest opakowany w instancji ObjectDataProvider (na przykład Process
). Możesz znaleźć więcej informacji o podatności DotNetNuke tutaj.
Ta klasa pozwala określić typy obiektów obiektów, które są enkapsulowane w danej instancji. Tak więc, ta klasa może być używana do enkapsulowania obiektu źródłowego (ObjectDataProvider) w nowy typ obiektu i dostarczenia potrzebnych właściwości (ObjectDataProvider.MethodName i ObjectDataProvider.MethodParameters). Jest to bardzo przydatne w przypadkach takich jak ten przedstawiony wcześniej, ponieważ będziemy mogli opakować _ObjectDataProvider** wewnątrz instancji **ExpandedWrapper _ i po deserializacji ta klasa utworzy obiekt OjectDataProvider, który wykona funkcję wskazaną w MethodName.
Możesz sprawdzić ten wrapper za pomocą następującego kodu:
Json.Net
Na oficjalnej stronie wskazano, że ta biblioteka pozwala na serializację i deserializację dowolnego obiektu .NET za pomocą potężnego serializatora JSON Json.NET. Więc, jeśli moglibyśmy zdeserializować gadżet ObjectDataProvider, moglibyśmy spowodować RCE po prostu deserializując obiekt.
Przykład Json.Net
Przede wszystkim zobaczmy przykład, jak serializować/zdeserializować obiekt za pomocą tej biblioteki:
Wykorzystywanie Json.Net
Używając ysoserial.net stworzyłem exploit:
W tym kodzie możesz przetestować exploit, po prostu go uruchom, a zobaczysz, że kalkulator zostanie uruchomiony:
Last updated