Insecure Direct Object Reference (IDOR) in GraphQL API which has an impact on Takeover Vouchers that have been used can still be reused

Aidil Arief
3 min readOct 24, 2021

--

Assalamualaikum Bug Hunter & Hi Everyone.

Dikesempatan kali ini saya ingin berbagi pengalaman terkait Temuan Insecure direct object references (IDOR) pada API GraphQL yang berdampak Takeover Voucher Yang Sudah Digunakan masih Dapat digunakan kembali :)

Follow me :)

Maaf saya tidak melampirkan situs temuannya karena itu bersifat sangat sensitif :)

Sebelumnya saya sudah sempat menulis temuan Insecure direct object references (IDOR) pada API GraphQL yaitu :

Baiklah langsung saja ke topik nya :)

Ketika memesan produk pada sebuah website, saya menggunakan voucher sebagai pembayarannya. Tidak pernah terlintas difikiran saya bahwa menemukan sebuah kerentaan ini mungkin tidak masuk akal dan itu mustahil untuk sekelas website yang didalamnya memiliki puluhan, ratusan, bahkan ribuan tim IT Security. Tetapi siapa yang mengira bahwa keberuntungan tersebut saya dapatkan :)

Temuan ini berasal ketika saya mendapatkan sebuah fitur DELETE VOUCHER pada sebuah pesanan. Maaf, maksud saya ketika pengguna melakukan pesanan dan pengguna tersebut memasukkan kode vouchernya, lalu ketika pengguna tersebut tidak mau kode voucher tersebut dipakai untuk pesanannya, maka pengguna tersebut menghapus kode voucher yang sudah diinput tadi dan menggantikannya dengan kode voucher yang lain.

Katakanlah bahwa kode voucher saya yang masih valid adalah HACKED Dan Kode Voucher saya yang sudah digunakan ada HACKED123

Untuk mereproduksi perilaku ini pertama saya membuat sebuah pesanan.

Lalu ketika sudah sampai di fitur payment.

Saya memilih payment menggunakan kode Voucher, dan kode voucher yang saya gunakan adalah HACKED.

Lihat, berhasil.

Tapi, saya berubah fikiran dan ingin menggantinya sehingga saya menghapus kode voucher itu.

Lihat, berikut cuplikan request GraphQL nya ketika DELETE VOUCHER :

[{“Name”:”unapply”,”variables”:{“payload”:”{\”PesananId\”:\”123\”,\”PesananHash\”:\”123aabbcc\”,\”PesananType\”:\”Testing\”,\”VoucherCode\”:\”HACKED\”,\”currency\”:\”IDR\”,\”PesananDetail\”:\”123321\”}”},”query”:”mutation unapply($payload: String) {\n voucherUnapply(payload: $payload) {\n code\n message\n data\n __typename\n }\n}\n”}]

Dan berikut responds nya :

[{“data”:{“voucherUnapply”:{”messageNAME”:”SUCCESS”,”data”:true,”__typename”:”VoucherUnapplyTypes”}}}]

Karena penasaran, saya mencoba menghapus kode voucher yang sudah digunakan, berikut requestnya :

[{“Name”:”unapply”,”variables”:{“payload”:”{\”PesananId\”:\”123\”,\”PesananHash\”:\”123aabbcc\”,\”PesananType\”:\”Testing\”,\”VoucherCode\”:\”HACKED123\”,\”currency\”:\”IDR\”,\”PesananDetail\”:\”123321\”}”},”query”:”mutation unapply($payload: String) {\n voucherUnapply(payload: $payload) {\n code\n message\n data\n __typename\n }\n}\n”}]

Lihat, berhasil :)

Saya terkejut melihat itu berhasil :)

Tidak sampai disitu, selanjutnya saya mencoba memasukkan kode voucher yang sudah digunakan tadi, Dan itu berhasil :)

Kesimpulan :

  1. Kurangnya authentikasi GraphQL di perilaku diatas dapat menghapus kode voucher yang telah digunakan sebelumnya tanpa diperiksanya PesananId & PesananHash pada saat kode voucher diinput.
  2. Jika di kesimpulan no.1 diatas bukanlah kesimpulan untuk solusi yang tepat, bahwa kode voucher yang telah digunakan sebelumnya dapat dihapus atau diambilalih tanpa diperiksanya PesananId & PesananHash dimana kode voucher yang telah digunakan sebelumnya diinput, maka seharusnya itu tidak diizinkan atau seharusnya kode voucher yang telah digunakan dihapus dari sistem secara otomatis.
  3. Jika Api GraphQL hanya memeriksa sebuah pesanan yang telah diinput kode voucher yang valid, lalu attacker melakukan request delete voucher, maka ketika attacker request delete kode voucher yang telah digunakan, lalu itu akan berhasil :) Kenapa itu terjadi? Karena menurut asumsi saya, Api GraphQL diperilaku diatas hanya memeriksa apakah kode voucher dipesanan tersebut diinput atau tidak, lalu jika kode voucher diinput, GraphQL akan menghapus kode voucher yang diminta oleh request attacker, baik itu kode yang masih valid dan bahkan hingga kode voucher yang sudah digunakan sebelumnya atau tidak valid lagi :)

BOUNTY : $$

--

--

Aidil Arief
Aidil Arief

No responses yet