[Cyber Jawara 2019 Qualification] – Heejin

Diberikan sebuah web beserta source code.

Link source code: https://drive.google.com/open?id=1cJPV4_bjRzMO_woqrx6_2vHp7UFsXzAY

Berikut adalah source codenya (hanya diambil bagian modul fungsionalitas website saja):

Web ini sebenarnya cukup sederhana, yang kita bisa lakukan adalah:

  • Register
  • Login
  • Akan mendapatkan sebuah akun dengan jumlah uang Rp 100.000

Lalu untuk mendapatkan flag, kita tidak bisa semena-mena klik ke “Flag” karena untuk produk yang kita mau dapatkan flagnya, kita harus membeli produk tersebut terlebih dahulu.

Sekarang, untuk goal kita mendapatkan flag, akun yang kita miliki harus memiliki minimal uang Rp 13.371.337. Tapi bagaimana kita bisa mau mendapatkan flag? Sedangkan yang kita dapat saat register hanyalah Rp 100.000.

Disini, saat proses pengerjaan soal kualifikasi lalu, penulis lupa memeriksa bagian user.go yang mengakibatkan penulis menulis beberapa informasi kecil sebagai asumsi pada writeup yang dikumpulkan ke panitia.

Untuk bagaimana caranya kita mendapatkan flag, awal penulis memeriksa source code untuk kelemahan sebagai berikut:

  • JWT
  • SQL Injection

Struggle penulis berlanjut sampai di satu titik penulis mendapatkan sebuah pencerahan tapi dengan cara yang menurut penulis terbilang aneh 😀 .Penulis teringat pada soal dari Harekaze CTF 2019 soal Encode and Encode yang berhubungan dengan JSON decode di PHP. Untuk alasan aneh soal itu memberikan pencerahan sehingga penulis bisa solve soal ini sebelum waktu kualifikasi selesai lel.

Mari kita lihat kembali di source bagian register.go.

Pada fungsi ini, program akan melakukan proses decode pada semua value pada JSON (source) yang disubmit. Lalu memeriksa apakah di titik tertentu ada error atau tidak jika iya maka proses registrasi akan gagal.

Lalu apa yang dapat dilakukan dengan informasi ini? Untuk lebih lanjutnya lebih baik dilihat langsung proses request dengan menggunakan burpsuite.

Jika dilihat, saat akan melakukan registrasi, user akan mengirimkan request dalam bentuk JSON dengan 2 parameter yakni username dan password. Lalu untuk JSON ini yang nantinya akan di decode oleh API secara mentah-mentah dan dari sana akan dimasukkan sebagai parameter untuk insert ke dalam database. Lalu apa?

Setelah melihat source secara penuh, penulis menemukan titik menarik di dalam user.go.

Pada barisan code diatas, sebenarnya jika user tidak menentukan jumlah uang yang ingin dimasukkan ke dalam database, secara otomatis akan dimasukkan angka “100000” sesuai dengan yang di default.

Maka dari itu, bagaimana jika saat proses registrasi, user menentukan jumlah uang dalam request? Tentu saja uang yang masuk ke dalam database akan sesuai dengan yang user tentukan.

Jadi dari burpsuite, penulis tinggal melakukan intercept pada request yang akan dikirim dan menambahkan parameter “money”.

Disini penulis menambahkan di JSON parameter money dengan jumlah 50jt. Dari sini, maka uang yang masuk ke dalam database tidak akan default.

Setelah berhasil melakukan registrasi, penulis tinggal login dan membeli dan mendapatkan flag.

Flag: CJ2019{l3t5_9eT_r1cH_l1k3_H33j1n}

 

Leave a Reply

Your email address will not be published. Required fields are marked *