Exploiting __VIEWSTATE without knowing the secrets
Savet za bug bounty: registrujte se za Intigriti, premium platformu za bug bounty kreiranu od hakera, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!
Šta je ViewState
ViewState služi kao podrazumevani mehanizam u ASP.NET-u za održavanje podataka stranice i kontrola preko veb stranica. Tokom renderovanja HTML-a stranice, trenutno stanje stranice i vrednosti koje treba sačuvati tokom postback-a se serijalizuju u base64 enkodirane stringove. Ovi stringovi se zatim smeštaju u skrivena polja ViewState-a.
Informacije ViewState-a mogu biti karakterisane sledećim svojstvima ili njihovim kombinacijama:
Base64:
Ovaj format se koristi kada su atributi
EnableViewStateMac
iViewStateEncryptionMode
postavljeni na false.Base64 + MAC (Message Authentication Code) omogućen:
Aktivacija MAC-a se postiže postavljanjem atributa
EnableViewStateMac
na true. Ovo pruža verifikaciju integriteta podataka ViewState-a.Base64 + Enkriptovan:
Enkripcija se primenjuje kada je atribut
ViewStateEncryptionMode
postavljen na true, obezbeđujući poverljivost podataka ViewState-a.
Test slučajevi
Slika je tabela koja detaljno opisuje različite konfiguracije ViewState-a u ASP.NET-u zasnovane na verziji .NET framework-a. Evo sažetka sadržaja:
Za bilo koju verziju .NET-a, kada su i MAC i Enkripcija onemogućeni, MachineKey nije potreban, i stoga ne postoji primenjiva metoda za identifikaciju.
Za verzije ispod 4.5, ako je MAC omogućen ali Enkripcija nije, potreban je MachineKey. Metoda za identifikaciju MachineKey-a se naziva "Blacklist3r."
Za verzije ispod 4.5, bez obzira da li je MAC omogućen ili onemogućen, ako je Enkripcija omogućena, potreban je MachineKey. Identifikacija MachineKey-a je zadatak za "Blacklist3r - Future Development."
Za verzije 4.5 i novije, sve kombinacije MAC-a i Enkripcije (bilo da su oba tačna, ili je jedan tačan a drugi netačan) 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 registarskog ključa AspNetEnforceViewStateMac
na nulu u:
Identifikacija ViewState atributa
Možete pokušati da identifikujete da li je ViewState zaštićen MAC-om snimanjem zahteva koji sadrži ovaj parametar pomoću BurpSuite-a. Ako Mac nije korišćen za zaštitu parametra, možete ga iskoristiti koristeći YSoSerial.Net
Test slučaj 1.5 – Kao Test slučaj 1, ali ViewState kolačić nije poslat od strane servera
Programeri mogu ukloniti ViewState da 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 potencijalnih ranjivosti koje proizilaze iz ViewState deserijalizacije. Međutim, to nije slučaj. Ako dodamo ViewState parametar u telo zahteva i pošaljemo naš serializovani payload kreiran korišćenjem ysoserial, i dalje ćemo moći postići izvršenje koda kao što je prikazano u Slučaju 1.
Test slučaj: 2 – .Net < 4.5 i EnableViewStateMac=true & ViewStateEncryptionMode=false
Da bismo omogućili ViewState MAC za specifičnu stranicu, potrebno je da napravimo sledeće promene na određenoj aspx datoteci:
Možemo to uraditi i za ukupnu aplikaciju postavljanjem u web.config fajlu kako je prikazano ispod:
Kako je parametar ovaj put zaštićen MAC-om, da biste uspešno izvršili napad, prvo nam je potreban korišćeni ključ.
Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da biste pronašli korišćeni ključ.
Badsecrets je još jedan alat koji može identifikovati poznate machineKeys. Napisan je u Python-u, tako da za razliku od Blacklist3r-a, nema zavisnosti od Windows-a. Za .NET viewstate-ove, postoji "python blacklist3r" alat, koji je najbrži način za korišćenje.
Može se ili obezbediti direktno sa viewstate-om i generatorom:
Ili, može se direktno povezati sa ciljnim URL-om i pokušati izdvojiti viewstate iz HTML-a:
Za pretragu ranjivih viewstate-ova u velikom obimu, u kombinaciji sa enumeracijom poddomena, može se koristiti badsecrets
BBOT modul:
Ako imate sreće i ključ je pronađen, možete nastaviti sa napadom koristeći YSoSerial.Net:
U slučajevima kada server ne šalje parametar _VIEWSTATEGENERATOR
, ne morate navesti parametar --generator
, ali ovi:
Test Slučaj: 3 – .Net < 4.5 i EnableViewStateMac=true/false i ViewStateEncryptionMode=true
U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je vrednost verovatno šifrovana i trebaće vam Machine Key da biste šifrovali svoj payload kako biste iskoristili ranjivost.
U ovom slučaju Blacklist3r modul je u fazi razvoja...
Pre .NET 4.5, ASP.NET može prihvatiti nešifrovan ___VIEWSTATE
_ parametar od korisnika čak i ako je ViewStateEncryptionMode
postavljen na Always. ASP.NET samo proverava prisustvo __VIEWSTATEENCRYPTED
parametra u zahtevu. Ako se ovaj parametar ukloni, i pošalje se nešifrovan payload, i dalje će biti obrađen.
Stoga, ako napadači pronađu način da dobiju Machinekey putem druge ranjivosti poput prolaska kroz fajlove, YSoSerial.Net komanda korišćena u Slučaju 2, može se koristiti za izvođenje RCE korišćenjem ranjivosti deserializacije ViewState-a.
Uklonite
__VIEWSTATEENCRYPTED
parametar iz zahteva kako biste iskoristili ranjivost deserializacije ViewState-a, inače će se vratiti greška validacije Viewstate MAC-a i iskorišćavanje će propasti.
Test Slučaj: 4 – .Net >= 4.5 i EnableViewStateMac=true/false i ViewStateEncryptionMode=true/false osim ako su oba atributa postavljena na false
Možemo naterati korišćenje ASP.NET okvira navođenjem sledećeg parametra unutar web.config datoteke kako je prikazano ispod.
Alternativno, ovo se može uraditi navođenjem sledeće opcije unutar parametra machineKey
u web.config fajlu.
Kao i prethodno, vrednost je šifrovana. Zatim, da bi poslao validan payload, napadaču je potreban ključ.
Možete pokušati da koristite Blacklist3r(AspDotNetWrapper.exe) da pronađete korišćeni ključ:
Za detaljniji opis IISDirPath i TargetPagePath pogledajte ovde
Ili, sa Badsecrets (sa vrednošću generatora):
Kada se identifikuje važeći ključ mašine, sledeći korak je generisanje serializovanog payload-a korišćenjem YSoSerial.Net
Ako imate vrednost __VIEWSTATEGENERATOR
, možete koristiti parametar --generator
sa tom vrednošću i izostaviti parametre --path
i --apppath
Uspešno iskorišćavanje ranjivosti deserializacije ViewState-a dovest će do zahteva van opsega ka serveru pod kontrolom napadača, koji uključuje korisničko ime. Ovaj tip eksploatacije je prikazan u dokazu koncepta (PoC) koji se može pronaći kroz resurs pod nazivom "Eksploatisanje ViewState Deserializacije korišćenjem Blacklist3r i YsoSerial.NET". Za dalje detalje o tome kako proces eksploatacije funkcioniše i kako koristiti alate poput Blacklist3r za identifikaciju MachineKey-a, možete pregledati PoC uspešne eksploatacije koji je pružen.
Test Slučaj 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 generisati ViewState payload sa metodama koje su do sada razmatrane, payload neće biti obrađen od strane aplikacije. Potrebno je koristiti još jedan parametar kako biste pravilno kreirali payload:
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 odgovorom "The state information is invalid for this page and might be corrupted" i dobijamo OOB zahtev.
Proverite dalje informacije ovde
Reference
Savet za bug bounty: Prijavite se na Intigriti, premium platformu za bug bounty kreiranu od hakera, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!
Last updated