PORTSWIGGER WEB SECURITY - CLICKJACKING LAB ÇÖZÜMLERİ
Clickjacking, saldırgan tarafından web uygulamasında barındırılan zararlı bir bağlantıya, hedef kullanıcının tıklaması sonucunda çeşitli saldırıların gerçekleştirilmesine olanak tanıyan bir web güvenlik zafiyetidir. Daha da açacak olursak saldırgan web sayfasında bir bağlantı tanımlar ve hedeflediği kullanıcıyı bu bağlantıya tıklaması için kandırma teknikleri uygular. Hedef kullanıcı bu bağlantıya tıkladığı zaman, saldırgan hedef kullanıcıya ait cookie, mail ve hesap bilgileri gibi birçok veriyi elde edebilir.
NOT: Clickjacking zafiyetinde, saldırının gerçekleşmesi için her zaman bir bağlantıya tıklanması söz konusudur bu nedenle CSRF’den farklıdır.
Bu çalışmada bahsedilen Clickjacking zafiyeti için tüm laboratuvar çözümleri ele alınmıştır. Keyifli okumalar..
Lab 1: Basic clickjacking with CSRF token protection
Clickjacking saldırılarında genellikle CSS kullanılmaktadır. Saldırgan bağlantı oluşturmak ve hedef kullanıcının bu bağlantıya tıklamasını sağlamak için içerisinde iframe işlevi barındıran uygun bir CSS kodu kullanır. iframe işlevi ile yönlendirilmesi istenen URL adresi belirtilir ve hedef kullanıcının bağlantıya tıklayarak, belirtilen URL adresi üzerinde istenilen eylem her neyse gerçekleşmesi sağlanır.
Bu web sayfası hesap silme eylemine yönelik saldırıları engellemek için token bilgisi kullanmaktadır. Ancak bir clickjacking saldırısı yapılarak hesap silme işlemi gerçekleştirilebilir. Hedef kullanıcıyı kandırabilmek adına içerisinde hesap silme sayfasına yönlendiren bir bağlantı barındıran CSS kodu kullanarak saldırı gerçekleştireceğiz.
Sayfa üzerinde laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve hesabı silebileceğimiz bir panel çıkmaktadır.
Hesap silme (Delete account) butonuna tıklayıp gönderilen isteği burp ile incelediğimizde saldırılardan korunma amaçlı kullanılan bir csrf token bilgisinin yer aldığını göreceğiz. Ancak biz bu durumu bir Clickjacking saldırısı yaparak bypas edebilmekteyiz. Hesap silme işlemini kullanıcıya yaptıracağımız için isteği drop edip devam edelim.
Amacımız hesap silme işlemini hedef kullanıcıya yaptırmaktır. Bunun için oluşturacağımız bağlantının Delete account butonu ile aynı hizada olmasını sağlayacağız. Bunu hedef kullanıcıyı kandırmak adına yapıyoruz. Bu şekilde hedef kullanıcı, oluşturacağımız bağlantıya tıklayacağı zaman aslında Delete account butonuna tıklamış olacaktır. Exploit sunucusuna giderek Body input alanında, <style> iframe { position:relative; width:700px; height: 500px; opacity: 0.1; z-index: 2; } div { position:absolute; top:495px; left:60px; z-index: 1; } </style> <div>Click Me</div> <iframe src=”https://ac951f621e390882c0cb8b98001c00eb.web-security-academy.net/my-account”></iframe> içerisinde hesap silme sayfasının URL adresini içerecek şekilde bir bağlantı Store edelim. Burada tanımlamış olduğumuz width, height, top ve left değerleri, Click Me butonunun Delete account butonu ile aynı konumda bulunmasını sağlamak için kullanılmıştır.
NOT: Bu CSS değerleri, laboratuvarı çözen kullanıcıların pc boyutlarından ötürü değişiklik gösterebilir.
Kod içerisinde kullandığımız opacity: 0.1 değeri ise sayfanın şeffaflığını artırmak içindir. Exploiti görüntülediğimizde (View exploit), oluşturduğumuz Click Me bağlantısının Delete account butonuyla aynı konumda bulunduğu görülecektir. Ancak burada arka planı görmek açısından opacity değeri 0.1 olarak tanımlanmıştır. Hedef kullanıcıyı kandırabilmek adına arka planın tamamıyla şeffaf olması sağlanabilir. Bunun için opacity değerini 0.0001 olarak değişeceğiz.
Exploit sunucusuna giderek Body input alanında aynı kodu, içerisinde sadece opacity değerini 0.0001 şeklinde değişerek Store edelim.
Tekrardan exploiti görüntülediğimizde (View exploit), arka planın tamamıyla şeffaf olduğu görülecektir. Hedef kullanıcı Click Me butonu üzerine tıkladığı zaman hesap silinecektir. Gerçek bir senaryo olmadığı için bu aşamada exploiti kurbana teslim ediyoruz (Deliver exploit to victim). Laboratuvarın çözümü bu şekildedir.
Congratulations, you solved the lab!
Lab 2: Clickjacking with form input data prefilled from a URL parameter
Form paneli veya herhangi bir eylem için Submit özelliği barındıran bazı web uygulamaları, gönderilen istek normalde POST metodunu kullanıyorken bunun GET olarak gönderilmesine izin vermektedir. GET isteği URL’nin bir parçasını oluşturduğundan, saldırgan hedef kullanıcıyı yönlendirmek istediği URL adresini istediği şekilde değiştirebilir ve saldırı gerçekleştirebilir.
Bu web sayfası email güncelleme eylemine yönelik saldırıları engellemek için token bilgisi kullanmaktadır. Ancak bir clickjacking saldırısı yapılarak email güncelleme işlemi gerçekleştirilebilir. Bir önceki laboratuvarda yapmış olduğumuz hesap silme işlemini burada email güncelleme işlemi için yapacağız. Hedef kullanıcıyı kandırabilmek adına içerisinde email güncelleme sayfasına yönlendiren bir bağlantı barındıran CSS kodu kullanarak saldırı gerçekleştireceğiz.
Sayfa üzerinde laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olduğumuzda karşımıza email adresini güncelleyebileceğimiz bir panel çıkmaktadır.
Email güncelleme panelinde random bir mail adresi update edip (hacker@gmail.com) gönderilen isteği burp ile incelediğimizde saldırılardan korunma amaçlı kullanılan bir csrf token bilgisinin yer aldığını göreceğiz. Ancak biz bu durumu bir Clickjacking saldırısı yaparak bypas edebilmekteyiz. Email değişme işlemini hedef kullanıcıya yaptıracağımız için isteği drop edip devam edelim.
Amacımız email değişme işlemini hedef kullanıcıya yaptırmaktır. Bunun için oluşturacağımız bağlantının Update email butonu ile aynı hizada (konumda) olmasını sağlayacağız. Bunu hedef kullanıcıyı kandırmak adına yapıyoruz. Bu şekilde hedef kullanıcı, oluşturacağımız bağlantıya tıklayacağı zaman aslında Update email butonuna tıklamış olacaktır. Exploit sunucusuna giderek Body input alanında, <style> iframe { position:relative; width:700px; height: 500px; opacity: 0.1; z-index: 2; } div { position:absolute; top:450px; left:80px; z-index: 1; } </style> <div>Click Me</div> <iframe src=”ac4c1f371f1175fdc0703090001d0007.web-security-academy.net/my-account?email=hacker@gmail.com”></iframe> içerisinde email güncelleme sayfasının URL adresini içerecek şekilde bir bağlantı Store edelim. Burada tanımlamış olduğumuz width, height, top ve left değerleri, Click Me butonunun Update email butonu ile aynı konumda bulunmasını sağlamak için kullanılmıştır. Ayrıca URL adresinde email parametresi ve değeri kullanılarak bir GET isteği yapılmıştır.
NOT: Bu CSS değerleri, laboratuvarı çözen kullanıcıların pc boyutlarından ötürü değişiklik gösterebilir.
Kod içerisinde kullandığımız opacity: 0.1 değeri ise sayfanın şeffaflığını artırmak içindir. Exploiti görüntülediğimizde (View exploit), oluşturduğumuz Click Me bağlantısının Update email butonuyla aynı konumda bulunduğu görülecektir. Ancak burada arka planı görmek açısından opacity değeri 0.1 olarak tanımlanmıştır. Hedef kullanıcıyı kandırabilmek adına arka planın tamamıyla şeffaf olması sağlanabilir. Bunun için opacity değerini 0.0001 olarak değişeceğiz.
Exploit sunucusuna giderek Body input alanında aynı kodu, içerisinde sadece opacity değerini 0.0001 şeklinde değişerek Store edelim.
Tekrardan exploiti görüntülediğimizde (View exploit), arka planın tamamıyla şeffaf olduğu görülecektir. Hedef kullanıcı Click Me butonu üzerine tıkladığı zaman email adresi değişecektir. Gerçek bir senaryo olmadığı için bu aşamada exploiti kurbana teslim ediyoruz (Deliver exploit to victim). Laboratuvarın çözümü bu şekildedir.
Congratulations, you solved the lab!
Lab 3: Clickjacking with a frame buster script
Bazı web uygulamaları, Clickjacking saldırılarını önlemek adına Frame busting (Çerçeve bozma) teknikleri kullanmaktadır. Web tarayıcısı aracılığıyla Frame busting komut dosyaları kullanılarak istemci tarafında koruma sağlamak amaçlanmaktadır. Bunlar JavaScript eklentileri veya NoScript gibi uzantılar aracılığıyla uygulanabilir. Ancak bu durum, Frame busting engeline karşı en etkili çözümlerden bir tanesi olan HTML5 iframe sandbox özniteliği kullanarak bypass edilebilmektedir. Bahsedilen bu öznitelik, allow-forms veya allow-scripts değerleri ile iframe içinde belirtilen eylemlere izin verilmesine imkan tanır ve sayfa içinde Frame busting tekniklerini engeller.
Bu web sayfası, Frame busting tekniği kullanarak Clickjacking saldırılarından korunmayı amaçlamaktadır. Ancak HTML5 iframe sandbox özniteliğini kullanarak bu durumu bypass edeceğiz. Hedef kullanıcıyı kandırabilmek adına içerisinde email güncelleme sayfasına yönlendiren bir bağlantı barındıran CSS kodu kullanarak saldırı gerçekleştireceğiz.
Sayfa üzerinde laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olduğumuzda karşımıza email adresini güncelleyebileceğimiz bir panel çıkmaktadır.
Çerçeve engelleyiciler Javascript kullandığından sayfanın kaynak kodunu inceleyelim. Burada, saldırılardan korunma amaçlı kullanılan bir csrf token bilgisinin yer aldığını ve bir Javascript kodu içerisinde Frame busting yapılandırıldığını göreceğiz. Ancak web sayfasının kullanmış olduğu bu Frame busting komut satırını, Store edeceğimiz kod içerisinde sandbox=”allow-forms” özniteliğini kullanarak bypass edebilmekteyiz.
Amacımız email değişme işlemini hedef kullanıcıya yaptırmaktır. Bunun için oluşturacağımız bağlantının Update email butonu ile aynı hizada (konumda) olmasını sağlayacağız. Bunu hedef kullanıcıyı kandırmak adına yapıyoruz. Bu şekilde hedef kullanıcı, oluşturacağımız bağlantıya tıklayacağı zaman aslında Update email butonuna tıklamış olacaktır. Exploit sunucusuna giderek Body input alanında, <style> iframe { position:relative; width:700px; height: 500px; opacity: 0.1; z-index: 2; } div { position:absolute; top:450px; left:80px; z-index: 1; } </style> <div>Click Me</div> <iframe sandbox=”allow-forms” src=”ac231f151fa7aa49c15364950047000e.web-security-academy.net/my-account?email=hacker@gmail.com”></iframe> içerisinde email güncelleme sayfasının URL adresini içerecek şekilde bir bağlantı Store edelim. Burada tanımlamış olduğumuz width, height, top ve left değerleri, Click Me butonunun Update email butonu ile aynı konumda bulunmasını sağlamak için kullanılmıştır. Ayrıca iframe içerisinde sandbox=”allow-forms” özniteliği kullanılarak web sayfasında koruma amaçlı kullanılan Frame busting komut satırı engellenmiştir.
NOT: Bu CSS değerleri, laboratuvarı çözen kullanıcıların pc boyutlarından ötürü değişiklik gösterebilir.
Kod içerisinde kullandığımız opacity: 0.1 değeri ise sayfanın şeffaflığını artırmak içindir. Exploiti görüntülediğimizde (View exploit), oluşturduğumuz Click Me bağlantısının Update email butonuyla aynı konumda bulunduğu görülecektir. Ancak burada arka planı görmek açısından opacity değeri 0.1 olarak tanımlanmıştır. Hedef kullanıcıyı kandırabilmek adına arka planın tamamıyla şeffaf olması sağlanabilir. Bunun için opacity değerini 0.0001 olarak değişeceğiz.
Exploit sunucusuna giderek Body input alanında aynı kodu, içerisinde sadece opacity değerini 0.0001 şeklinde değişerek Store edelim.
Tekrardan exploiti görüntülediğimizde (View exploit), arka planın tamamıyla şeffaf olduğu görülecektir. Hedef kullanıcı Click Me butonu üzerine tıkladığı zaman email adresi değişecektir. Gerçek bir senaryo olmadığı için bu aşamada exploiti kurbana teslim ediyoruz (Deliver exploit to victim). Laboratuvarın çözümü bu şekildedir.
Congratulations, you solved the lab!
Lab 4: Exploiting clickjacking vulnerability to trigger DOM-based XSS
Şu ana kadar clickjacking zafiyetine bağımsız bir şekilde değindik. Yani XSS gibi ciddi zafiyetleri tetiklemeden ele aldık. Clickjacking zafiyeti diğer zafiyetler kadar önem arz etmektedir ancak bazen çok daha ciddi olabilmektedir. Örneğin Clickjacking zafiyeti üzerinden bir DOM XSS saldırısı gerçekleştirilirse zafiyet daha riskli hale gelir.
Bu web sayfası, oluşturulan bağlantıya tıklanması halinde bir XSS tetiklenmesine neden olmaktadır. Burada, hedef kullanıcının bağlantıya tıklamasıyla DOM XSS tetiklemesine neden olacak bir Clickjacking saldırısı gerçekleştireceğiz.
Sayfa üzerinde bir geri bildirim gönderme (Submit feedback) paneli mevcuttur. Bu panelde random bilgiler tanımlayarak submit edelim ve gönderilen isteği burp ile yakalayalım.
İsteği incelediğimizde saldırılardan korunma amaçlı bir csrf token bilgisinin kullanıldığını ve tanımlamış olduğumuz bilgilerin hangi parametreler altında gönderildiği görülecektir. Geri bildirim gönderme işlemini hedef kullanıcıya yaptıracağımız için isteği drop edip devam edelim.
Amacımız email değişme işlemini hedef kullanıcıya yaptırmak ve DOM XSS tetiklemesini sağlamaktır. Bunun için oluşturacağımız bağlantının Submit feedback butonu ile aynı hizada (konumda) olmasını sağlayacağız. Bunu hedef kullanıcıyı kandırmak adına yapıyoruz. Bu şekilde hedef kullanıcı, oluşturacağımız bağlantıya tıklayacağı zaman aslında Submit feedback butonuna tıklamış olacaktır. Exploit sunucusuna giderek Body input alanında, <style> iframe { position:relative; width:$700px; height: 500px; opacity: 0.1; z-index: 2; } div { position:absolute; top:420px; left:80px; z-index: 1; } </style> <div>Click Me</div> <iframe src=”ac471fc91f54f087c0ab2a5d0046004e.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=webappsec@gmail.com&subject=Mesaj&message=Merhaba#feedbackResult”></iframe> içerisinde geri bildirim sayfasının URL adresini içerecek şekilde bir bağlantı Store edelim. Burada tanımlamış olduğumuz width, height, top ve left değerleri, Click Me butonunun Submit feedback butonu ile aynı konumda bulunmasını sağlamak için kullanılmıştır. Ayrıca XSS tetiklenmesi için name parametresine <img src=1 onerror=print()> şeklinde bir payload tanımlanmıştır.
NOT: Bu CSS değerleri, laboratuvarı çözen kullanıcıların pc boyutlarından ötürü değişiklik gösterebilir.
Kod içerisinde kullandığımız opacity: 0.1 değeri ise sayfanın şeffaflığını artırmak içindir. Exploiti görüntülediğimizde (View exploit), oluşturduğumuz Click Me bağlantısının Submit feedback butonuyla aynı konumda bulunduğu görülecektir. Ancak burada arka planı görmek açısından opacity değeri 0.1 olarak tanımlanmıştır. Hedef kullanıcıyı kandırabilmek adına arka planın tamamıyla şeffaf olması sağlanabilir. Bunun için opacity değerini 0.0001 olarak değişeceğiz.
Exploit sunucusuna giderek Body input alanında aynı kodu, içerisinde sadece opacity değerini 0.0001 şeklinde değişerek Store edelim.
Tekrardan exploiti görüntülediğimizde (View exploit), arka planın tamamıyla şeffaf olduğu görülecektir. Hedef kullanıcı Click Me butonu üzerine tıkladığı zaman geri bildirim gönderilecek ve DOM XSS saldırısı gerçekleşmiş olacaktır. Gerçek bir senaryo olmadığı için bu aşamada exploiti kurbana teslim ediyoruz (Deliver exploit to victim). Laboratuvarın çözümü bu şekildedir.
Congratulations, you solved the lab!
Lab 5: Multistep clickjacking
Bir web uygulamasında (e ticaret olarak düşünülebilir) saldırgan tarafından hedef kullanıcıya, ilk olarak sepete ürün eklemesini ve ardından alışverişi onaylamasını sağlayacak iki ayrı eylemin yaptırılması istenebilir. Bundan dolayı saldırganın, hedef kullanıcı yaptırmak istediği eylemler için bazen birden çok bağlantı oluşturması gerekmektedir. Bu tür saldırıların etkili ve gizli olması hedeflendiği için saldırganın bakış açısı, özenli ve titiz oluşu oldukça önemlidir.
Bu web sayfası hesap silme eylemine yönelik saldırıları engellemek için token bilgisi kullanmaktadır. Ayrıca clickjacking saldırısına önlem almak için hesap silme işlemi sonrası onay istemektedir. Ancak burada her iki adım için bağlantı oluşturularak hedef kullanıcıyı kandırmaya yönelik bir clickjacking saldırısı gerçekleştirilebilir. Bu nedenle içerisinde iki ayrı bağlantı tanımlayacağımız bir CSS kodu kullanarak saldırı gerçekleştireceğiz.
Sayfa üzerinde laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve hesabı silebileceğimiz bir panel çıkmaktadır.
Hesap silme (Delete account) butonuna tıklayıp gönderilen isteği burp ile incelediğimizde saldırılardan korunma amaçlı kullanılan bir csrf token bilgisinin yer aldığını göreceğiz. Ancak biz bu durumu bir Clickjacking saldırısı yaparak bypas edebilmekteyiz.
İsteği forward ettiğimizde hesabın silinmesi için bizden onay istenecektir. Hesap silme butonunu ve ardından yes cevabının yer aldığı butonu kullanıcının tıklamasını istediğimizden bu aşamada hesabı silmeden devam edelim.
Amacımız iki adımdan oluşan hesap silme işlemini hedef kullanıcıya yaptırmaktır. Bunun için iki bağlantı oluşturacağız. İlk bağlantının Delete account butonu ile ikinci bağlantının ise Yes butonu ile aynı hizada (konumda) olmasını sağlayacağız. Bunu hedef kullanıcıyı kandırmak adına yapıyoruz. Bu şekilde hedef kullanıcı, oluşturacağımız bağlantılara sırasıyla tıklayacağı zaman aslında Delete account ve Yes butonlarına tıklamış olacaktır. Exploit sunucusuna giderek Body input alanında, <style> iframe { position:relative; width:500px; height: 700px; opacity: 0.1; z-index: 2; } .firstClick, .secondClick { position:absolute; top:500px; left:50px; z-index: 1; } .secondClick { top:295px; left:210px; } </style> <div class=”firstClick”>Click Me First</div> <div class=”secondClick”>Click Me Next</div> <iframe src=”ac341f2f1e70459ac0e413d4006d0049.web-security-academy.net/my-account”></iframe> içerisinde hesap silme sayfasının URL adresini içerecek şekilde bir bağlantı Store edelim. Burada tanımlamış olduğumuz width, height, top ve left değerleri, Click Me First butonunun Delete account butonu ile Click Me Next butonunun Yes butonu ile aynı konumda bulunmasını sağlamak için kullanılmıştır.
NOT: Bu CSS değerleri, laboratuvarı çözen kullanıcıların pc boyutlarından ötürü değişiklik gösterebilir.
Exploiti görüntülediğimizde (View exploit), oluşturduğumuz Click Me First bağlantısının Delete account butonuyla aynı konumda bulunduğu görülecektir.
Click Me First bağlantısına tıkladığımızda açılan onay ekranında Click Me Next butonunun Yes butonuyla aynı konumda olduğunu ve iki bağlantınında istenilen şekilde konumlandırıldığını doğrulamış olacağız.
Daha önce Store ettiğimiz kod içerisinde yer alan opacity: 0.1 değerini, sayfanın şeffaflığını artırmak için kullanmıştık. Ancak burada arka planı görmek açısından opacity değerini 0.1 olarak tanımladık. Hedef kullanıcıyı kandırabilmek adına arka planın tamamıyla şeffaf olması sağlanabilir. Bunun için opacity değerini 0.0001 olarak değişeceğiz.
Exploit sunucusuna giderek Body input alanında aynı kodu, içerisinde sadece opacity değerini 0.0001 şeklinde değişerek Store edelim.
Tekrardan exploiti görüntülediğimizde (View exploit), arka planın tamamıyla şeffaf olduğu görülecektir. Hedef kullanıcı Click Me First butonu üzerine tıkladığı zaman arka planda hesap silme onay ekranı açılacaktır. Ardından Click Me Next butonuna tıkladığında hesap silmeyi onaylamış olacaktır ve hesap silinecektir. Gerçek bir senaryo olmadığı için bu aşamada exploiti kurbana teslim ediyoruz (Deliver exploit to victim). Laboratuvarın çözümü bu şekildedir.
Congratulations, you solved the lab!
NOT: Bu laboratuvarlarda, Clickjacking saldırıları için aslına bakarsanız bağlantı oluşturmuyoruz. Sayfada yer alan bağlantı üzerine bir yazı ekleyerek bunu bağlantıymış gibi göstermeye çalışıyoruz. Hedef kullanıcı mouse ile oluşturduğumuz yazının üzerine geldiğinde aslında sayfadaki gerçek bağlantının üzerine gelmiş oluyor.