BOOK THIS SPACE FOR AD
ARTICLE ADHerkese Merhaba,
Bu yazımda PortSwigger firmasının Web Security Academy serisinden Information disclosure zafiyetilerinin lab çözümlerini sizlere anlatacağım.
Labımızı açtıktan sonra uygulamada biraz gezindik fakat backup dosyası ile ilgili bir bilgi bulamadığımız için Burp Suite üzerinden Target > Sitemap kısmında labımızın olduğu URL’e sağ tıklayıp Engagement tools üzerinden Discover content ile web uygulamasının pathlerini keşfetmeye başlıyoruz.
Biraz bekledikten sonra keşfedilen pathlerde backup path’ı dikkatimizi çekti. Bir sonraki işlem olarak browserdan /backup path’ıne gidiyoruz.
ProductTemplate.java.bak backup dosyasını açıyoruz ve içerisinde hard coded halde bulunan postgres db’sinin passwsord’unu buluyoruz.
Password’u submit solution ile göndererek labımızı tamamlıyoruz.
Labımızı açtıktan sonra ana sayfanın kaynağını inceleyelim. Ctrl + U view-source incelerken dikkatimizi<!-- <a href=/cgi-bin/phpinfo.php>Debug</a> --> commenti çekiyor. Belirtilen debug sayfasına /cgi-bin/phpinfo.php gidelim.
Labın çözümü için bizden bir SECRET_KEY isteniyordu. Sayfayı incelerken Environment altında SECRET_KEY’imizide bulmuş olduk. Değeri submit solution ile göndererek labımızı tamamlıyoruz.
Uygulamaları incelerken bazen yorum satırlarları dikkatimizden kaçabiliyor. Bu durumu bizim için daha kolay hale getiren Burp Suite’de bir tool bulunmaktadır. Burp Suite üzerinden Target > Sitemap kısmından labımızın bulunduğu URL’e sağ tıklayıp Engagement tools üzerinden Find commentse tıklıyoruz. Bu sayede uygulama üzerinde olan yorum satırlarını bize sayfalara göre gösteriyor. Sonuçlara baktığımızda ana sayfa ve ürün sayfalarındaki <a href=/cgi-bin/phpinfo.php>Debug</a> yorum satırı dikkatimizi çekiyor.Belirtilen debug sayfasına /cgi-bin/phpinfo.php gidiyoruz. SECRET_KEY'i sayfada arattığımızda bulanan değeri submit solution ile göndererek labımızı tamamlıyoruz.
Labımızı açtıktan sonra uygulamada versiyon kontrol sistemini bulmamız gerekiyor. Genelde development aşamasında verisyon kontrol sistemleri protocol:port//domain/.git halinde uygulamalarda bulunur. Fakat production aşamasında developer /.git path’ını uygulamadan kaldırmayı unutursa buraya erişebiliriz. URL’den https://x.web-security-academy.net/.git adresine gidiyoruz.
Evet /.git unutulmuş bizde git-dumper aracı ile bu /.git içinde yer alan dosyaları bilgisayarımıza indiriyoruz. Siz wget veya farklı araçlarla da /.git’i indirebilirsiniz. Biz işlemlerimize git-dumper ile devam ediyoruz.
Terminalde python git-dumper’ı çalıştırmadan önce parametre olarak /.git’in bulunduğu URL’i ve indireceğimiz yeri belirtiyoruz.
İndirdiğimiz .git klasörünü github-gui veya git-kraken gibi git arayüzü olan masaüstü uygulamalarıyla kolayca görüntüleyebiliriz. Biz işlemlerimize terminal üzerinden devam edeceğiz. Terminalden /.git klasörünün içine gidiyoruz ve git show diyerek ADMIN_PASSWORD= üzerindeki değişikliği görüyoruz.
Eski committe hard coded halde bulunan admin passwordu alıp administrator:x ile uygulamaya login oluyoruz.
Admin panel üzerinden carlos kullanıcısını silerek labımızı tamamlıyoruz.
Labımızı açtıktan sonra ana sayfadan herhangi bir ürüne gidiyoruz. Ürün sayfasında URL alanı dikkatimizi çekiyor. Ürünler sayı değerine göre uygulamada gösteriliyor.
/product?productId=1 URL kısmındaki productId paremetresine beklenmeyen bir ifade ile request gönderirsek ne olur? düşüncesiyle ekstra bir harf gönderiyoruz. /product?productId=1a
Gönderdiğimiz ekstra a karakteri uygulamada hataya neden oluyor çünkü uygulama productId’yi sayı değeri olarak bekliyor. Biz sayı haricinde farklı bir değer gönderdiğimiz için uygulama bu hatayı dönüyor. Hata mesajının en sonunda framework ve version numarasını submit solution ile göndererek labımızı tamamlıyoruz.
Labımıza bize verilen wiener:peter ile giriş yapıyoruz. Admin path’ına gitmeye çalışıyoruz fakat bize admin arayüzüne sadece local kullanıcıların erişebileceği mesajıyla karşılaşıyoruz. Admin arayüzüne erişmemiz için iki yolumuz var ya admin olarak uygulamaya giriş yapacağız ya da local kullanıcı olarak buraya erişeceğiz.
Admin pathına gitmeye çalıştığımız requesti Intrudera gönderiyoruz. Burada aklımıza HTTP request methodlarını değiştirmek geliyor. Uygulama farklı HTTP methodlarına izin veriyorsa, methodlara göre farklı bir yol izleyebiliriz. Intuder kısmında §GET§ kısmını seçip payload olarak da tüm HTTP methodlarını ekliyoruz.
Start attack dedikten sonra Intuderdan sonuçlar geliyor. TRACE methodu /admin için 200 OK dönüyor.
Repeater kısmında göndereceğimiz requestin HTTP methodunu TRACE olarak değiştiriyoruz. Responseyi incelediğimizde dikkatimizi X-Custom-IP-Authorization: header bilgisi çekiyor. Burada bizim public ip adresimiz yazmaktadır.
Şimdi biraz kafa yoralım peki biz burayı localhost yani 127.0.0.1 olarak değiştirirsek ne olur? Uygulamada internal ağda oluruz ve göndereceğimiz tüm requestler local kullanıcı olarak değerlendirilir.
Requestimize X-Custom-IP-Authorization: 127.0.0.1 headerını ekledik. Method kısmını da tekrar GET haline getirdik ve requestimizi gönderdik. Responseyi incelediğimizde Admin panel karşımıza çıkıyor.
Admin panelde /admin/delete?username=carlos ile carlos kullanıcısını silebiliyoruz. Requestimizi tekrar düzenleyip carlos kullanıcısını silerek labımızı tamamlıyoruz.
Umarım sizin için faydalı bir yazı olmuştur. Daha çok kişinin faydalanması/öğrenmesi için yazıyı paylaşabilirsiniz. Her türlü görüş ve önerilerinizi bekliyorum. Keyifli öğrenmeler :)