[TR] Yavuzlar/Vulnlab XSS Çözümleri

Herkese merhaba! Ben Akın Şengezer. Bugün sizlerle Yavuzlar ekibinin hazırlamış olduğu Vulnlab makinesinin XSS Zafiyetinin çözümlerini yapacağız. Şimdiden hepinize keyifli okumalar diliyorum. Ve hepinizin Kurban Bayramı Mübarek Olsun!

 

1.)Giriş

İlgili makineyi “https://github.com/Yavuzlar/VulnLab” adresinden DOCKER yardımı ile kurmanız gerekmektedir. Kurduktan sonra “http://localhost:1337/” adresinden makineye ulaşabilir ve çözmeye başlayabilirsiniz. Vulnlab makinesini seri şeklinde yapacağım. Her Zafiyetli Lab’ın çözümlerine buradan ulaşabileceksiniz!

 

Makineyi Docker yardımı ile kurduktan sonra şu şekilde bir Anasayfa ile karşılaşacaksınız.

2.) Basic Reflected

İlk Lab olan Basic Reflected ile başlıyoruz. Burada sayfaya ilk girdiğimde dikkatimizi çeken kullanıcı inputu alan arama butonu tarzı bir alan vardı. Önce düz kelimeler aratarak çıktısını inceledik.

Arama sonuçlarına baktığımız zaman aradığımız kelimeyi <b> etiketlerine arasına aldığını gördük. XSS Payloadlarında kullandığımız <>,(),;,/ vb… işaretleri ve kelimeleri aratarak bu sefer filtreleme oluyor mu diye test ettik ve hiç bir filtreleme ile karşılaşmadığımızı fark ettik.

Buradan sonrası farklı gördüğüm bir payload ile: <noembed><img src=”</noembed><iframe onload=alert(“PwnLabMe”)>” /></noembed>payloadını kullanarak tamamlamak kaldı.

Sizler de buradan farklı teknikler deneyebilirsiniz.

2.2) Basic Stored

Sisteme girmek için bize verdikleri username ve password kullanarak giriş yapıyoruz. Karşımıza bir Chat uygulaması çıkıyor. Lab’ın isminden de anlaşılacağı gibi STORED XSS Arıyoruz.

Uygulamayı girdiğim zaman önce düz bir kelime aratıyoruz.

Arattığımız kelime sadece <div> etiketi altına alındığını gördükten sonra yine bizi engelleyecek herhangi bir filtreleme olmadığını tespit edip <body onload=’alert(“PwnLabMe”);’> payloadını yollayıp tamamlıyoruz.

 

2.3) Basic Dom-Based

Lab’a girdiğimiz zaman bizi üçgenin alanını hesaplayan bir Javascript uygulaması veriliyor. Taban Ve Yükseklik istenmiş. Önce rakamlar girip uygulamanın çalışmasını kontrol ettik. Ve üçgen alanı hesaplayan Javascript kodunu inceledik.

Tekrardan “”,(),<>,script,alert kelime ve simgelerini yollayarak herhangi bir filtreleme var mı onu kontrol ediyoruz. Ve herhangi bir filtreleme ile karşılaşmadık.

Buradan sonra Lab ismine bakaran DOM XSS üzerinden gitmemiz gerektiğini zaten bizlere söylüyor. İlk başta payload girerek direk sistem üzerinden alert verdiremezsiniz. DOM XSS’de sistem ile HTML dönen yanıt aynı olur. Bu yüzden öncelik olarak kelime gönderip ardına payload yollayarak sistem üzerinde bir nevi atlatma sağlayabiliyoruz.

PwnLabMe yazısını yolladıktan sonra arkasına PwnLabMe<script>confirm(1);</script> payloadını yollayıp tamamlıyoruz.

2.4) HTML Manipülasyonu

Giriş ekranı olarak film bileti alabileceğimiz ve kullanıcıdan input alan bir alan ile karşılaştık. Buraya düz bir metin girerek kaynak kodda durumu görüntüledik.

Kaynak kodlarda incelediğimizde <a href=ticket.php?name=> tagı’nın içine alındığını görüyoruz. Payload oluştururken kafamızda az çok neler yazmamız gerektiği oluşmuştur. Düz bir biçimde XSS Payloadı gönderdiğimiz zaman tagın içerisinden çıkamadığını fark ettik. Bunun üzerine ” işareti kullanarak Manipüle etmemiz gerektiği belli oldu.

Bilet ismini görüntülemek için verilen “Bileti Görüntüle” Butonunu manipüle etmeyi düşünmemiz gerekli. Bunun üzerine, mouse yazının üzerine geldiği zaman alert verdirecek şu payloadı kullandık.

X”<a href=”x” onmouseover=’alert(“PwnLabMe”);’>Bileti Görmek İçin Tıkla</a>

Bu sayede bileti görüntülemek için butona geldiğim zaman alert yazısı ile karşılaştık.

