Unencrypted Web Config File Açıklığı (CWE-312)
Bu makalede Unencrypted Web Config File (CWE-312), yani Şifrelenmemiş Web Config Dosyası açıklığı anlatılacaktır.

Açıklık Önem Derecesi:

Düşük

Açıklığın Etkisi:

Bilgi İfşası

Açıklığın Açıklaması:

ASP.NET web uygulamalarda web.config dosyaları hassas veriler içerebilmektedir. Örneğin servis hesap bilgileri veya bağlantı dizeleri gibi. Bu hassas veriler güvenli bir şekilde depolanmalıdır. Aksi takdirde yerel dosya sistemine sızan bir saldırgan bu bilgileri bulabilir ve saldırı derinliğini genişletebilir. Bu güvensiz yapılandırma dosyasına örnek olarak şu verilebilir:

Güvensiz Web.Config:

<!-- web.config File with Plain-Text Sensitive Content -->

<configuration>
   <connectionStrings>
      <add name="ServiceName" connectionString="[connection strings]" />
   </connectionStrings>
   <system.web>
     <machineKey validationKey="[validation key]" decryptionKey="[decryption key]" />
   </system.web>
</configuration>

Güvenli Web.config:

<!-- web.config File with Encrypted Sensitive Content -->

<configuration>
   <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
      <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
         xmlns="http://www.w3.org/2001/04/xmlenc#">
         <EncryptionMethod Algorithm="[Encryption Algorithm]" />
         <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
               <EncryptionMethod Algorithm="[Encryption Algorithm]" />
               <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                  <KeyName>RSA Key
                  </KeyName>
               </KeyInfo>
               <CipherData>[Cipher Value]</CipherValue>
               </CipherData>
            </EncryptedKey>
         </KeyInfo>
         <CipherData>[Cipher Value]</CipherValue>
         </CipherData>
      </EncryptedData>
   </connectionStrings>
   <system.web>
     <machineKey configProtectionProvider="RsaProtectedConfigurationProvider">
       <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#">
         <EncryptionMethod Algorithm="[Encryption Algorithm]" />
         <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
           <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
             <EncryptionMethod Algorithm="[Encryption Algorithm]" />
             <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
               <KeyName>RSA Key
               </KeyName>
             </KeyInfo>
             <CipherData>
               <CipherValue>[Cipher Value]</CipherValue>
             </CipherData>
           </EncryptedKey>
         </KeyInfo>
         <CipherData>
           <CipherValue>[Cipher Value]</CipherValue>
         </CipherData>
       </EncryptedData>
     </machineKey>
   </system.web>
</configuration>

Güvensiz web.config dosyasında iki hassas veri vardır. Birincisi bağlantı dizesi, ikincisi IIS makina anahtarı (Viewstate’leri şifreler). Bunlar açık metin (plain-text) yerine şifreli bir şekilde web.config dosyasında tutulmalıdır. Dolayısıyla güvenli web.config dosyası örneğinde bu iki hassas yapılandırma bloğunun şifreli hali konulmuştur.

Açıklığın Önlemi:

Bu açıklığı önlemek için web.config dosyalarındaki hassas veriler şifrelenmelidir. Bunun için aspnet_regiis.exe aracı kullanılabilir. Bu işlem uygulamalı olarak gösterilecektir:

A) Web.Config Connection Strings Bloklarını Şifreleme (Encryption) ve Çözme (Decryption)

i) Web.Config Veri Bağlantılarını Şifreleme (Encryption)

Web.Config yapılandırma dosyasındaki blokları (bu senaryo için connection strings bloklarını) şifrelemede asp.net framework'ünün bir aracı olan aspnet_regiis.exe 'den faydalanılabilir. Bu aracı sorunsuz kullanabilmek için CMD penceresinin yönetici olarak çalıştırılması gerekir.

Başlat:

CMD (Sağ Tık -> Yönetici Olarak Çalıştır)

Ardından aspnet_regiis.exe dosyasının yer aldığı dizin bulunur.

CMD (as Administrator):

