Hoşgeldin Misafir

Broken Access Control

CodesTormer

12 Ara 2024
98 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Broken Access Control, siber güvenlikte en sık karşılaşılan ama aynı zamanda en tehlikeli zafiyetlerden biri. Kısaca, bir kullanıcının erişmemesi gereken bir kaynağa, yetkisiz bir şekilde ulaşabilmesi durumu. Yani sistemde birileri “sen bu sayfaya bakamazsın” demeyi unutmuş ya da yanlış demişse, işte orada Broken Access Control var demektir. Mesela bir e-ticaret sitesinde normal bir kullanıcı, sadece kendi siparişlerini görebilmeli ama URL'deki /orders/1234 gibi bir ID'yi değiştirerek başkasının sipariş bilgilerine ulaşabiliyorsa, burada açık var. Basit bir Python Flask örneğiyle anlatayım:

Python:
@app.route('/profile/<int:user_id>')
def profile(user_id):
    user = User.query.get(user_id)
    return render_template('profile.html', user=user)


Buradaki sorun şu: Sisteme login olan herhangi biri, URL’deki user_id'yi değiştirerek başka bir kullanıcının profiline erişebiliyor. Çünkü sistem, bu kullanıcı gerçekten bu profile bakma hakkına sahip mi diye kontrol etmiyor. Çözüm mü? Erişim kontrolü eklemek. Örneğin:

Python:
@app.route('/profile/<int:user_id>')
@login_required
def profile(user_id):
    if current_user.id != user_id and not current_user.is_admin:
        abort(403)
    user = User.query.get(user_id)
    return render_template('profile.html', user=user)

Burada artık sadece kullanıcı kendi profiline (veya adminse başkalarınınkine) bakabiliyor. Gerçek hayatta bu kontrolleri her endpoint için unutmamak çok kritik. Özellikle client-side'da yapılan kontroller hiçbir zaman yeterli değildir çünkü kullanıcı tarayıcıda her şeyi manipüle edebilir. Erişim yetkileri her zaman server-side kontrol edilmelidir. OWASP Top 10’da ilk sıralarda yer almasının nedeni de bu zaten; yaygın, ciddi ve genellikle fark edilmesi zor. Geliştirici olarak “Benim sitemde kim neyi görmeli?” sorusunu her endpoint için tekrar tekrar kendine sormazsan, bu açık seni çok kötü yakalar. :)


Tespit Aşaması:

Peki bir sistemde Broken Access Control olup olmadığını nasıl tespit ederiz? İşte işin en keyifli kısmı burada başlıyor çünkü burada biraz “etik hacker” gibi düşünmemiz gerekiyor. İlk adım genellikle yetkili ve yetkisiz kullanıcıların rollerini anlamakla başlar. Sisteme giriş yaptıktan sonra, erişebildiğin URL'leri, butonları, API endpoint'lerini bir not alırsın. Sonra bu kullanıcı rolü dışında erişilmemesi gereken kaynaklara bilinçli olarak erişmeye çalışırsın. Mesela normal bir kullanıcı olarak login ol, sonra tarayıcının geliştirici araçlarını (F12) aç, bir admin panelinin endpoint’ini tahmin et: /admin, /admin/dashboard, veya /admin/users. Bu sayfalara ulaşabiliyor musun? Eğer evet, geçmiş olsun.


Daha teknik bir yöntem olarak, burp suite gibi bir proxy aracı kullanabilirsin. Burp ile giden HTTP isteklerini yakalayıp üzerinde oynama yapabilirsin. Örneğin bir POST isteğinde user_id=5 olan bir parametre varsa, bunu user_id=1 yapıp tekrar göndermek, başkasının verisine ulaşıp ulaşamadığını test etmek için harika bir yöntemdir. Eğer sistem yeterli kontrol yapmıyorsa, işlem gerçekleşir ve açık tespit edilmiş olur.


Bir başka teknik de, session hijacking ya da cookie manipülasyonu denemeleridir. Mesela sistem JWT token kullanıyorsa ve bu token’ı decode ettiğinde içinde role: user yazıyorsa, bunu role: admin yapıp yeniden encode edip gönderdiğinde sistem seni admin gibi görüyorsa... işte sana kraldan çok kral bir Broken Access Control!


Ayrıca otomatik tarayıcılar da burada işe yarar. OWASP ZAP, BurpSuite'in Active Scan özelliği veya Nikto gibi araçlar belirli zafiyet türlerini otomatik olarak tarayıp seni uyarabilir. Ancak unutma, bu araçlar her şeyi yakalayamaz, çünkü çoğu zaman zafiyetler mantıksal hatalarla ilgilidir. Yani bir endpoint doğru yapılsa bile, yanlış kullanıcıya açık bırakılmış olabilir.


Son olarak loglara bakmayı unutma. Bir kullanıcı sürekli farklı user_id'ler ile veri çekmeye çalışıyorsa, şüphelenmelisin. Log analizi, özellikle büyük sistemlerde bu tarz zafiyetleri tespit etmek için altın değerdedir.
 

BurocK

10 Ocak 2018
474 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Kod:
$token = $_GET['token'];

Token sistemi ile bu sorunu aşabilirsiniz. Makalede incelediğim yönetimi de kullanarak random id denemesi yaparak sistem açıkları oluşmasının önüne geçmiş olursunuz. Paylaşım için teşekkür ederim.