OverTheWire Natas wargame, web güvenliğinde sık karşılaşılan zafiyetleri pratik yaparak öğrenmeyi amaçlayan bir platformdur.

http://natas4.natas.labs.overthewire.org/index.php

username→ natas4

password→QryZXc2e0zahULdHrtHxzyYkj59kUxLQ

Görev Özeti

None

Natas Level 4'te, sayfaya erişim HTTP Referer header'ına göre sınırlandırılmıştır.

Sunucu, isteğin belirli bir sayfadan (natas5) gelip gelmediğini kontrol eder.

Eğer Referer header yoksa ya da beklenen değeri taşımıyorsa erişim engellenir.

Bu yaklaşım, kullanıcı tarafından kontrol edilebilen bir header'a güvenmek anlamına gelir.

Zafiyet Türü

  • Broken Access Control
  • Client-side trust
  • HTTP header'lara güvenme

Referer header, bir HTTP isteğinin hangi sayfadan geldiğini sunucuya söyleyen bilgidir.

Tarayıcılar bunu otomatik ekler ama tamamen istemci kontrolündedir.

HTTP isteğinde şu şekilde görünür:

Referer: https://example.com/onceki-sayfa

Anlamı:

"Kullanıcı bu isteği buradan geldi."

Genellikle bir linke tıklanınca, bir form gönderilince, bir sayfadan başka bir sayfaya geçilince eklenir.

Örnek:

Google → example.com

GET / HTTP/1.1 Host: example.com Referer: https://www.google.com/

Asıl amaçları:

  • Analitik
  • CSRF için ek sinyal
  • Basit istatistikler
  • Reklam / yönlendirme takibi

Ama güvenilmezdir çünkü kullanıcı değiştirebilir, tarayıcı hiç göndermeyebilir. Ayrıca curl, Burp, Postman ile kolayca spoof edilir

Çözüm

Tarayıcı yerine manuel HTTP isteği oluşturup, sunucunun beklediği Referer header'ını kendimiz ekleyerek bu kontrolü aşabiliriz.

None

Gönderdiğimiz GET isteği 401 Unauthorized olarak dönüyor. Bu isteğe "Referer" ekleyip bu kontrolü aşacağız. Burp Suite Repeater ya curl komutunu kullanabiliriz.

BURP SUITE

GET isteğini repeatera gönderiyoruz. Burada Referer satırı ekleyip referansı http://natas5.natas.labs.overthewire.org/ olarak gösteriyoruz. Referer ekledikten sonra Authorization eklemek gerekir. Bu alan username:password kombinasyonun base64 ile şifrelenmiş halini tutar. Yani kimlik doğrulama yapılır. Yukarıda bahsettiğim gibi;

username=natas4

password=QryZXc2e0zahULdHrtHxzyYkj59kUxLQ

Terminalde şu komutu çalıştırarak base64 çıktısını elde ediyoruz.

echo -n "natas4:QryZXc2e0zahULdHrtHxzyYkj59kUxLQ" | base64 →bmF0YXM0OlFyeVpYYzJlMHphaFVMZEhydEh4enlZa2o1OWtVeExR

Bunu Authorization alanına yazacağız.

None

Bu isteği sunucuya gönderiyoruz. Dönen cevap 200 OK ile döner ve natas5 için gerekli şifre mesajın içindedir.

None

curl ile istek gönderme

curl -u natas4:QryZXc2e0zahULdHrtHxzyYkj59kUxLQ\\
  -H "Referer: <http://natas5.natas.labs.overthewire.org/>" \\
  <http://natas4.natas.labs.overthewire.org/>

ŞİFRE kısmına Natas 3'ten aldığınız şifre yazılmalıdır.

Sunucu, Natas Level 5 için gerekli olan şifreyi döndürür.

Bu da erişim kontrolünün başarıyla aşıldığını gösterir.

Çıkarımlar

  • HTTP Referer gibi header'lar güvenlik amacıyla kullanılmamalıdır
  • Header'lar kullanıcı tarafından kolayca manipüle edilebilir
  • Authentication tek başına yeterli değildir, authorization şarttır
  • Referer header ile yetkilendirme yapılmamalıdır
  • Tüm erişim kontrolleri server-side yapılmalıdır
  • Session ve rol bazlı erişim kontrolü uygulanmalıdır

OKUDUĞUNUZ İÇİN TEŞEKKÜR EDERİM