C:\Windows\system32\> dir /s c:\aspnet_regiis.exe

Sıralanan aspnet_regiis.exe araç dizin yollarından .NET framework versiyonu en yüksek olan dizin yoluna gidilir. Örn;

CMD (as Administrator):

C:\Windows\system32\> cd "C:\Windows\Microsoft.NET\Framework64\4.0.30319"

Ardından aspnet_regiis.exe aracı verilecek -pef parametresi ve arguman değerleriyle çalıştırılır:

CMD (as Administrator):

// Şifreleme (Encryption)
C:\Windows\Microsoft.NET\Framework64\4.0.30319> aspnet_regiis.exe -pef "connectionStrings"  "C:\inetpub\wwwroot"

Çıktı:

Encrypting configuration section...
Succeeded!

Yukarıdaki kodlama ile C:\inetpub\wwwroot dizininde yer alan web.config dosyası içerisindeki <connectionStrings> bloğunun AES algoritması ile şifrelenmesi sağlanır. Örneğin bir web.config dosyasında şifreleme öncesi bağlantı dizesi paylaşılmıştır.

~ Şifreleme Öncesi ~



Yapılandırma Dosyasında Açık Tutulan Bir Bağlantı String Bloğu Gösterimi


Ardından bu bağlantı dizesinin şifrelenmiş hali gösterilmiştir:

~ Şifreleme Sonrası ~



Yapılandırma Dosyasında Şifreli Halde Tutulan Bir Bağlantı String'i Bloğu Gösterimi


Web.Config dosyasına şifrelenmiş connection strings'i c# kodlaması içerisinde kullanabilmek için

C# :

ConnectionStringsSection encyptedConnectionStrings = WebConfigurationManager.OpenWebConfiguration().GetSection("connectionStrings") as ConnectionStringsSection;

ConnectionStringSettings decryptedConnectionStrings = encryptedConnectionStrings.SectionInformation.UnprotectSection() as ConnectionStringSettings;  

SqlConnection con = new SqlConnection(decryptedConnectionStrings);

şeklinde sırasıyla web.config yapılandırma dosyasının açılması, connectionStrings bloğunun cımbızlanması, sonra bu bloğun çözülmesi (decrypt edilmesi) ve son olarak çözülen connection string'in sql bağlantı kurma metoduna koyulması gerekmektedir.

ii) Web.Config Veri Bağlantılarını Çözme (Decryption)

Web.Config yapılandırma dosyasında şifrelenmiş (encrypt edilmiş) connection strings bloklarını düzenlemek / modifiye etmek maksadıyla çözmek için (decypt etmek için) yine aspnet_regiis.exe aracı kullanılabilir:

Not: Şifrelenmiş (encrypt edilmiş) bir web.config dosyası sadece şifrelendiği makinada çözülebilir (decrypt edilebilir).

Başlat:

CMD (Sağ Tık -> Yönetici Olarak Çalıştır)

Ardından aspnet_regiis.exe dosyasının yer aldığı dizin tespit edilir:

CMD (as Administrator):

C:\Windows\system32\> dir /s c:\aspnet_regiis.exe

Sıralanan aspnet_regiis.exe araç dizin yollarından .NET framework versiyonu en yüksek olan dizin yoluna gidilir. Örn;

CMD (as Administrator):

C:\Windows\system32\> cd "C:\Windows\Microsoft.NET\Framework64\4.0.30319"

Ardından aspnet_regiis.exe aracı verilecek -pdf parametresi ve argüman değerleriyle çalıştırılır:

CMD (as Administrator):

C:\Windows\Microsoft.NET\Framework64\4.0.30319> aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot"

Çıktı:

Decrypting configuration section...
Succeeded!

~ Şifrelenmiş Bloğu Çözmeden Önce ~



Yapılandırma Dosyasında Şifreli Halde Tutulan Bağlantı String Bloğu


~ Şifrelenmiş Blok Çözüldüğünde ~



Yapılandırma Dosyasında Şifreli Çözülmüş Bağlantı String Bloğu Gösterimi


