Exploiting __VIEWSTATE without knowing the secrets
Last updated
Last updated
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)
Savjet za bug bounty: prijavite se za Intigriti, premium bug bounty platformu koju su kreirali hakeri, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!
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ćeno:
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.
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:
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.
Za verzije ispod 4.5, ako je MAC omogućen, ali enkripcija nije, MachineKey je potreban. Metoda za identifikaciju MachineKey-a se naziva "Blacklist3r."
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. Identifikacija MachineKey-a je zadatak za "Blacklist3r - Budući razvoj."
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."
Takođe je moguće potpuno onemogućiti ViewStateMAC postavljanjem registry ključa AspNetEnforceViewStateMac
na nulu u:
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
Developers can remove ViewState from becoming part of an HTTP Request (korisnik neće primiti ovaj kolačić). One may assume that if ViewState is not present, their implementation is secure from any potential vulnerabilities arising with ViewState deserialization. However, that is not the case. If we add ViewState parameter to the request body and send our serialized payload created using ysoserial, we will still be able to achieve code execution as shown in Case 1.
In order to enable ViewState MAC for a specific page we need to make following changes on a specific aspx file:
Možemo to uraditi i za celu aplikaciju postavljanjem u web.config datoteku kao što je prikazano u nastavku:
Kao što je parametar zaštićen MAC-om, ovoga puta 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č.
Badsecrets je još jedan alat koji može identifikovati poznate machineKeys. Napisan je u Python-u, 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:
Ili, može se direktno povezati na ciljani URL i pokušati da izvuče viewstate iz HTML-a:
Da biste pretraživali ranjive viewstate-ove na velikoj skali, 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 _VIEWSTATEGENERATOR
parametar ne morate da obezbedite --generator
parametar već ove:
U ovom slučaju nije poznato da li je parametar zaštićen MAC-om. Tada je vrednost verovatno 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 ovaj parametar ukloni 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 fajlova, 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.
Možemo naterati korišćenje ASP.NET okvira tako što ćemo specificirati dole navedeni parametar unutar web.config fajla kao što je prikazano ispod.
Alternativno, ovo se može uraditi tako što se navede sledeća opcija unutar machineKey
parametra u web.config datoteci.
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:
Za detaljniji opis za IISDirPath i TargetPagePath pogledajte ovde
Ili, sa Badsecrets (sa vrednošću generatora):
Kada se identifikuje važeći Machine key, sledeći korak je generisanje serijalizovanog payload-a koristeći YSoSerial.Net
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 funkcioniše proces eksploatacije i kako koristiti alate poput Blacklist3r za identifikaciju MachineKey-a, možete pregledati pruženi PoC of Successful Exploitation.
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:
Za sve test slučajeve, ako ViewState YSoSerial.Net payload funkcioniše 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
Bug bounty saveta: prijavite se za Intigriti, premium bug bounty platformu koju su kreirali hakeri, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!
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)