[Harekaze CTF 2019] – Encode and Encode

Diberikan sebuah web beserta source code.

http://153.127.202.154:1001/

Dari website tersebut sepertinya hanya ada 3 url, yang pertama ke about.html, kedua ke lorem.html, dan yang ketiga ke bagian source code dari file query.php. Mari kita lihat terlebih dahulu isi dari query.php.

Inti dari source code ini adalah input yang kita kirim harus dalam bentuk encoded json karena adanya fungsi json_decode yang digunakan pada inputan kita. Lalu untuk pertama, di bagian;

Fungsi ini akan memeriksa apakah di dalam input kita terdapat kata yang disebutkan dalam variabel $banword atau tidak. Bila ada, maka akan return false.

Lalu pada bagian:

Inputan yang kita masukan tadi akan di ubah bentuknya menjadi json decoded (bentuknya seperti associative array pada php) dengan bantuan fungsi json_decode tadi yang sudah disebutkan dan akan di simpan ke dalam variable $json.

Setelah itu terdapat if statement dengan 3 kondisi di dalamnya, pertama, program akan memeriksa apakah fungsi is_valid return true atau tidak, lalu kondisi kedua program akan memeriksa apakah di dalam variable $json ada isinya atau tidak, dan kondisi yang terakhir adalah program akan memeriksa apakah dalam variable $json dengan keyword page ada isinya atau tidak. Untuk kita bisa masuk kedalam statement if, kita harus memenuhi ketiga syarat tersebut.

Jika kita berhasil masuk, isi dari $json[‘page’] akan di masukkan ke dalam variable $page. Kemudian isi dari variable $page akan digunakan sebagai nama file dan dimasukkan ke dalam fungsi file_get_contents dan hasilnya akan di simpan ke dalam variable $content.

Setelah itu kita kan bertemu dengan validasi lagi dimana kali ini terdapat 2 kondisi. Kondisi pertama adalah program akan memeriksa apakah fungsi file_get_contents yang dijalankan return false atau tidak, dan kondisi yang kedua adalah isi dari $content akan dibawa ke dalam fungsi is_valid dan akan diperiksa juga apakah return false atau tidak. Apabila kedua kondisi tersebut terpenuhi maka berarti file yang ingin kita buka tidak valid dan akan program akan mengirimkan string “Not Found”.

Untuk potongan code yang terakhir, bila kita berhasil melewati semua validasi dengan aman, program akan membuka file tersebut dan jika didalamnya terdapat string “HarekazeCTF{blablablabla}” maka akan di replace dengan “HarekazeCTF{<censored>}”. Setelah itu akan di kirim kembali ke user.

Kalau begitu gimana dong? Kalaupun kita berhasil read file, yang kita terima hanyalah censored.

Nah dari situ, penulis melakukan sedikit research dan menemukan hal yang menarik mengenai JSON (Javascript Object Notation).

Disini disebutkan bahwa JSON dapat men-translate unicode menjadi string. Jadi apabila saya memiliki string:

\u002f\u0066\u006c\u0061\u0067 -> /flag

Maka JSON dapat men-translate unicode tersebut menjadi “/flag”. Dengan begitu, seharusnya kita bisa bypass validasi dari preg_match karena yang kita kirim ke server tidak mengandung string apapun yang disebutkan di $banword. Jadi kita bisa test untuk membaca file dengan menggunakan metode ini. Program yang digunakan adalah cURL:

$ curl ‘http://153.127.202.154:1001/query.php’ -H ‘Content-Type: application/json’ –data-binary ‘{“page”:”\u002f\u0066\u006c\u0061\u0067″} –compressed

Dengan output sebagai berikut:

Yep, kita sudah bisa read file. Yang perlu kita lakukan sekarang adalah bagaimana caranya agar flag itu muncul.

Ingat bahwa dengan unicode, kita bisa bypass larangan yang ada di dalam variable $banword. Dengan informasi itu berarti kita juga dapat menggunakan php wrapper yang tersedia. Disini penulis menggunakan php wrapper php://.

Tapi kan kalau kita gunakan itu tetap akan terkena “censored”.

Memang, maka dari itu kita akan meng-encode isi dari file flag ke encoding base64 agar tulisan “HarekazeCTF{blablablba}” tidak di replace. Berikut cara yang digunakan:

 

Lalu kita kirim dan kita mendapatkan output sebagai berikut:

Dari base64 yang ada kita tinggal decode untuk mendapatkan flag.

Flag: HarekazeCTF{turutara_tattatta_ritta}

Leave a Reply

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