June 12, 2026
Lab: Information disclosure in version control history
Merhaba arkadaşlar. Bu writeup’ta PortSwigger’ın “Information disclosure in version control history” labını çözeceğiz. Bu lab ilk bakışta…
Songül Kızılay Özügürler
3 min read
Merhaba arkadaşlar. Bu writeup'ta PortSwigger'ın "Information disclosure in version control history" labını çözeceğiz. Bu lab ilk bakışta oldukça sakin görünse de aslında geliştiricilerin sık yaptığı bir hatayı gösteriyor: Git geçmişinde hassas bilgilerin bırakılması.
Labın amacı oldukça net:
- Administrator kullanıcısının şifresini elde etmek
- Admin hesabına giriş yapmak
- Son olarak
carloskullanıcısını silmek
Başlayalım.
Siteyi açtığımızda normal bir web uygulaması görüyoruz. İlk olarak her zaman yaptığım gibi uygulamayı hem tarayıcıdan hem de Burp Suite üzerinden incelemeye başladım.
Sayfaları gezdim, kaynak kodlarına baktım, istekleri kontrol ettim ancak doğrudan göze çarpan bir zafiyet görünmüyordu.
Bu noktada aklıma şu soru geldi:
Acaba sunucuda istemeden erişime açık bırakılmış dosyalar var mı?
Bunu kontrol etmek için dizin taraması yapmaya karar verdim.
Dizin Taraması
Ben bu örnekte dirsearch kullandım.
dirsearch -u https://0a2600f603eed32781456b3d00030028.web-security-academy.net/
dirsearch -u https://0a2600f603eed32781456b3d00030028.web-security-academy.net/Bir süre sonra oldukça ilginç bir çıktı geldi:
/.git/ (Status: 200)/.git/ (Status: 200)Burada biraz durup .git dizininin ne olduğuna bakalım.
.git Nedir?
Git, yazılım geliştirme süreçlerinde kullanılan bir versiyon kontrol sistemidir.
Bir geliştirici proje üzerinde değişiklik yaptığında Git bu değişiklikleri kayıt altına alır.
Örneğin:
- Eski kodlar
- Silinen satırlar
- Commit geçmişleri
- Geliştirici notları
- Yanlışlıkla eklenen şifreler
gibi birçok bilgi Git geçmişinde saklanabilir.
Normal şartlarda .git klasörü internete açık olmamalıdır.
Ancak bu labda geliştiriciler bu klasörü yanlışlıkla erişilebilir bırakmış.
.git Dizininin İçeriğini İndirmek
Tarayıcı üzerinden .git dizinine girdiğimizde directory listing açık olduğunu görüyoruz.
Dosyaları tek tek incelemek yerine tüm Git deposunu kendi makinemize çekmek daha mantıklı.
Bunun için:
wget -r https://0a2600f603eed32781456b3d00030028.web-security-academy.net/.gitwget -r https://0a2600f603eed32781456b3d00030028.web-security-academy.net/.gitkomutunu çalıştırdım.
İşlem tamamlandıktan sonra elimizde sitenin Git geçmişi bulunuyordu.
Öncelikle commit geçmişine bakalım.
git loggit log
Bu komut bize yapılan commitleri gösterir.
Bu aşamada commitlerin içeriğini de görmek istiyoruz.
Bunun için:
git log -pgit log -pkomutunu kullandım.
Buradaki -p parametresi commitler arasındaki değişiklikleri göstermektedir.
Çıktıları incelerken aşağıdaki tarzda bir değişiklik dikkatimi çekti:
commit 28f88064a0ca31d5eed698282600295cea1575ae
Author: Carlos Montoya
Date: Tue Jun 23 14:05:07 2020 +0000
Remove admin password from config
-ADMIN_PASSWORD=lj443m2mmh5p2tlqvlsd
+ADMIN_PASSWORD=env('ADMIN_PASSWORD')commit 28f88064a0ca31d5eed698282600295cea1575ae
Author: Carlos Montoya
Date: Tue Jun 23 14:05:07 2020 +0000
Remove admin password from config
-ADMIN_PASSWORD=lj443m2mmh5p2tlqvlsd
+ADMIN_PASSWORD=env('ADMIN_PASSWORD')Burada geliştirici başlangıçta admin şifresini doğrudan kaynak kod içerisine yazmış.
Daha sonra bunun kötü bir uygulama olduğunu fark ederek ortam değişkenine taşımış.
Sorun şu:
Şifreyi koddan silmek Git geçmişinden de silindiği anlamına gelmez.
Git geçmişi eski sürümleri sakladığı için silinen satırları hâlâ görebiliyoruz.
Böylece admin şifresini elde etmiş olduk:
lj443m2mmh5p2tlqvlsdlj443m2mmh5p2tlqvlsdArtık elimizde kullanıcı adı ve şifre bulunuyor.
Kullanıcı adı:
administratoradministratorŞifre:
lj443m2mmh5p2tlqvlsdlj443m2mmh5p2tlqvlsd
Bu bilgilerle giriş yaptığımızda yönetici paneline erişebiliyoruz.
Yönetici panelinde kullanıcı yönetimi bölümüne gidiyoruz.
Burada carlos kullanıcısını bulup siliyoruz.
Kullanıcı silindiği anda lab başarıyla tamamlanıyor.
Bu Zafiyet Neden Oluşur?
Bu tür zafiyetler genellikle şu sebeplerden ortaya çıkar:
.gitklasörünün web sunucusunda erişime açık bırakılması- API anahtarlarının kaynak kodda tutulması
- Şifrelerin hardcoded olarak yazılması
- Hassas bilgilerin Git geçmişinden temizlenmemesi
Birçok geliştirici şifreyi koddan sildiğinde problemin çözüldüğünü düşünür.
Ancak Git geçmişi temizlenmediği sürece eski commitlerdeki bilgiler erişilebilir kalabilir.
Alınabilecek Önlemler
Bu tarz bir zafiyeti önlemek için:
.gitklasörü internete kapatılmalıdır.- Hassas bilgiler kaynak kod içerisinde tutulmamalıdır.
- Ortam değişkenleri kullanılmalıdır.
- Yanlışlıkla commit edilmiş gizli bilgiler Git geçmişinden tamamen temizlenmelidir.
- Düzenli olarak secret scanning yapılmalıdır.
Sonuç
Bu lab bize önemli bir gerçeği gösteriyor:
Uygulamanın mevcut hali güvenli görünse bile geçmiş sürümler büyük miktarda hassas bilgi barındırabilir.
Bir pentest sırasında .git, .svn, .hg gibi versiyon kontrol dizinlerini kontrol etmek oldukça değerlidir. Bazen tek bir açık dizin, admin şifresinden API anahtarlarına kadar kritik bilgilerin ortaya çıkmasına neden olabilir.
Bu labda da tam olarak bunu gördük. Erişime açık bırakılan .git dizini sayesinde Git geçmişini inceledik, silinmiş admin şifresini bulduk ve sistem üzerinde yönetici yetkisi elde ederek labı başarıyla tamamladık.
Bir sonraki labta görüşmek üzere 🌸