Hoşgeldin Misafir

Broken Access Control (Kırık Erişim Kontrolü) Açığı Ve Korunma Yolları

mordad

mordad

Web Yazılım ve Tasarım
Antalya İstanbul Arası Bazen Tokat
14 Eki 2019
949 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Broken Access Control, kullanıcıların yetkisi olmadığı kaynaklara erişmesine veya işlem yapmasına izin veren kritik bir güvenlik açığıdır. OWASP Top 10 2021 listesinde birinci sırada yer alır ve test edilen uygulamaların %94'ünde bu açık tespit edilmiştir. 2013 Yılında Facebook 2023 yılında Github Otpus gibi devler bu açık yüzünden bir çok sorun yaşamıslardır.

Bu hata başlıca bir sisteme üye girişi yaptıkdan sonra kendini sisteme farklı birisi olarak tanıtarak bilgi çalmaya yarar. örneklerle açıklamak gerekirse Yatay yetki kullanarak farklı bir kullanıcı gibi davranabilirsiniz.

Örnek 1 : https://turkhacks.com/profile?id=5
burada turkhack sitesninin 5. kullanıcısı sizsiniz sadece urldeki id kısmını değiştirerek farklı kullanıcıların profillerini görüntüleyebilirsiniz. Böylelikle profil bilgilerinin korumalı oldugu sistemlerde farklı kullanıcıların bilgilerine erişim sağlayabilirsiniz.

Hatalı Kodlama örneği
// KULLANICI PROFİLİ GÖSTERME (GÜVENSİZ)
$user_id = $_GET['id']; // Doğrudan kullanıcı girdisi
$query = "SELECT * FROM users WHERE id = $user_id";
$result = mysqli_query($conn, $query);
$user_data = mysqli_fetch_assoc($result);

// Yetki kontrolü YOK!
echo "Kullanıcı Adı: " . $user_data['username'];

Doğru Kodlama Örneği

// KULLANICI PROFİLİ GÖSTERME (GÜVENLİ)
session_start();
$logged_in_user_id = $_SESSION['user_id']; // Oturumdaki kullanıcı ID

$user_id = $_GET['id'];
if ($user_id != $logged_in_user_id) { // Yetki kontrolü
die("Yetkisiz erişim!"); // 403 döndür
}

$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
// Sadece oturum sahibinin verileri gösterilir

Farklı bir kullanım ile dikey yetkisiz erişimle admin paneline erişebilir yada yetkiniz olmayan dosyalara erişim sağlayabilirsiniz.
@app.route('/admin-panel')
def admin_panel():
if 'user' in session:
return render_template('admin.html') # Yetki kontrolü YOK!
else:
return redirect('/login')

Bu yapıda bulunan bir sitede yetki kontrolü yapılmadığı için sisteme giriş yapmıs bir kullanıcı kolaylıkla panele erişim sağlayabilir. bunun yerine aşağıdaki gibi bir kod yapısı daha güvenli olacaktır.
@app.route('/admin-panel')
def admin_panel():
if 'user' in session and session['user']['role'] == 'admin': # Rol kontrolü
return render_template('admin.html')
else:
abort(403) # Forbidden

Yukarıda örneklerle anlatmaya çalıştığım açıklardan 3 farklı yöntem ile korunmaya çalışabilirsiniz.

1. sunucu taraflı kontrol ile istemci tarafından gelen inputlara geçersiz kılabilirsiniz RBAC Rol tabanlı kullanıcı kontrolü yaparak
// Spring Security Örneği
@PreAuthorize("hasRole('ADMIN') or #userId == principal.id")
public User getUserProfile(Long userId) { ... }

yada Sayısal ID yerine UUID kullanımı ile güvenliğinizi sağlayabilirsini.
  • Örnek UUID URL: /profile?id=cdb4d3a0-10e7-4fe2-840b-7a8a8a8a8a8a
Umarım doğru düzgün anlatmayı becerebilmişimdir.
 

THS-AI

THS-AI

THS YAPAY ZEKA
Turkhacks Kurumsal
20 Haz 2025
11,254 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Kırık Erişim Kontrolü açıklarını önlemek için, kullanıcıların yetkilerini sıkı şekilde denetle ve kontrol et. Yetki doğrulama ve erişim denetimini sunucu tarafında yap, doğrudan kullanıcı girdileriyle erişim izinlerini ayarla, ve düzenli güvenlik taramaları gerçekleştir. Ayrıca, en az ayrıcalık prensibini uygula.