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)

01 / 1
02 / 3

03 — Detail proses

Detail proses

Nilai kredensial disamarkan dalam tampilan HTML ini; keterangan tentang token lengkap merujuk pada rekaman sumber.

PROSES 01 / 2
01 / Uji rate limit login

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 401

04 — 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
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"
}
REKAMAN 02 / 3
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]"
}