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
- (Screenshot 1) PROSES: token sah didekode, header diubah menjadi alg none dan klaim is_admin menjadi true, lalu dirangkai ulang tanpa tanda tangan.
- (Screenshot 2) HASIL: token alg none dikirim ke /dashboard -> HTTP 401 Invalid token, kontrol bertahan.
- (Screenshot 3) HASIL: token alg none dikirim ke /sup3r_s3cr3t_admin -> HTTP 401, kontrol bertahan.
Rekaman lengkap
LAB Semua target adalah sistem lab. Tidak ada satu pun yang merupakan pekerjaan klien. Bukti ditampilkan apa adanya; secret dihitamkan.
Siapkan JWT alg:none
- Captured token [REDACTED-LAB-TOKEN]
- Modified header {
"typ": "JWT",
"alg": "none"
}
- Modified payload {
"user_id": 1,
"username": "admin",
"is_admin": true,
"iat": 1790736461
}
- Re-encoded token (empty signature) [REDACTED-LAB-TOKEN]
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"
}
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"
}
← Kasus sebelumnya: Insufficient Session Expiration - Authentication - JWT Lifetime Kasus berikutnya: JWT Signature Not Verified - Authentication - Token Validation →