Exploiting IDOR Vulnerability in PostgREST

Aminudin
4 min readJul 10, 2024

--

Jadi kali ini saya sedang jalan jalan di web3 lagi, disalah satu platform untuk earn point di platform tersebut dengan menyelesaikan campaign campaign yang mereka sediakan.

jadi di platform ini, kalau kita menyelesaikan campaign yang mereka berikan kita akan diberikan sebuah coin yang nantinya kita point tersebut kemungkinan akan convert ke sebuah token crypto.

Tampilannya seperti diatas, jadi kita mengumpulkan koin untuk bisa ditukar sesuatu nanti. Bisa dilihat diatas point saya kan 0 T_T.

Dan seperti biasa saya suka iseng / penasaran darimana point itu diambil off chain / on chain dan apa yang mereka pakai bila off chain apakah service sendiri atau third party, jadi langsung aja.

Saya inspect ketika saya mengakses halaman reward tersebut

dan setelah saya inspect dan cek bagian network ternyata dia pakai supabase, disini saya aga pesimis karena dari dulu sering nemu platform yang menggunakan supabase tapi tidak menemukan bugnya. Tapi, karena sepertinya yang ini menarik jadi saya coba cari tahu lagi secara lebih mendalam.

Ketika saya coba cari cari untuk dari supabase sendiri saya tidak menemukan bugnya, lalu diketahui juga diatas supabase menggunakan PostgREST.

Jadi si postgrest ini adalah web server yang secara langsung membuat Database PostgREST kalian menjadi RESTful API, jadi kalian menjalankan query dll langsung pada RESTful API dari PostgREST tersebut.

dan setelah saya baca baca dan cari tau inti dari API supabase yang dipakai oleh platform diatas itu seperti

https://sub.supabase.co/{{path/service for table}}/{{table}}?{{query}}

jadi diakhir path endpoint itu terdapat sebuah tablenya contoh diatas /points_accounts < ini adalah nama tablenya, yang berarti point dari setiap account disimpan pada table ini, lalu pada query setelah table itu adalah querynya kalian bisa cek pada dokumentasi PostgREST nya

saya contohkan dikit untuk mencari data pada sebuah table point_accounts dan mencari data dengan query seperti select * from point_accounts where wallet_address = '0x' itu sama dengan :

METHOD : GET 
ENDPOINT : /point_accounts?select=*&wallet_address=eq.0x

Dan untuk melakukan create/update/delete kita tinggal rubah method nya saja dan rubah bodynya jika ingin melakukan create/update dan lakukan request pada API nya.

Ok cukup sampe sini belajar PostgREST nya, lalu lanjut cari bugnya. Disini saya berharap ada miss authorization configuration untuk dilakukannya IDOR

dan karena saya ingin mencoba update point saya maka saya harus tau dulu data full saya di table point_accounts itu apa berdasarkan wallet address saya.

Saya melakukan request dengan detail query dibawah ini :

https://sub.supabase.co/rest/v1/points_accounts?select=*&wallet_address=eq.0x4a51A32EEba628A9F84136d7b7206C2969AA73Be

disini saya mencari data point_accounts dengan wallet address yang saya punya yaitu 0x4a51A32EEba628A9F84xxxx, yaps benar disitu data points saya 0.

lalu saya coba update, setelah baca dokumentasi untuk update methodnya pake PATCH lalu bodynya berisi data object yang saya punya dan update saja salah satu keynya. Lalu saya coba dengan data berikut

{
"type": null,
"points": 666666666,
"id": "7f06f416-57a6-472d-80ac-9dxxxxxx",
"created_at": "2024-06-07T10:44:40.552116+00:00",
"group": "community",
"user_id": "2e15479c-0e51-4110-a567-d608xxxx",
"wallet_address": "0x4a51A32EEba628A9F84136d7b7206C2xxxxx",
"staked_points": 0
}

untuk querynya masih sama seperti sebelumnya karena agar querynya menjadi

update set xxxxxx point_accounts where wallet_address = '0xwalletkita'

Lalu kita coba request

Ok disini saya cek request berhasil tidak ada error, jadi langsung coba kunjungi webnya kembali

So bisa kalian liat, user saya langsung berada pada peringkat pertama cheers 🥂

Pada platform ini juga saya menemukan beberapa bug juga.

pertama untuk bug diatas bukan juga berlaku terhadap point_accounts tapi berlaku juga buat beberapa table seperti deals.

lalu yang kedua ketika saya mencari kata kunci supabase pada source saya menemukan beberapa variable

disitu tertera beberapa JWT untuk JWT yang pertama saya cek untuk supabase yang ber role anon tapi yang kedua itu ber role admin tapi untuk API dari platform tersebut di xxx.redacted.com/ dan di API tersebut juga ternyata meng ekspose swagger documentationnya :

Ketika saya test JWT kedua itu semua valid untuk semua endpoint yang ada pada dokumentasi diatas.

dan satu lagi begitu juga dengan aduan intercomnya, saya bisa melihat semua aduan user cuman gatau ini sengaja atau ngga

Ok itu saja terimakasih banyak bagi yang sudah membaca!

Timeline :

~ 09 July 2024 : Bug Reported
~ update : no reward

--

--