Asp.NET MVC’de CSRF/XSRF(Cross-Site Request Forgery) Saldırı Güvenliği

Bu yazımda sizlere basit ama etkili bir teknik olan CSRF/XSRF(Cross-Site Request Forgery) saldırısından bahsedeceğim.Bu saldırıyı gerçekleştirebilmek için teknik bilgi ihtiyacından ziyade, mantıki bir hamle kabiliyetine hakim olmak yeterlidir.

Anlayacağınız dışarıdan hiçbir teknik bilgi ve birikim gerekmeksizin yapılan entrikalarla oturum sahiplerine belli başlı çakallıkları yaptırabilen bir saldırı mekanizmasıdır diyebiliriz.

Örnek olarak bir yönteme değinirsek eğer,
Herhangi bir sitenizde bulunan yazıları http://www.****.com/Yazilar/Sil/173 buna benzer bir link ile silebildiğinizi düşünün.(Bu linkteki 173 bir ID değerini temsil etmektedir.)Tabi oturum açılmadığı sürece bu link tetiklenmeyecek ve ilgili kullanıcıdan oturum yetkisi istenecektir.Buraya kadar bir sıkıntı yok.O halde bu saldırı nasıl düzenlenip, bu link tetiklenebilir.Yanı kötü amaçlı kişi, bu linki bir şekilde tetikletip hedefine nasıl ulaşabilecektir? Soru bu!

Burada kötü amaçlı kişinin yapması gereken çok basittir.İlgili linki size bir şekilde ulaştırması yeterli olacaktır.(Tabi ki de o sitede sizin bir yetkili olduğunuzu varsayıyoruz)Topu size attıktan sonra, kah yanlışlıkla kah belkide hiç farkında olmadan bu saldırıya kapıları kendi ellerinizle açmış olacaksınız.

Varsayalım, kötü amaçlı şahıs bu linki size(site yöneticisi, moderatör vs.) mail aracılığıyla yolladı.Sizde “neymiş la dur bi bakayım” diyerek linke tıkladığınız an %50 şansla saldırı başarıya ulaşabilmektedir.Saldırı başarısına %50 pay biçmemin sebebi sizin ilgili sitedeki oturumunuzun açık olup, olmamasından kaynaklanmaktadır.Eğer sitenizde oturum sürekli açıksa ya da 10 – 15 dk önce girip oturumu kapatmadan çıktıysanız veyahut o an aktifseniz eğer bu mail aracılığıyla gelen ve sizin tetiklediğiniz link oturumunuz huzurunda gerekli Action yapıları tetikleyecek ve o ID değerine sahip yazı silinecektir.

Hadi diyelim saldırı bu şekilde link üzerinden gelirse yaptığınız hatanın farkına varabilir ve bir şekilde zararı telafi edebilirsiniz.Lakin ikinci yöntem olarak birazdan bahsedeceğim gizli link vakası sizin ne olup bittiğinden hiç haberdar olmayacağınız bir durumda gerçekleşecektir.

O ikinci yönteme geleceğim.Tamam.Ama şuanda buraya kadar bu saldırının ne tür bir tarzda olduğunu, ne kadar basit ama etkili olduğunu kavramanızı istiyorum.

Kısaca özetlersek, saldıranın amacı, sitede tetikleyici linkleri oturum sahiplerine açık ya da gizli bir şekilde ulaştırmak ve linkleri tetikletmektir.

Şimdi bu saldırıya nasıl karşı gelebileceğimizi, hangi felsefeyle hareket edeceğimizi ve teknik olarak ne yapmamız gerektiğini konuşalım, ardından ikinci yöntem olarak gizli link vakası dediğim yönteme değinip yazımızı noktalayalım.

Öncelikle şunu biliyoruz ki, bu saldırı dışarıdan gönderilen bir link sonucu doğmaktadır.O halde şöyle düşünelim?Benim sitemde bulunan tetikleyici link ile dışarıdan gelecek olan link evet aynı yapıda ve adreste olabilir ama ikisi arasında bir fark yaratabilmeliyiz.Bu farkı yaratabilirsek eğer tetiklenmenin site üzerinden mi? yoksa dışarıdan ya da başka bir kaynaktan mı yapıldığını ayırt edebiliriz.

