Bu makale son zamanlarda onların değer biçilmiş uygulamalarının rotası kabul edilmiş bir saldırı tekniği olan Sec-1 için tasarlanmıştır. Bu tekniğin ana prensibi bazı zamanlar için vardır. Fakat umuyoruz ki bu makale web uygulamalarında yaygın bir saldırı olarak kabul edilen “şifremi unuttum” saldırısına karşı size bir bakış açısı sağlayacaktır. Bu doküman iki bölüme ayrılmıştır. Birinci bölüm tekniğin temel esaslarından bahsetmektedir, ikinci bölüm ise ticari uygulamalarına karşı olan atakları içermektedir.
“ŞİFREMİ UNUTTUM ” ATAĞI
Web uygulamalarında çoğunlukla kullanıcının hesabının doğrulanması gerekmektedir. Ayrıca kullanıcının şifresini yenilenmesi ya da yeniden verilmesini sağlayan yöntemlerde bulunmaktadır. Bu parçalar farklı genişlikte çalışmaktadırlar. Bunun bir kaç nedeni bulunmaktadır. Örneğin: stil, dil, mantık ya da işletilen sistem. Bu atağı bir ortam yâda geliştirme stili ile sınırlandırmamak gerekir. Bu dokuman ile aşağıdaki bilinen parçalara adapte olunmuştur.
NOT: Bu örnek Sec-1 ASNA takımı ile gerçek bir web uygulamasına dayanmaktadır.
Şifre Hatırlatma İşlemi
1- Kullanıcı e-mail adresini girer.
2- E-mail adresi SQL değişkenine yüklenir. Daha sonra değişken bir SQL veritabanında kullanıcının hesabını bulmak için arama işleminde kullanılır. Kullanıcı adı (e-mail) adresi ve şifre elde edilir.
3- Uygulamanın e-maili (yani web sayfası) kullanıcıya hesap bilgilerini gönderir.
SALDIRI ÖNSÖZÜ
Önce saldırı işlemini ayırıyoruz. Çünkü bu anahtar öğenin üzerini örtmek için önemlidir. Anahtar öğe bu atağın gerçekleşmesini olanaklı hale getirir. Şayet VB.Net ve Microsoft SQL değikenlerini biliyorsanız bu kısmı geçebilirsiniz.
Server Değişkenleri
Değişkenlerin boyutu ve tipi saldırılar ve kusurlar için vurgulanacak bir anahtardır.Bu örnekte VB ( ASP .NET) ve Microsoft SQL server kullanılmıştır. Bunların her birinde değişken tanımı birazcıkta olsa farklıdır. Aşağıdaki örnekleri inceleyin:
ASP .NET (VB) De Değişken Tanımı
Dim UserNameAsEmail AS String
Yukarıdaki değişken programcı tarafından oluşturulur. Değişkenin adı UserNameAsEmail dir ve kullanıcının email adresini tutar. (bu durumda email adresi ve kullanıcı adı bir tane ve aynıdır)
IMadem ki bu bir Visual Basic uygulaması programcının maksimim boyutu belirtmesi gerekmemektedir.(default değeri 64KB tır.)Fakat bu önerilir.
Microsoft SQL De Değişken Tanımı
Declare @UserNameAsEmail varchar(320)
Yukarıdaki SQL ifadesi en fazla 320 karakter tutacak şekilde bir değişken oluşturur RFC 2821 ye gore geçerli bir e-mail adresinin uzunluğu en fazla 320 karakterdir. Varchar tipinin maksimum alabileceği uzunluk 8000 bytes dır.
Beyaz Boşluk
Microsoft SQL server string değerlerindeki beyaz boşluk izlerini önem vermez.. Aşağıdaki SQL ifadesinde bu gösterilmiştir.
1> declare @UserNameAsEmail varchar(320)
2> set @UserNameAsEmail = ’[email protected]’
3> select username,password FROM UserEmail where username=@UserNameAsEmail
4> go
username password
------------------- -------------
[email protected] d32ed£%dZZA
Beyaz boşluk izleri yaparakta yanı sonuc elde ederiz.
1> declare @UserNameAsEmail varchar(320)
2> set @UserNameAsEmail = ’[email protected] ’
3> select username,password FROM UserEmail where username=@UserNameAsEmail
4> go
username password
------------------- --
Savunmasızlık (The Vulnerability)
vulnerability ASP.NET değişkenleri ve Microsoft SQL değişkenleri birbiri ile örtüşmediği zaman oluşur. Eğer ASP.NET değişkeninin uzunluğu SQL server ın maksimum uzunluğundn büyük olursa , bizim göndereceğimiz değeri “şifremi unuttum” işlevininde etki etmek için kullanılabilecektir.Bizim amacımız, SQL Servara email adresini geçerli olarak yorumlatmak ve herhangi bir email adresi aracılığı ile saldırgana bir kullanıcı hesabı göndermektir.
Aşağıdaki öreği inceleyelim
(Not değişken uzunlukları bu döküman için orantılı bir şekilde belirlenmiştir.)
ADIM 1:
Saldırgan email adreslerini girer. [email protected] kurbanın mail adresi , [email protected] ise saldırganın mail adresi
[email protected] [308 Spaces]; [email protected]
Bu .Net değişkeni olan UserNameAsEmail e yüklenecektir.
ADIM 2:
Kullanıcın email adresi SQL server değişkenine kopyalanacaktır. SQL server değişkeni en fazla verinin 320 byte olan kısmını tutacaktır. Bu nedenle beyaz boşluklar bitten yere kadar olan yeri kopyalayacaktır.
Misrosoft SQL Server Değişkeni:
Yukarıda gösterildiği şeklide Microsoft SQL değişkeni tutacaktır ve daha sonra kullanıcının şifresinin detaylarını getirecektir.
ADIM 3:
Kurban kullanıcı için geçerli bir email adresi girdiğimiz varsayalım. SQL server kullanıcının hesabını güvenli bir şekilde .NET uygulamasına getirecektir. Kullanıcının “şifremi unuttum” için bir bölüm dizayn edilecektir.Beyaz boşluk ASP.NET email fonksiyonu tarafından istenilen mail adresini yapmak için görmezlikten gelinecektir:
[email protected]; [email protected]
Bir email kullanıcı hesabının detaylarını içerebilir ve hem kullanıcıya hemde saldırgana mail gider.
SAVUNMASIZLIĞI AZALTMAK
Bu makalede tanımlanan problem güvenli uygulamalr geliştirmek için kolay bir yöntemdir. Örneğin bu makaledeki ufak bir kod değişiklik ile savunmasızlığın ortadan kaldırıyoruz.
Input (Girdi ) Doğruluğu
İlk adım olarak sadece iyi karakterlere izin verilip geçerli bir mail adresi girilmeli .Herhangi bir ihlalin filitrelenmesi diğer analiz için kilitlenmeli. Bir emailde iyi karakterler için RFC28223 ve Wikipedia . makalelerine bakılabilir.
Güvenli Değişken Oluşturmak
.NET ve Microsoft SQL server değişkenlerinin maksimum uzunluğunun aynı olduğundan emin olun. Yukarıdaki örnekte aşağıdaki gibi tanımlanması gerekmektedir:
Dim UserNameAsEmail AS String * 320
Declare @UserNameAsEmail varchar(320)
“ŞİFREMİ UNUTTUM ” ATAĞI
Web uygulamalarında çoğunlukla kullanıcının hesabının doğrulanması gerekmektedir. Ayrıca kullanıcının şifresini yenilenmesi ya da yeniden verilmesini sağlayan yöntemlerde bulunmaktadır. Bu parçalar farklı genişlikte çalışmaktadırlar. Bunun bir kaç nedeni bulunmaktadır. Örneğin: stil, dil, mantık ya da işletilen sistem. Bu atağı bir ortam yâda geliştirme stili ile sınırlandırmamak gerekir. Bu dokuman ile aşağıdaki bilinen parçalara adapte olunmuştur.
NOT: Bu örnek Sec-1 ASNA takımı ile gerçek bir web uygulamasına dayanmaktadır.
Şifre Hatırlatma İşlemi
1- Kullanıcı e-mail adresini girer.
2- E-mail adresi SQL değişkenine yüklenir. Daha sonra değişken bir SQL veritabanında kullanıcının hesabını bulmak için arama işleminde kullanılır. Kullanıcı adı (e-mail) adresi ve şifre elde edilir.
3- Uygulamanın e-maili (yani web sayfası) kullanıcıya hesap bilgilerini gönderir.
SALDIRI ÖNSÖZÜ
Önce saldırı işlemini ayırıyoruz. Çünkü bu anahtar öğenin üzerini örtmek için önemlidir. Anahtar öğe bu atağın gerçekleşmesini olanaklı hale getirir. Şayet VB.Net ve Microsoft SQL değikenlerini biliyorsanız bu kısmı geçebilirsiniz.
Server Değişkenleri
Değişkenlerin boyutu ve tipi saldırılar ve kusurlar için vurgulanacak bir anahtardır.Bu örnekte VB ( ASP .NET) ve Microsoft SQL server kullanılmıştır. Bunların her birinde değişken tanımı birazcıkta olsa farklıdır. Aşağıdaki örnekleri inceleyin:
ASP .NET (VB) De Değişken Tanımı
Dim UserNameAsEmail AS String
Yukarıdaki değişken programcı tarafından oluşturulur. Değişkenin adı UserNameAsEmail dir ve kullanıcının email adresini tutar. (bu durumda email adresi ve kullanıcı adı bir tane ve aynıdır)
IMadem ki bu bir Visual Basic uygulaması programcının maksimim boyutu belirtmesi gerekmemektedir.(default değeri 64KB tır.)Fakat bu önerilir.
Microsoft SQL De Değişken Tanımı
Declare @UserNameAsEmail varchar(320)
Yukarıdaki SQL ifadesi en fazla 320 karakter tutacak şekilde bir değişken oluşturur RFC 2821 ye gore geçerli bir e-mail adresinin uzunluğu en fazla 320 karakterdir. Varchar tipinin maksimum alabileceği uzunluk 8000 bytes dır.
Beyaz Boşluk
Microsoft SQL server string değerlerindeki beyaz boşluk izlerini önem vermez.. Aşağıdaki SQL ifadesinde bu gösterilmiştir.
1> declare @UserNameAsEmail varchar(320)
2> set @UserNameAsEmail = ’[email protected]’
3> select username,password FROM UserEmail where username=@UserNameAsEmail
4> go
username password
------------------- -------------
[email protected] d32ed£%dZZA
Beyaz boşluk izleri yaparakta yanı sonuc elde ederiz.
1> declare @UserNameAsEmail varchar(320)
2> set @UserNameAsEmail = ’[email protected] ’
3> select username,password FROM UserEmail where username=@UserNameAsEmail
4> go
username password
------------------- --
Savunmasızlık (The Vulnerability)
vulnerability ASP.NET değişkenleri ve Microsoft SQL değişkenleri birbiri ile örtüşmediği zaman oluşur. Eğer ASP.NET değişkeninin uzunluğu SQL server ın maksimum uzunluğundn büyük olursa , bizim göndereceğimiz değeri “şifremi unuttum” işlevininde etki etmek için kullanılabilecektir.Bizim amacımız, SQL Servara email adresini geçerli olarak yorumlatmak ve herhangi bir email adresi aracılığı ile saldırgana bir kullanıcı hesabı göndermektir.
Aşağıdaki öreği inceleyelim
(Not değişken uzunlukları bu döküman için orantılı bir şekilde belirlenmiştir.)
ADIM 1:
Saldırgan email adreslerini girer. [email protected] kurbanın mail adresi , [email protected] ise saldırganın mail adresi
[email protected] [308 Spaces]; [email protected]
Bu .Net değişkeni olan UserNameAsEmail e yüklenecektir.
ADIM 2:
Kullanıcın email adresi SQL server değişkenine kopyalanacaktır. SQL server değişkeni en fazla verinin 320 byte olan kısmını tutacaktır. Bu nedenle beyaz boşluklar bitten yere kadar olan yeri kopyalayacaktır.
Misrosoft SQL Server Değişkeni:
Yukarıda gösterildiği şeklide Microsoft SQL değişkeni tutacaktır ve daha sonra kullanıcının şifresinin detaylarını getirecektir.
ADIM 3:
Kurban kullanıcı için geçerli bir email adresi girdiğimiz varsayalım. SQL server kullanıcının hesabını güvenli bir şekilde .NET uygulamasına getirecektir. Kullanıcının “şifremi unuttum” için bir bölüm dizayn edilecektir.Beyaz boşluk ASP.NET email fonksiyonu tarafından istenilen mail adresini yapmak için görmezlikten gelinecektir:
[email protected]; [email protected]
Bir email kullanıcı hesabının detaylarını içerebilir ve hem kullanıcıya hemde saldırgana mail gider.
SAVUNMASIZLIĞI AZALTMAK
Bu makalede tanımlanan problem güvenli uygulamalr geliştirmek için kolay bir yöntemdir. Örneğin bu makaledeki ufak bir kod değişiklik ile savunmasızlığın ortadan kaldırıyoruz.
Input (Girdi ) Doğruluğu
İlk adım olarak sadece iyi karakterlere izin verilip geçerli bir mail adresi girilmeli .Herhangi bir ihlalin filitrelenmesi diğer analiz için kilitlenmeli. Bir emailde iyi karakterler için RFC28223 ve Wikipedia . makalelerine bakılabilir.
Güvenli Değişken Oluşturmak
.NET ve Microsoft SQL server değişkenlerinin maksimum uzunluğunun aynı olduğundan emin olun. Yukarıdaki örnekte aşağıdaki gibi tanımlanması gerekmektedir:
Dim UserNameAsEmail AS String * 320
Declare @UserNameAsEmail varchar(320)