Skenario 25 / 26PASS

JWT Algorithm Confusion - Authentication - alg none

Lingkungan lab — bukan sistem produksi

Tangkapan layar dan trafik mentah tidak diterjemahkan; teks di dalamnya mungkin menggunakan bahasa lain.

vuln-bank/Evidence/[PASS] JWT Algorithm Confusion - Authentication - alg none

01 — Catatan

Catatan pengujian

Kerentanan

[PASS] JWT Algorithm Confusion - Authentication - alg none

Deskripsi

Pengujian berupaya melewati verifikasi tanda tangan JWT dengan mengubah header algoritma menjadi none dan mengosongkan bagian tanda tangan, sebuah teknik klasik untuk memalsukan token. Kode sumber mencantumkan none pada daftar algoritma yang diterima, sehingga endpoint ini diuji secara khusus.

Dampak

Tidak ada dampak. Kontrol bertahan: token dengan alg none ditolak pada seluruh endpoint yang diuji, baik endpoint pengguna biasa maupun panel administrasi, dengan HTTP 401. Pustaka JWT yang digunakan menolak algoritma none ketika kunci verifikasi diberikan, sehingga niat kode yang permisif tidak dapat dieksploitasi lewat jalur ini. Catatan: hal ini TIDAK berarti validasi token aman. Jalur pemalsuan lain berhasil dan dilaporkan terpisah pada temuan JWT Signature Not Verified, di mana token dengan tanda tangan salah tetap diterima.

CWE

CWE-347: Improper Verification of Cryptographic Signature

OWASP

A07:2021 - Identification and Authentication Failures

Skenario

Token sah didekode, header diubah menjadi alg none, klaim is_admin diubah menjadi true, lalu token dirangkai ulang tanpa tanda tangan. Token tersebut dikirim ke endpoint pengguna dan endpoint administrasi. Hasil: keduanya menolak dengan HTTP 401.

Endpoint

GET http://127.0.0.1:5001/dashboard GET http://127.0.0.1:5001/sup3r_s3cr3t_admin

Fitur terdampak

Validasi JWT (algoritma none)

Rekomendasi perbaikan

- Pertahankan penolakan algoritma none, dan hapus none dari daftar algoritma yang dikonfigurasi agar niat kode selaras dengan perilaku pustaka. - Kunci algoritma ke satu nilai yang diharapkan secara eksplisit.

Bukti konsep

1) (Screenshot 1) PROSES: token sah didekode, header diubah menjadi alg none dan klaim is_admin menjadi true, lalu dirangkai ulang tanpa tanda tangan. 2) (Screenshot 2) HASIL: token alg none dikirim ke /dashboard -> HTTP 401 Invalid token, kontrol bertahan. 3) (Screenshot 3) HASIL: token alg none dikirim ke /sup3r_s3cr3t_admin -> HTTP 401, kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] JWT Algorithm Confusion - Authentication - alg none

Description:
Pengujian berupaya melewati verifikasi tanda tangan JWT dengan mengubah header algoritma menjadi none dan mengosongkan bagian tanda tangan, sebuah teknik klasik untuk memalsukan token. Kode sumber mencantumkan none pada daftar algoritma yang diterima, sehingga endpoint ini diuji secara khusus.

Impact:
Tidak ada dampak. Kontrol bertahan: token dengan alg none ditolak pada seluruh endpoint yang diuji, baik endpoint pengguna biasa maupun panel administrasi, dengan HTTP 401. Pustaka JWT yang digunakan menolak algoritma none ketika kunci verifikasi diberikan, sehingga niat kode yang permisif tidak dapat dieksploitasi lewat jalur ini.

Catatan: hal ini TIDAK berarti validasi token aman. Jalur pemalsuan lain berhasil dan dilaporkan terpisah pada temuan JWT Signature Not Verified, di mana token dengan tanda tangan salah tetap diterima.

CWE:
CWE-347: Improper Verification of Cryptographic Signature

OWASP:
A07:2021 - Identification and Authentication Failures

Scenario:
Token sah didekode, header diubah menjadi alg none, klaim is_admin diubah menjadi true, lalu token dirangkai ulang tanpa tanda tangan. Token tersebut dikirim ke endpoint pengguna dan endpoint administrasi. Hasil: keduanya menolak dengan HTTP 401.

Endpoint:
GET http://127.0.0.1:5001/dashboard
GET http://127.0.0.1:5001/sup3r_s3cr3t_admin

Affected Feature:
Validasi JWT (algoritma none)

Remediation:
- Pertahankan penolakan algoritma none, dan hapus none dari daftar algoritma yang dikonfigurasi agar niat kode selaras dengan perilaku pustaka.
- Kunci algoritma ke satu nilai yang diharapkan secara eksplisit.

POC:
1) (Screenshot 1) PROSES: token sah didekode, header diubah menjadi alg none dan klaim is_admin menjadi true, lalu dirangkai ulang tanpa tanda tangan.
2) (Screenshot 2) HASIL: token alg none dikirim ke /dashboard -> HTTP 401 Invalid token, kontrol bertahan.
3) (Screenshot 3) HASIL: token alg none dikirim ke /sup3r_s3cr3t_admin -> HTTP 401, kontrol bertahan.

02 — Tangkapan layar

Tangkapan layar (2)

01 / 2
02 / 3

03 — Detail proses

Detail proses

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

PROSES 01 / 1
01 / Siapkan JWT alg:none

Siapkan JWT alg:none

Token yang direkam

[REDACTED-LAB-JWT]

Header yang diubah

{
  "typ": "JWT",
  "alg": "none"
}

Payload yang diubah

{
  "user_id": 1,
  "username": "admin",
  "is_admin": true,
  "iat": 1790736461
}

Token yang dienkode ulang (signature kosong)

[REDACTED-LAB-JWT]

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

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 / 2
HTTP request
GET /dashboard HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Authorization: Bearer [REDACTED-LAB-TOKEN]

HTTP response
HTTP/1.1 401 UNAUTHORIZED
Content-Type: application/json
Content-Length: 31
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:13:06 GMT

{
  "error": "Invalid token"
}
REKAMAN 02 / 3
HTTP request
GET /sup3r_s3cr3t_admin HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Authorization: Bearer [REDACTED-LAB-TOKEN]

HTTP response
HTTP/1.1 401 UNAUTHORIZED
Content-Type: application/json
Content-Length: 31
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:13:07 GMT

{
  "error": "Invalid token"
}