Aradaki farka gelirsek eğer, sitemdeki link sitemde, dışarıdan gönderilen saldırı amaçlı linkte dışarıdadır.”Hoca dalgamı geçiyon?” diye soranlarınız olabilir.Tabi ki de hayır.Burada size anlamsız gelen bu fark durumuyla bir nokta yakalayarak ona göre güvenlik oluşturacağız.

Şimdi, “sitemde olan bir linkin aynısının dışarıda olması arasında ne fark olabilir?” diye sorabilirsiniz.Hayır!Fark bu ikisinde değil.Linklerin bulunduğu ortamlardadır.Yani sitemin yönetim panelinin örn. “Yazı Listesi” sekmesinde bulunan bu link ile örn. mail aracılığıyla bize ulaştırılan bu link arasında fark sıfırdır ama ortam farkı vardır.

İşte bu ortam ile link arasında bir bağ kurarak sitemizden mi? yoksa dışarıdan mı? tetiklenme yapılmış ayırt edebileceğiz.

Örnek olarak “Yazı Listesi” sekmesinde bulunan bu linki birdaha ele alalım.
http://www.****.com/Yazilar/Sil/173
Bu link bizim sitemizin “Yazı Listesi” sayfasında olduğu için, o sayfaya özel bir token oluşturursak ve ilgili Action tetiklendiği vakit o tokenı doğrulatırsak eğer anlarız ki bu tetikleme site üzerinden kasıtlı bir biçimde yapılmıştır.Yok eğer token doğrulanmıyorsa, demek ki bu link dışarıdan ya da başka bir kaynaktan gelmiştir.

Bu mantığa göre bu linkin doğru çalışması için site üzerinde tokenın oluşturulduğu sayfa üzerinden tetiklenmek şart koşulmaktadır ve aksi taktirde token doğrulanamayacağı için bu saldırı yapılsa ve biz tuzağa düşsek bile kötü kişi muradına eremeyecektir.

Bu arada Token; belirti, nişan, işaret ve jeton anlamında kullanılan bir kelimedir.

Şimdi gelelim teknik olarak bu işi nasıl halledeceğimize.Öncelikle tokendan kastımız yukarıda belirttiğim gibi bir işaret amaçlı değer üretilip bunu serverda doğrulatmaktır.Bunu siz istediğiniz algoritma ve teknikle gerçekleştirebilirsiniz.

Şimdi buna bir örnek olarak Index.cshtml sayfasında manuel bir token oluşturuyorum.

@{
    Session.Add("Token", "IndexSayfasi");
}

<a href="@Url.Action("OrnekAction","Home")">Tıkla</a>

Gördüğünüz gibi “IndexSayfasi” değerine sahip tokenı bir Session değişkene atıyorum.

        public ActionResult OrnekAction()
        {
            if (Session["Token"] != null)
            {
                if (Session["Token"] == "IndexSayfasi")
                {
                    //İşlemleri gerçekleştir....
                }
            }

            Session.Remove("Token");
            return View();
        }

Ve burada da gördüğünüz gibi Index.cshtml sayfasında oluşturulan tokenı burada doğrulattırıyorum.Buradaki algoritmaya göre her Action tetiklenme neticesinde ilgili Session değişkenimizi siliyorum ki hafızada Session tutulmasın.

Evet, artık Asp.NET MVC mimarisinde normal linkler için CSRF/XSRF(Cross-Site Request Forgery) saldırı güvenliğini gerçekleştirmiş olduk.

Bunların yanında formlarında CSRF/XSRF(Cross-Site Request Forgery) saldırısına karşı güvenliği alınabilmektedir.Bunun için yapmamız gerekense form içerisinde token üretmektir.Ama bu işlem için Asp.NET MVC Framework geliştiricileri biz .NET kullanıcıları için bu mantıkta bir yapı geliştirmişlerdir ve tek satırda bu işi halledebilmekteyiz.

