# Username Enumeration

### Username Enumeration Zafiyeti

* Username Enumeration zafiyeti, uygulamanın kullanıcı adı doğrulama işlemi sırasında, var olan ve olmayan kullanıcı adlarına farklı tepkiler vererek saldırganlara kullanıcı adlarını tahmin etme imkânı tanıdığı bir güvenlik açığıdır.
* Eğer rate-limit yoksa zafiyet daha etkili olur.
* E-posta veya username için zafiyet denenebilir.

### Olabileceği Alanlar

* Login isteği
* Register isteği
* Parola sıfırlama isteği
* API'ler
* Email onaylama

### Username Enumeration via Length

Eğer doğru ve yanlış kullanıcı adı girişlerinde farklı yanıtlar dönüyorsa kullanıcı adları listelenebilir. Bu bir zafiyettir.

```http
POST /login HTTP/2

username=john&password=pass123 -> Invalid username or password

POST /login HTTP/2

username=randomusername123123&password=pass123 -> Invalid username 
```

### Username Enumeration via Delay

Parolaya çok uzun bir değer girerek kullanıcı adlarını listelemeyi deneyebiliriz. Eğer bir yanıt diğerlerinden daha geç geliyorsa o kullanıcı adı var olabilir.

```http
POST /login HTTP/2

username=john&password=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-> 2000ms gecikme

POST /login HTTP/2

username=randomusername&password=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-> 20ms gecikme
```

### Username Enumeration via Lock

Eğer başarısız girişler sonucunda hesap kilitlendi yanıtı alıyorsak fakat var olmayan hesaplarda bu yanıtı almıyorsak bu yöntemle kullanıcıları listeleyebiliriz.

```http
LOGIN 1 john -> Invalid username or password
LOGIN 2 john -> Invalid username or password
LOGIN 3 john -> Invalid username or password
LOGIN 4 john -> Account is locked

LOGIN 1 randomuser -> Invalid username or password
LOGIN 2 randomuser -> Invalid username or password
LOGIN 3 randomuser -> Invalid username or password
LOGIN 4 randomuser -> Invalid username or password
```

### Kaynaklar

* [CWE-203: Observable Discrepancy](https://cwe.mitre.org/data/definitions/203.html)
