Bypass (Solved After Event)

It's obvious, but can you bypass it to win the reward?

http://103.163.139.198:8888arrow-up-right

Author: BerlianGabriel

Kita diberikan sebuah URL webite dan filearrow-up-right source code dari webappnya.

Berikut adalah kode utama dari website (app.py).

Pada website ini, kita bis meng-custom title dan content-nya menggunkan GET request. Misalnya, berikut adalah hasil render dari http://103.163.139.198:8888/?title=h4cked&content=payload .

Kerentanan web ini adalah pada kode template HTML-nya yang menonaktifkan fitur bawaan 'safe' dari Jinja2. Dengan begini, syntax dari Jinja dan HTML akan di-render benar-benar seadanya, sehingga kita bisa melakukan serangan SSTI (Server Side Template Injection).

Untungnya, web ini masih menyiapkan filter sehingga syntax yang berpotensi digunakan untuk menyerang web akan di-block. Walaupun begitu, dengan filter seperti ini pun, masih ada beberapa cara untuk membypass-nya.

Misalnya, untuk membypass string seperti os, kita bisa menggunakan payload ''.join(['o','s']) . Oh, karakter . juga di-block? Gampang, untuk mengakses atribut dari sebuah objek di Jinja, kita bisa gunakan Object | attr('nama_atribut'), sehingga payloadnya akan menjadi '' | attr('join')([ . Apa? [ dan ] juga di-block? Tenang, atribut join() tidak hanya menerima list, tapi juga tuple, sehingga payloadnya bisa dibuat menjadi '' | attr('join')(('o','s')) .

Intinya, untuk mengerjakan soal ini, kita perlu mencari cara-cara kreatif untuk mencapai tujuan yang sama dengan cara yang berbeda. Selama mengerjakan soal ini, saya merujuk pada artikel iniarrow-up-right.

Dalam serangan SSTI, biasanya tujuan utama kita adalah untuk menjalankan atribut popen , karena dengan itu, kita bisa menjalankan sebagian besar system command yang kita butuhkan. Pada payload di bawah ini, saya mencoba menjalankan ls .

Nah, kalau sudah bekerja seperti ini, tinggal ganti saja commandnya menjadi cat reward/flag.txt tapi karena karakter . di-block, payloadnya perlu kita sesuaikan menjadi '' | attr('join')(('cat reward/flag','\x2e','txt')). Berikut adalah payload akhir yang akan memberikan kita flag-nya.

Flag: IFEST13{SSTI_byp4ss_f1lt3rs_to_w1n_R3W4RD}

Footnote

Berikut write-up dari tim lainnya pada soal yang sama, yang menurut saya bagus untuk sumber belajar:

Last updated