Exploiting __VIEWSTATE without knowing the secrets
Bug bounty wenk: teken aan vir Intigriti, 'n premium bug bounty platform geskep deur hackers, vir hackers! Sluit by ons aan by https://go.intigriti.com/hacktricks vandag, en begin om belonings tot $100,000 te verdien!
Wat is ViewState
ViewState dien as die verstek meganisme in ASP.NET om bladsy- en beheerdata oor webbladsye te handhaaf. Tydens die weergawe van 'n bladsy se HTML word die huidige toestand van die bladsy en waardes wat tydens 'n terugroep bewaar moet word, geserializeer na base64-geënkripteerde strings. Hierdie strings word dan in verborge ViewState-velde geplaas.
ViewState-inligting kan gekenmerk word deur die volgende eienskappe of hul kombinasies:
Base64:
Hierdie formaat word gebruik wanneer beide
EnableViewStateMac
enViewStateEncryptionMode
eienskappe op vals gestel is.Base64 + MAC (Boodskap-verifikasiekode) Geaktiveer:
Aktivering van MAC word bereik deur die
EnableViewStateMac
eienskap na waar te stel. Dit bied integriteitsverifikasie vir ViewState-data.Base64 + Geënkripteer:
Versleuteling word toegepas wanneer die
ViewStateEncryptionMode
eienskap na waar gestel is, wat die vertroulikheid van ViewState-data verseker.
Toetsgevalle
Die beeld is 'n tabel wat verskillende konfigurasies vir ViewState in ASP.NET beskryf gebaseer op die .NET-raamwerkweergawe. Hier is 'n opsomming van die inhoud:
Vir enige weergawe van .NET, wanneer beide MAC en Versleuteling gedeaktiveer is, is 'n MachineKey nie nodig nie, en daar is dus geen toepaslike metode om dit te identifiseer nie.
Vir weergawes onder 4.5, as MAC geaktiveer is maar Versleuteling nie, is 'n MachineKey nodig. Die metode om die MachineKey te identifiseer word verwys na as "Blacklist3r."
Vir weergawes onder 4.5, ongeag of MAC geaktiveer of gedeaktiveer is, as Versleuteling geaktiveer is, is 'n MachineKey nodig. Die identifisering van die MachineKey is 'n taak vir "Blacklist3r - Toekomstige Ontwikkeling."
Vir weergawes 4.5 en hoër, vereis alle kombinasies van MAC en Versleuteling (of beide is waar, of een is waar en die ander vals) 'n MachineKey. Die MachineKey kan geïdentifiseer word deur "Blacklist3r."
Toetsgeval: 1 – EnableViewStateMac=false en viewStateEncryptionMode=false
Dit is ook moontlik om die ViewStateMAC heeltemal te deaktiveer deur die AspNetEnforceViewStateMac
register sleutel na nul in te stel:
Identifiseer ViewState Eienskappe
Jy kan probeer om te identifiseer of ViewState deur MAC beskerm word deur 'n versoek wat hierdie parameter bevat vas te vang met BurpSuite. As Mac nie gebruik word om die parameter te beskerm nie, kan jy dit uitbuit deur YSoSerial.Net te gebruik.
Toetsgeval 1.5 - Soos Toetsgeval 1 maar die ViewState-koekie word nie deur die bediener gestuur nie
Ontwikkelaars kan ViewState verwyder sodat dit nie deel word van 'n HTTP-versoek nie (die gebruiker sal hierdie koekie nie ontvang nie). 'n Persoon mag aanneem dat as ViewState nie teenwoordig is nie, hul implementering veilig is teen enige potensiële kwesbaarhede wat mag voortspruit uit ViewState-deserialisering. Dit is egter nie die geval nie. As ons die ViewState-parameter by die versoekliggaam voeg en ons geserialiseerde lading wat met ysoserial geskep is, stuur, sal ons steeds kodes uitvoer kan bereik soos in Geval 1 getoon.
Toetsgeval: 2 - .Net < 4.5 en EnableViewStateMac=true & ViewStateEncryptionMode=false
Om ViewState MAC te aktiveer vir 'n spesifieke bladsy moet ons die volgende veranderinge maak aan 'n spesifieke aspx-lêer:
Ons kan dit ook vir die algehele aansoek doen deur dit in die web.config lêer in te stel soos hieronder getoon:
As die parameter hierdie keer MAC beskerm word, moet ons eers die sleutel wat gebruik word, vind om die aanval suksesvol uit te voer.
Jy kan probeer om Blacklist3r(AspDotNetWrapper.exe) te gebruik om die gebruikte sleutel te vind.
Badsecrets is nog 'n instrument wat bekende machineKeys kan identifiseer. Dit is geskryf in Python, soos Blacklist3r, is daar geen Windows-afhanklikheid nie. Vir .NET viewstates is daar 'n "python blacklist3r" nut, wat die vinnigste manier is om dit te gebruik.
Dit kan of met die viewstate en generator direk voorsien word:
Of dit kan direk na die teiken-URL verbind en probeer om die viewstate uit die HTML te sny:
Om te soek na kwesbare viewstates op skaal, in samehang met subdomeinversameling, kan die badsecrets
BBOT module gebruik word:
Indien jy gelukkig is en die sleutel gevind word, kan jy voortgaan met die aanval deur YSoSerial.Net:
In gevalle waar die _VIEWSTATEGENERATOR
-parameter nie deur die bediener gestuur word nie, hoef jy nie die --generator
-parameter te voorsien nie, maar hierdie:
Toetsgeval: 3 - .Net < 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true
In hierdie geval is dit nie bekend of die parameter beskerm word met MAC nie. Dan is die waarde waarskynlik versleutel en jy sal die Machine Key nodig hê om jou lading te versleutel om die kwesbaarheid te benut.
In hierdie geval is die Blacklist3r module in ontwikkeling...
Voor .NET 4.5, kan ASP.NET 'n ongeslote ___VIEWSTATE
_parameter van die gebruikers aanvaar, selfs as ViewStateEncryptionMode
op Always ingestel is. ASP.NET kontroleer slegs die teenwoordigheid van die __VIEWSTATEENCRYPTED
parameter in die versoek. As hierdie parameter verwyder word, en die onversleutelde lading gestuur word, sal dit steeds verwerk word.
Daarom, as aanvallers 'n manier vind om die Machinekey te kry via 'n ander kwesbaarheid soos lêertraversal, kan YSoSerial.Net bevel wat in Geval 2 gebruik is, gebruik word om RCE uit te voer deur gebruik te maak van ViewState deserialisasie kwesbaarheid.
Verwyder die
__VIEWSTATEENCRYPTED
parameter uit die versoek om die ViewState deserialisasie kwesbaarheid te benut, anders sal dit 'n Viewstate MAC-valideringsfout teruggee en sal die benutting misluk.
Toetsgeval: 4 - .Net >= 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true/false behalwe beide eienskappe op false
Ons kan die gebruik van die ASP.NET-raamwerk afdwing deur die onderstaande parameter binne die web.config-lêer te spesifiseer soos hieronder aangedui.
Alternatiewelik kan dit gedoen word deur die onderstaande opsie te spesifiseer binne die machineKey
parameter van die web.config lêer.
Soos in die vorige voorbeeld is die waarde versleutel. Dan, om 'n geldige lading te stuur, het die aanvaller die sleutel nodig.
Jy kan probeer om Blacklist3r(AspDotNetWrapper.exe) te gebruik om die gebruikte sleutel te vind:
Vir 'n meer gedetailleerde beskrywing van IISDirPath en TargetPagePath verwys hierheen
Of, met Badsecrets (met 'n generatorwaarde):
Sodra 'n geldige Masjien sleutel geïdentifiseer is, is die volgende stap om 'n geserializeerde lading te genereer met behulp van YSoSerial.Net
Indien jy die waarde van __VIEWSTATEGENERATOR
het, kan jy probeer om die --generator
parameter te gebruik met daardie waarde en die parameters --path
en --apppath
weg te laat.
'n Suksesvolle uitbuiting van die ViewState deserialisasie kwesbaarheid sal lei tot 'n out-of-band versoek na 'n aanvaller-beheerde bediener, wat die gebruikersnaam insluit. Hierdie soort uitbuiting word gedemonstreer in 'n bewys van konsep (PoC) wat gevind kan word deur 'n hulpbron getiteld "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Vir verdere besonderhede oor hoe die uitbuitingsproses werk en hoe om gereedskap soos Blacklist3r te gebruik om die MachineKey te identifiseer, kan jy die verskafte PoC van Suksesvolle Uitbuiting nagaan.
Toetsgeval 6 – ViewStateUserKeys word gebruik
Die ViewStateUserKey eienskap kan gebruik word om teen 'n CSRF-aanval te verdedig. As so 'n sleutel in die aansoek gedefinieer is en ons probeer om die ViewState lading te genereer met die besproke metodes tot dusver, sal die lading nie deur die aansoek verwerk word nie. Jy moet nog 'n parameter gebruik om die lading korrek te skep:
Resultaat van 'n Suksesvolle Uitbuiting
Vir al die toetsgevalle, as die ViewState YSoSerial.Net lading suksesvol werk, reageer die bediener met " 500 Interne bedienerfout" met 'n responsinhoud van " Die staat inligting is ongeldig vir hierdie bladsy en kan beskadig wees" en ons kry die OOB versoek.
Kyk vir verdere inligting hier
Verwysings
Bug bounty wenk: teken aan vir Intigriti, 'n premium bug bounty platform geskep deur hackers, vir hackers! Sluit by ons aan by https://go.intigriti.com/hacktricks vandag, en begin om belonings te verdien tot $100,000!
Last updated