2.5) Galerimize Hoş Geldiniz

Bizleri bu sefer resim galerisi tarzında bir sayfa karşıladı. İlk olarak resimlere teker teker tıklayıp baktıktan sonra Url tarafı dikkatimi çekti. Çünkü resimler “?img=” altında numaralandırılıyordu. Demek ki bizim XSS İnput yerimiz burası olacak.

“?img=PwnLabMe” isteği göndererek Nasıl yorumlandığını kaynak kodlarında inceledikten sonra gönderdiğimiz ismin “JPG” Formatına dönüştürüldüğünü gördük. Fakat düz metin yolladığımız zaman her zaman JPG olarak yorumlanacak. ” Kaçış elemanını kullanarak Text haline dönüştürüp JPG olarak yorumlanmasını engelledikten sonra Payloadı oluşturma aşamasına geçtik.

İMG Etiketi altına aldığı için XSS Payloadı oluştururken buradan yürümemiz gerekiyor. Bu Yüzden; ” <img src=”x” onerror=’prompt(“PwnLabMe”);’> kullanarak tamamlamış olduk.

2.6) User Agent

Bizleri ilk karşılayan Login ekranında verilen bilgiler ile giriş yapıyoruz. Arkasına bizleri admin’nin User Agent bilgilerini depoladığını ve nasıl göründüğünü görmemizi istediği sayfa ile karşılaştıktan sonra görüntülüyoruz.

Bizlere belirli User Agent sunduktan sonra hepsini siliyoruz. Ve artık buraya kadar Burp Suite kullanmadan geldiğimiz yetti :). Burp Suite aracını açarak isteği dinlemeye alıyoruz ve gözlemlemeye başlıyoruz.

User-Agent kısmını silip bir metin yollayıp Browser üzerindeki yorumunu inceledikten sonra, User-Agent kısmına ne yazarsanız yazın Log’layıp sizlere sunuyor.

PwnLabMe metini gönderdikten sonra sayfayı yenileyip tekrar bakıyoruz.

Yapmamız gereken tek şey; “<script>prompt(“PwnLabMe”);</script>” payloadı yollayarak Lab’ı tamamlamak.

2.7) Haberler

Girdikten sonra Kullanıcıdan 2 tane input alan “News Title” ve “News Url” bölümleri ile karşılaşıyoruz. Önce düz metinler göndererek yorumlanmasını kaynak kodlardan inceliyoruz.

News Url bölümüne gönderdiğimiz metinin “<a href=” etiketi içerisine alınıp News Title bölümüne gönderdiğimiz metinin ise <a href=> tagının text kısmında yorumlandığını görüyoruz.

Kaynak kodlarda düz payload gönderikten sonra <>; işaretlerinin encode edildiğini görüyoruz. Bu yüzden payload oluştururken <>,; vb… işaretler kullanmamamız gerekli.

javascript:alert(“PwnLabMe”); payload’ı kullanarak <>,;,/ işaretlere gerek kalmadan sistem üzerinde alert verdirerek tamamlıyoruz.

2.8) Dosya Yükleme

İlk girdiğimiz zaman bizlere dosya yüklememize imkan sağlayan bir alan ile karşılaşıyoruz. Kaynak kodları okuduktan sonra sadece jpeg ,png, gif dosya türlerine yani resim yüklememize imkan sağlanıyor.

Kaynak Kod:

Buradan sonra 3 olanak mevcut. Ya dosya ismini XSS Payloadı yapıp yükleyeceğiz, ya Metadata üzerinde XSS Payloadı yapıp yükleyeceğiz ya da SVG Dosyası içine XSS Payloadı yapıp yüklemeliyiz. Ama zaten otomatik olarak kaynak kodlar sayesinde 3. seçenek elenmiş oldu. Exiftool ile Metadata içinde Comment içine XSS Payloadı yazıp upload ettiğimiz zaman tamamlanmadı. Demek oluyor ki 1. yöntem çözüm yolumuz.

Linux ortamında dosya ismini “><img src=x onerror=alert(“PwnLabMe”)>.png şeklinde hazırladım. Ve sistem üzerinde upload ettiğim zaman Lab tamamlanmış oldu.

Tüm çözümler bu kadardı. Umarım sizlere faydalı olmuştur. Herkese keyifli günler dilerim!

 

Kaynakça:

File Upload XSS

https://portswigger.net/web-security/cross-site-scripting/dom-based

https://owasp.org/www-community/attacks/xss/

 

 

Teşekkür:

Veli Oğuzcan Akdağ

Muhammet Şahin Adibaş

Akın Şengezer
Merhaba Ben Akın Şengezer. Selçuk Üniversitesi İstatistik Bölümü Öğrencisiyim. Siber Güvenlik Ve Red Team Alanında 3 Yıldır Çalışmalar Yapmakta Ve Kendimi Geliştirmeye Devam Etmekteyim.