Kadang saya merasa lucu membaca komentar dari posting saya. Kalau postingnya terlalu kompleks (seperti berbagai hal yang yang saya tuliskan di blog saya yang berbahasa inggris: tinyhack.com), sedikit sekali yang paham jadi kurang ada komentar yang membangun. Sedangkan jika terlalu sederhana, seperti posting sebelumnya, banyak yang “protes”, atau malah nggak percaya.
Beberapa komentar yang muncul misalnya:
- Masak bank securitynya seperti itu?
- Itu kan POST, kok diakses pake GET?
Untuk hal pertama: jangan pikir security bank itu sangat ketat. Untuk hal kedua: sepertinya banyak pemula kurang paham mengenai POST dan GET, dan perlu penjelasan lebih lanjut.
Untuk sistem core banking biasanya cukup dijaga ketat, tapi berbagai sistem disekitarnya tidak demikian. Alasannya:
- Tidak semua modul dikerjakan oleh internal bank, kadang oleh pihak ketiga
- Tidak semua bank menyewa pentester atau punya ahli security
- Tidak semua ahli security atau pentester kerjanya bener
- Kadang sudah ada SOP internal untuk security tapi dibypass karena “harus tayang hari ini”
Bahkan ketika pentesting, sudah beberapa kali saya menemukan bug super parah di beberapa bank seperti:
- Bisa transfer dari siapa saja ke siapa saja, termasuk keluar bank
- Root access di server utama
- Mendapatkan source code ibanking beberapa bank
- Akses ke firewall utama bank
Karena posisi saya di Thailand, itu semua akses dari eksternal (bukan testing jaringan internal bank). Jadi bug super parah itu bisa diakses dari luar bank.
Nah sekarang ke pelajaran teknisnya: mengenai request POST dan GET. Secara umum kedua request ini ada dengan tujuan berbeda:
- GET untuk request yang idempoten (artinya boleh diulangi)
- POST untuk request yang tidak idempoten, dan umumnya ukuran datanya lebih besar
Di dalam program, kita bisa mengakses isi variabel dari POST dan GET secara terpisah. Tapi di berbagai bahasa pemrograman, kita bisa meminta agar mengakses variabel dari POST (jika ada), lalu GET (jika ada), atau bahkan dari cookie jika ada. Catatan: urutannya tidak harus seperti itu, di berbagai bahasa bisa dikonfigurasi
Misalnya di PHP: $_POST
untuk mengakses post, dan $_GET untuk mengakses get. Dan ada $_REQUEST
untuk mengakses GET atau POST atau Cookie.
Jadi jika ada request POST ke URL /data/?a=5
dan di dalam data POST ada a=7
, maka $_GET["a"]
pasti 5, $_POST["a"]
pasti 7, dan $_REQUEST["a"]
bisa 5 atau 7 tergantung setting variables_order di PHP. Defaultnya adalah nilai GET tapi jika ada nilai POST yang sama, maka akan diganti dengan nilai dari POST.
Bagaimana dengan bahasa lain? sama saja, tergantung framework yang dipakai. Contoh: di framework Flask untuk python ada requests.args
untuk GET, requests.form
untuk POST, dan request.values
untuk POST atau GET (nilai GET akan dipakai jika ada nilai sama antara POST dan GET).
Lalu apa gunanya tahu ini?
Beberapa pengecekan security hanya di level URL atau GET saja. Jadi kadang jika dicek di URL, dan kita ganti jadi request POST, hasilnya jadi lolos. Kadang saya mengetes apakah method POST (seperti dalam posting sebelumnya) bisa diakses juga via GET. Jika bisa, ini memudahkan testing cepat dengan browser.
Dalam kasus tertentu: satu method memakai spesifik $_GET
(yang diperiksa adalah isi variabel $_GET["q"]
misalnya), lalu di method lain memakai $_REQUEST["q"]
. Jika URL dipanggil dengan GET, maka kedua variabel tersebut sama, tapi jika dipanggil dengan POST dengan variabel "q"
maka sesuai default PHP, isi $_GET["q"]
menjadi berbeda dengan $_REQUEST["q"]
.
Untuk lebih jelasnya lihat contoh berikut ini. Bisa dilihat source code programnya, lalu programnya diberi request GET dan POST dengan curl. Bisa terlihat bedanya.
Karena mengubah POST/GET ini adalah hal yang umum, banyak yang membuat skrip untuk ini. Misalnya di skrip zaproxy sudah ada yang membuat untuk mengubah POST menjadi GET
Sesuai judulnya: ini hanya membahas bagian dasar sekali mengenai POST dan GET. Saya belum masuk ke berbagai hal/trik lain yang berhubungan dengan request, misalnya:
- Memakai method lain (PATCH/PUT, dsb)
- Mengganti content type ketika melakukan post (misalnya dari JSON ke XML)
- Melakukan injection di semua header (misalnya user agent)
Berbagai hal tersebut mungkin akan saya bahas di posting lain.
well done mas/