Kembali ke indeks

LAB FAIL

Unrestricted Resource Consumption - Authentication - Login Rate Limiting

Unrestricted Resource Consumption — Authentication — Login Rate Limiting

CWE-307: Improper Restriction of Excessive Authentication Attempts · OWASP A07:2021 - Identification and Authentication Failures

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.

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"
}
Tangkapan layar

Uji rate limit login

  1. 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
Tangkapan layar
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]"
}
Tangkapan layar

← Kasus sebelumnya: Unrestricted File Upload - Profile Picture - File Type Validation Kasus berikutnya: Unrestricted Resource Consumption - Password Reset - PIN Rate Limiting →