Kerentanan
[FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting
Deskripsi
Endpoint /login tidak menerapkan rate limiting, penguncian akun, perlambatan progresif, maupun CAPTCHA. Percobaan login yang gagal secara beruntun seluruhnya dilayani dengan kecepatan penuh. Respons gagal juga membedakan kondisi sehingga memudahkan enumerasi username.
Dampak
Confidentiality (Medium): penyerang dapat melakukan brute force dan credential stuffing terhadap akun mana pun, termasuk administrator, tanpa hambatan. Lima puluh percobaan berturut-turut terhadap akun admin tidak memicu penguncian maupun perlambatan, dan setelah seluruh percobaan gagal tersebut login dengan kredensial yang benar tetap diterima, membuktikan tidak ada mekanisme penguncian sama sekali.
CWE
CWE-307: Improper Restriction of Excessive Authentication Attempts
OWASP
A07:2021 - Identification and Authentication Failures
Skenario
Normal: satu percobaan login dengan password salah ditolak dengan HTTP 401. Eksploitasi: lima puluh percobaan berturut-turut terhadap akun admin dikirim tanpa jeda -> seluruhnya dilayani HTTP 401, tidak ada HTTP 429 maupun penguncian. Dampak: setelah 50 kegagalan, login dengan password yang benar tetap berhasil, menunjukkan akun tidak pernah terkunci sehingga brute force dapat dijalankan sampai tuntas.
Endpoint
POST http://127.0.0.1:5001/login
Fitur terdampak
Autentikasi pengguna
Rekomendasi perbaikan
- Terapkan rate limiting per akun dan per IP dengan perlambatan progresif.
- Kunci akun sementara atau wajibkan CAPTCHA setelah sejumlah kegagalan berturut-turut.
- Seragamkan pesan galat agar tidak membocorkan keberadaan username.
- Catat dan beri peringatan atas lonjakan kegagalan autentikasi, serta terapkan MFA.
Bukti konsep
- (Screenshot 1) NORMAL: satu percobaan login dengan password salah -> HTTP 401 Invalid credentials.
- (Screenshot 2) EKSPLOITASI: 50 percobaan gagal berturut-turut terhadap akun admin -> seluruhnya HTTP 401, tidak ada HTTP 429 maupun penguncian.
- (Screenshot 3) DAMPAK CIA: setelah 50 kegagalan, login dengan password yang benar tetap diterima -> akun tidak pernah terkunci, brute force dapat dijalankan hingga berhasil.
Rekaman lengkap
LAB Semua target adalah sistem lab. Tidak ada satu pun yang merupakan pekerjaan klien. Bukti ditampilkan apa adanya; secret dihitamkan.
HTTP request
POST /login HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Content-Length: 53
Content-Type: application/json
{"username": "admin", "password": "[REDACTED-LAB-VALUE]"}
HTTP response
HTTP/1.1 401 UNAUTHORIZED
Content-Type: application/json
Content-Length: 162
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:12:54 GMT
{
"debug_info": {
"attempted_username": "admin",
"time": "2026-09-30 03:12:54.415082"
},
"message": "Invalid credentials",
"status": "error"
}
Uji rate limit login
- Consecutive failed logins for user 'admin' attempt 1 -> HTTP 401
attempt 2 -> HTTP 401
attempt 3 -> HTTP 401
attempt 4 -> HTTP 401
attempt 5 -> HTTP 401
...
attempt 46 -> HTTP 401
attempt 47 -> HTTP 401
attempt 48 -> HTTP 401
attempt 49 -> HTTP 401
attempt 50 -> HTTP 401
HTTP request
POST /login HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Content-Length: 45
Content-Type: application/json
{"username": "admin", "password": "[REDACTED-LAB-VALUE]"}
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 470
Set-Cookie: token=[REDACTED-LAB-TOKEN]; HttpOnly; Path=/
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:12:56 GMT
{
"accountNumber": "ADMIN001",
"debug_info": {
"account_number": "ADMIN001",
"is_admin": true,
"login_time": "2026-09-30 03:12:56.612726",
"user_id": 1,
"username": "admin"
},
"isAdmin": true,
"message": "Login successful",
"status": "success",
"token": "[REDACTED-LAB-VALUE]"
}
← Kasus sebelumnya: Unrestricted File Upload - Profile Picture - File Type Validation Kasus berikutnya: Unrestricted Resource Consumption - Password Reset - PIN Rate Limiting →