JSON Web Token
Pengertian JSON Web Token
Sebelum kita masuk lebih dalam ke arah JSON Web Token (JWT), kita perlu tahu terlebih dahulu apa itu JSON. JSON merupakan singkatan dari JavaScript Object Notation yang merupakan cara untuk menyimpan dan mengirim data. JSON biasanya digunakan untuk mengirimkan data dari server ke web page. Setelah kita memahami apa itu JSON, sekarang kita akan lanjut ke JWT. JSON Web Token atau yang lebih biasa dikenal dengan JWT, merupakan open standard (RFC 7519) yang digunakan untuk mengirimkan data secara compact dan secure sebagai objek JSON. JWT dapat dibilang secure karena JWT dapat diverifikasi dan ditandatangani secara digital dengan menggunakan algoritma HMAC (Hash-based Message Authentication Code) atau pasangan public/private key menggunakan RSA atau ECDSA.
JWT memiliki 3 bagian, yaitu header, payload, dan signature. Pada bagian header, biasanya terdapat 2 hal, yaitu tipe dari tokennya (JWT) dan algoritma yang digunakan (HMAC/RSA). Di bagian payload terdapat claim/statement mengenai entity (biasanya user) serta tambahan data lainnya, seperti issuer, expiration time, subject, audience, dan lain-lain. Bagian signature berisi header, payload, dan kode rahasia yang di-encode.
Cara Kerja JSON Web Token
Ketika user telah masuk ke dalam suatu web page/website, website akan memberikan JWT sebagai credentials user yang akan disimpan oleh user pada local storage atau cookies browser. Apabila user ingin masuk ke suatu halaman tertentu, user perlu menyertakan token tersebut (JWT) untuk dikonfirmasi oleh website, kemudian user akan dapat mengakses website yang diinginkan.
Exploit JSON Web Token
Setelah mengenal apa itu JWT dan cara kerjanya, ada baiknya kita tahu salah satu bentuk exploit pada JWT.
Di sini, saya mempunyai sebuah contoh web yang menggunakan JWT. Untuk melihat JWT pada sebuah web, kita bisa melakukan inspect element dengan cara klik kanan pada halaman web dan klik inspect element.
Kemudian, buka menu storage > cookies > buka alamat web yang aktif. Didapatkan nilai dari JWT tersebut.
Untuk mengambil nilai JWT tersebut, klik dua kali pada value dan copy. Kemudian kita masukkan nilai dari JWT tersebut kedalam web https://jwt.io/ untuk melihat JWT tersebut.
Dari gambar di atas dapat didapatkan hal sebagai berikut.
- keyID (kid) adalah RSA private key yang berada di localhost server pada port 7070.
- Username testJWT bukan admin (admin_cap = 0).
- Dibutuhkan public key dan private key untuk verifikasi signature.
Oleh sebab itu, kita perlu mengubah atau mengisi ketiga hal tersebut.
1. keyID
Pertama, kita ubah nilai keyID “http://localhost:7070/privKey.key” yang digunakan oleh web untuk validasi data menjadi mengarahkan ke server milik kita.
Untuk melakukannya, pertama, kita perlu membuat private dan public key, untuk membuat key tersebut kita perlu membuat private key nya terlebih dahulu. Buka terminal pada Linux dan arahkan pada direktori yang diinginkan (Harap untuk mengingat direktori yang digunakan). Untuk membuat private key, saya akan menggunakan command
“openssl genrsa -out rsa.private 1024”
Setelah menjalankan command di atas, didapatkan sebuah file bernama rsa.public yang berisi public key. Apabila tidak memiliki openssl, kalian bisa mengunjungi web berikut “https://installlion.com/kali/kali/main/o/openssl/install/index.html”
Setelah berhasil membuat private dan public key, sekarang kita buat server HTTP sederhana menggunakan python untuk menerima request dari JWT. Untuk membuatnya, buka terminal baru dan arahkan pada direktori yang sama dengan private key yang telah dibuat sebelumnya dan jalankan command
“sudo python -m SimpleHTTPServer 8080”
Command diatas akan membuat sebuah server http sederhana di mesin kita dengan port 8080. Apabila belum memilikinya simpleHTTPServer, kali bisa kunjungi web berikut “https://pypi.org/project/simple-http-server/” (Jangan tutup terminal karena web server akan tertutup juga)
Kemudian, kita buka sebuah terminal baru untuk melihat IP mesin kita dengan perintah
“ifconfig”
Didapatkan ip mesin kita.
Kemudian, kita ubah nilai dari “http://localhost:7070/privKey.key” menjadi “http://10.10.16.6:8080/rsa.private“
- 10.10.16.6 adalah ip mesin kita
- 8080 adalah port pada mesin kita yang sudah terdapat serverHTTP sederhana
rsa.private adalah file private key yang akan direquest oleh web kepada mesin kita untuk validasi user.2. Admin
Untuk admin, kita cukup merubah nilai admin_cap dari 0 menjadi 1.
3. Key
Untuk verifikasi signature, kita cukup masukkan nilai dari rsa.private dan rsa.public yang telah kita buat sebelumnya kedalam kotak nya masing-masing
Setelah berhasil membuat JWT yang baru, kita ganti nilai JWT yang asli pada web dengan JWT milik kita sendiri.
Setelah berhasil merubah nilai dari JWT tersebut, refresh atau tekan F5 dan tunggu sesaat. Sekarang, user berhasil menjadi admin.
JWT exploit berhasil.
Referensi:
http://lunar.lyris.com/help/lm_help//11.3/Content/generating_public_and_private_keys.html