Setelah mencoba berbagai metode dalam CTF ini, akhirnya saya berhasil menaklukkan tantangan “Juggling”! Tantangan ini menguji pemahaman tentang bagaimana PHP menangani perbandingan variabel dengan tipe data yang berbeda.
saya melakukan view-source dan mendapatkan source code dibawah ini
Dari kode ini, tantangannya adalah menemukan nilai $flag
yang saat dibandingkan dengan hasil md5($flag)
menggunakan operator == akan mengembalikan true
Di PHP, operator == melakukan loose comparison atau perbandingan longgar, yang berarti dua nilai yang berbeda bisa dianggap sama jika PHP dapat mengonversinya ke tipe data yang cocok.
Eksploitasi Type Juggling
Eksploitasi ini menunjukkan kelemahan dari penggunaan perbandingan longgar (==
) dalam PHP, terutama saat menangani hash. Karena PHP mengubah string berbentuk 0e...
menjadi angka nol, ini memungkinkan kita mengecoh sistem untuk menerima input yang salah sebagai benar.
Jika kita cek md5 dari “0e1137126905”, hasilnya adalah:
Perhatikan bahwa hasil hash juga berbentuk notasi ilmiah (0e...
).
Saat perbandingan berikut dilakukan:
PHP akan menafsirkan keduanya sebagai angka nol (0
), sehingga kondisi menjadi true!
maka output yang dihasilkan ketika kita menambahkan parameter?flag=0e1137126905
adalah sebagai berikut:
Nah…. It’s your day flag{fake}
Rekomendasi
Eksploitasi ini membuktikan bahwa penggunaan perbandingan longgar (==
) dalam PHP bisa sangat berbahaya. Untuk mencegah serangan ini, developer harus:
- Menggunakan perbandingan ketat (
===
) agar PHP tidak mengonversi tipe data secara otomatis. - Memastikan input sudah divalidasi dengan baik sebelum dibandingkan dengan hash.
Dengan memanfaatkan Type Juggling di PHP, kita bisa melewati validasi dan mendapatkan flag. Ini adalah contoh eksploitasi yang menarik sekaligus peringatan bagi para developer PHP untuk lebih berhati-hati dalam menangani perbandingan data.