Skenario 20 / 26FAIL
Unrestricted Resource Consumption - Authentication - Login Rate Limiting
Lingkungan lab — bukan sistem produksi
Tangkapan layar dan trafik mentah tidak diterjemahkan; teks di dalamnya mungkin menggunakan bahasa lain.
vuln-bank/Evidence/[FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting
01 — Catatan
Catatan pengujian
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
1) (Screenshot 1) NORMAL: satu percobaan login dengan password salah -> HTTP 401 Invalid credentials.
2) (Screenshot 2) EKSPLOITASI: 50 percobaan gagal berturut-turut terhadap akun admin -> seluruhnya HTTP 401, tidak ada HTTP 429 maupun penguncian.
3) (Screenshot 3) DAMPAK CIA: setelah 50 kegagalan, login dengan password yang benar tetap diterima -> akun tidak pernah terkunci, brute force dapat dijalankan hingga berhasil.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Unrestricted Resource Consumption - Authentication - Login Rate Limiting
Description:
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.
Impact:
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
Scenario:
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
Affected Feature:
Autentikasi pengguna
Remediation:
- 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.
POC:
1) (Screenshot 1) NORMAL: satu percobaan login dengan password salah -> HTTP 401 Invalid credentials.
2) (Screenshot 2) EKSPLOITASI: 50 percobaan gagal berturut-turut terhadap akun admin -> seluruhnya HTTP 401, tidak ada HTTP 429 maupun penguncian.
3) (Screenshot 3) DAMPAK CIA: setelah 50 kegagalan, login dengan password yang benar tetap diterima -> akun tidak pernah terkunci, brute force dapat dijalankan hingga berhasil.
02 — Tangkapan layar
Tangkapan layar (2)
03 — Detail proses
Detail proses
Nilai kredensial disamarkan dalam tampilan HTML ini; keterangan tentang token lengkap merujuk pada rekaman sumber.
PROSES 01 / 2
Uji rate limit login
Percobaan login gagal berturut-turut untuk pengguna '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 40104 — Request dan response
Rekaman HTTP
Sebagian nilai kredensial disamarkan pada tampilan HTML publik ini. Penyamaran ini tidak menjamin bahwa seluruh data sensitif atau berkas tertaut sudah disamarkan.
REKAMAN 01 / 1
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/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"
}REKAMAN 02 / 3
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/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]"
}