B) EK

i) Web.Config İçerisinde Birden Fazla Veri Bağlantı String'i Tanımlama

Web uygulamanız içerisinde birden fazla çeşitte (rolde) veritabanı bağlantısı kuruyor olabilirsiniz. Bu durumda web.config yapılandırma dosyasında her biri için ayrı ayrı connection strings (veri bağlantı string'leri) tanımlaması yapılabilmektedir ve C# ile bu bağlantılar çekilebilmektedir.

Örneğin web.config yapılandırma dosyasına 3 adet veri bağlantısı string tanımlamasının eklendiği örneği aşağıda görmektesiniz.

<configuration>
   <connectionStrings>
      <add name="conn1" 
          providerName="Veri Sağlayıcısı İsmi"
          connectionString= "Geçerli Bir Veri Bağlantısı String'i 1" />
      <add name="conn2" 
          providerName="Veri Sağlayıcısı İsmi" 
          connectionString="Geçerli Bir Veri Bağlantısı String'i 2" />
      <add name="conn3" 
          providerName="Veri Sağlayıcısı İsmi" 
          connectionString="Geçerli Bir Veri Bağlantısı String'i 3" />
   </connectionStrings>
</configuration>

Bu durumda C# kodlamada aşağıdaki gibi bir kullanımda bulunulması gerekir.

var conn1 = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;

var conn2 = ConfigurationManager.ConnectionStrings["conn2"].ConnectionString;

var conn3 = ConfigurationManager.ConnectionStrings["conn3"].ConnectionString;

ii) Harici Yapılandırma Dosyası Kullanma

Web.Config içerisine yerleştirilen bloklar dilenirse harici bir dosyaya konulup web.config içerisinde dahil edilmek suretiyle kullanılabilir. Bunun avantajı deploy edilen web uygulamalarının web.config dosyası içerisinde değişiklik yapılması ihtiyacı duyulduğunda değişikliğin uygulanabilmesi için uygulamanın tekrar deploy edilip sunucuya konulmasını mahal bırakmadan dinamik olarak yapılan her değişikliğin deploy edilmiş web uygulamasında uygulanabilmesini sağlamasıdır. Örneğin veri bağlantı string'leri zaman zaman değiştirilme ihtiyacı duyulan bir yapılandırma ayarıdır. Bu nedenle bu yapılandırma ayarının (<connectionStrings> ... </connectionStrings> bloklarının) harici bir yapılandırma dosyasına taşınıp web.config içerisine dahil edilmek suretiyle kullanımı tercih edilebilmektedir.

Harici yapılandırma dosyasına connection string'lerinizi taşımak ve o şekilde kullanmak isterseniz hazırlayacağınız harici yapılandırma dosyası web.config'deki gibi tanımlamaları içermeden yalnızca dahil edilmek istenen bloğu içerecek şekilde hazırlanmalıdır. Örn;

C:\inetpub\wwwroot\connections.config İçeriği:

<connectionStrings>  
    <add name="Name"   
         providerName="Veri Sağlayıcı İsmi"   
         connectionString="Geçerli Bir Veri Bağlantısı String'i;" />  
</connectionStrings>

Bu harici yapılandırma dosyası web.config ana yapılandırma dosyası içerisine ise şu şekilde dahil edilmelidir:

C:\inetpub\wwwroot\web.config İçeriği:

<?xml version='1.0' encoding='utf-8'?>  
<configuration>  
      ...  <!--size ait var olan kodlar -->     
     <connectionStrings configSource="connections.config"/>  
     ...  <!--size ait var olan kodlar -->
</configuration>

Yararlanılan Kaynaklar

  • https://cwe.mitre.org/data/definitions/312.html
  • https://gist.github.com/marcbarry/47644b4a43fbfb63ef54
  • https://stackoverflow.com/questions/550210/uses-for-machinekey-in-asp-net
Bu yazı 27.10.2025 tarihinde, saat 00:28:08'de yazılmıştır.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 6
Yorumlar
Henüz yorum girilmemiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :