Langsung saja kita masuk ke penjelasan awal yaitu Apa itu JWT (JSON Web Token).
Apa itu JWT (JSON Web Token)
JWT (JSON Web Token) merupakan jenis token yang menggunakan format JSON (JavaScript Object Notation) dalam bentuk string panjang yang dibuat secara acak.
Jadi, saat pengguna berhasil melakukan login, server akan memberikan token kepada mereka. Token tersebut kemudian disimpan oleh pengguna di dalam Local Storage atau Cookies Browser. Selanjutnya, saat pengguna ingin mengakses halaman tertentu, mereka harus menyertakan token tersebut sebagai bagian dari permintaan. Ini memungkinkan server untuk mengidentifikasi bahwa pengguna telah melakukan login dan memberikan akses yang sesuai kepada mereka.
Struktur JWT (JSON Web Token)
Jika kita perhatikan dalam teks acak di atas, terdapat titik yang memisahkan teks tersebut menjadi 3 bagian:
- Header (teks merah)
Header biasanya terdiri dari dua bagian: jenis token, yaitu JWT, dan algoritma penandatanganan yang digunakan, seperti HMAC SHA256 atau RSA.
Contoh :{
"alg": "HS256",
"typ": "JWT"
} - Payload (teks ungu)
Dalam penerapannya, biasanya data ini berupa data yang sifatnya unik bagi user, seperti: email, id/uuid, dan juga data yang berkaitan dengan otorisasi seperti role, karena data tersebut akan digunakan sebagai tanda pengenal si pengirim token.
Contoh:{
"sub": "1234567222",
"name": "Rhymeus",
"role": "User"
} - Signature (teks biru)
Adalah hasil dari Hash atau gabungan dari isi encode Header dan Payloadnya lalu ditambahkan kode secretnya. Signature ini berguna untuk memverifikasi bahwa header maupun payload yang ada dalam token tidak berubah dari nilai aslinya.
Signature ini tidak mungkin dapat diakali, karena sudah dalam berbentuk hash; yang mana adalah fungsi satu arah (tidak dapat dikembalikan ke nilai semula).
Affected Target
Target kali ini adalah mobile aplikasi pada private program, dan meskipun saya tidak bisa menyebutkan nama target-nya, yang ter-penting kita dapat mengerti alur dari writeups/temuan ini. Kita sebut target aplikasi nya sebagai 'redacted'. Untuk tema dari target ini yaitu “Layanan dan Informasi Kesehatan”.
Dampak Kerentanan
Penyerang yang berhasil melakukan Bypass JWT Authentication dapat mendapatkan akses tidak sah ke informasi dan data yang sangat penting dalam Admin Panel. Ini mencakup data pengguna, atau informasi rahasia lainnya yang dapat disalahgunakan, serta penyerang dapat melakukan perubahan pada data tersebut.
Proof of Concept!
Tools:
- Burp Suite
- jwt.io
Langkah-langkah:
- Buka aplikasi redacted dan lakukan register kemudian login ke akun yang telah dibuat. terdapat link API dari aplikasi tersebut yaitu api.redacted.id
- Lalu saya membuka API tersebut ke path paling awal yaitu http://api.redacted.id/v1/ pada endpoint ini terdapat url menuju swagger seperti di screenshoot:
pada swagger ini kita dapat melihat semua endpoint yang dapat dilakukan siapapun entah itu user maupun admin. - Setelah itu login ke akun yang baru dibuat dan terdapat header authentication yang memiliki tipe JWT atau JSON Web Token, semacam sesi yang di buat untuk kita melakukan login contoh JWT yang terdapat pada header seperti ini:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDk3MTEzOTQsImlhdCI MTcwNzExOTM5NCwiaXNzIjoiNTg3MDk0YzUtYmU0Yi00MmE2LWIxZjYtZjJh GFiNjk3OTBmIiwic3ViIjoiYWNjZXNzX3Rva2VuIiwidXNlciI6eyJpZCI6IjU4NzA5N GM1LWJlNGItNDJhNi1iMWY2LWYyYTBhYjY5NzkwZiIsIm5hbWUiOiJyaHltZXV zc3MiLCJuaWsiOiIiLCJyb2xlX25hbWUiOiJVc2VyIn19.h96PW_n2AwnkzoaiEVjLnC wfEsacbWCjP5P3iw_LpW4
- Kemudian saya melakukan pengecek-an JWT Token nya melalui web jwt.io terdapat role_name atau informasi nama role pada user tersebut. Dan disini saya ubah role_name nya dari User ke Admin dan saya copy JWT yang telah di ubah role_name nya
- Kemudian setelah mengubah JWT nya saya membuka lagi swagger nya untuk melihat apa saja endpoint yang hanya bisa dilakukan oleh admin, dan disini saya mendapatkan endpoint ini: http://api.redacted.id/v1/license/strttk/list . Awal nya saya testing menggunakan JWT yang belum di rubah role_name nya seperti pada gambar dibawah terdapat informasi error yang menyatakan role yang di gunakan salah.
- Kemudian saya ubah JWT nya, saya mengubah role_name dari User ke Admin seperti sebelum nya dan admin berhasil di bypass menggunakan JWT seperti pada gambar dibawah.Sebenarnya masih banyak fitur admin yang dapat saya lakukan karena sudah tau semua endpoint nya, contoh nya seperti melakukan perubahan dan penghapusan data, tetapi tidak saya eksploitasi lebih lanjut dikarenakan tidak etis.
Referensi
- https://www.codepolitan.com/blog/kenalan-yuk-dengan-json-web-token-jwt/
- https://infosecwriteups.com/bypass-jwt-authentication-access-admin-panel-73b8d73a0f1
- https://dev.to/itsfaqih/apa-itu-jwt-json-web-token-28g6
Timeline
- Report: 06 Februari 2025
- Triage: Confidential
- Status: Confidential
- Reward: Confidential
Demikian writeup yang saya buat untuk kesempatan ini. Saya berharap writeup ini dapat memberikan manfaat dan motivasi bagi teman-teman bug hunter yang juga bekerja keras dalam mencari dan melaporkan bug pada sebuah sistem. Jika ada kekurangan atau kesalahan, saya sangat mengharapkan masukan dan kritik dari teman-teman bug hunter lainnya agar tulisan ini dapat lebih baik kedepannya.