Şimdi örnek olarak gene Index.cshtml sayfasında tokenımızı oluşturalım.

@using (Html.BeginForm("OrnekAction", "Home"))
{
    @Html.AntiForgeryToken()

    <input type="button" value="Post Et" />
}

Gördüğünüz gibi “AntiForgeryToken” komutu ile Index.cshtml sayfasına özel form için tokenımızı oluşturduk.Sayfamızın kaynak koduna bakarsak eğer “AntiForgeryToken” komutu sayesinde bir input oluşturduğunu rahatlıkla görebiliriz.
Asp.NET MVC'de CSRF-XSRF(Cross-Site Request Forgery) Saldırı Güvenliği

İşte burada oluşturduğu input değerini post ederek servera gönderecek ve doğrulatacağız.

Şimdi ise Serverda bu tokenı kontrol ederek oluşturulduğunu doğrulattırıp metodumuzu tetiklettirelim.

        [ValidateAntiForgeryToken()]
        [HttpPost()]
        public ActionResult OrnekAction()
        {
            return View();
        }

Burada da gördüğünüz gibi “ValidateAntiForgeryToken” Attribute’u ile View katmanında oluşturulan tokenı doğrulatmış oluyoruz.

İşlemimiz bu kadar.

Şuana kadar CSRF/XSRF(Cross-Site Request Forgery) saldırısının ne olduğundan, teorik ve teknik güvenliğin nasıl alınacağından bahsettik ve pratikte hem manuel hemde Framework’te sırf bu işlem için tasarlanmış yapıyla örneklerimizi neticelendirdik.

Aslında yazımız içerik olarak burada bitmiş bulunmaktadır, lakin söz verdiğimiz gizli link saldırısından da bahsetmemiz gerekmektedir.

CSRF/XSRF(Cross-Site Request Forgery) saldırısı dışarıdan olan bir hamle sonucu olduğunu biliyoruz.Yazımızın başında bu hamlenin direkt olarak ilgili linkin gönderilmesiyle ilgili bir senaryo üzerinde tartıştık.Cross-Site Request Forgery saldırısı sadece ilgili linki göndermekle sınırlandırılmamakta, başka linkler üzerinden de hedef(kurban) link üzerinde tetikleme işlemi yapılabilmektedir.

Örnek olarak size mailden http://www.gencayyildiz.com adresini gönderdim.Sizde tıkladınız.Bu tıklama neticesinde gönderdiğim sayfa üzerinden jQuery komutları aracılığıyla ilgili linki tetikletebilir, direkt yönlendirme yapabilir veyahut bir img(resim) nesnesi aracılığıyla ruhunuzun duymayacağı şekilde hedef linki tetikletip harekete geçirebilirim.Varsayalım gönderdiğim adreste aşağıdaki gibi bir resim var.
<img src=”http://www.****.com/Yazilar/Sil/173″ />
Bu resmin src attributeunda yani kaynağında hedef link var.img nesneleri verilen kaynak linke talep göndermekte ve gelen neticeyi ilgili alana basmaktadırlar.Haliyle bu img nesnesi verilen hedef linke talep gönderecek, yani onu tetikletecek ve saldırıda burada amacına ermiş olacak, ama geriye bir resim Response edilmediği için img nesnesi resmi gösteremeyecektir.

İşte ben buna gizli link vakası ismini verdim.

Sonraki yazılarımda görüşmek üzere…
Hepinize iyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. ahmet dedi ki:

    Mükemmel bir yazı olmuş, Ne yazıkki ülkemizdeki sitelerin çoğunda bu tarz açıklarla birlikte sql injection açıklarıda mevcut.

  2. lakin dedi ki:

    otur “0”

  1. 21 Ağustos 2019

    […] önce Identity Asp.NET Core uygulaması tarafından eklenen varsayılan cookieler mevcuttur. Bunlar Asp.NET MVC’de CSRF/XSRF(Cross-Site Request Forgery) Saldırı Güvenliği ile alakalı önlemler üzerine yapılmış mimarisel […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.