Bug Bounty: IDOR on Sequential Mongo Object ID

Apa yang penulis tulis disini adalah untuk edukasi dan sharing pengalaman semata, hal-hal yang tidak diinginkan yang terjadi akibat membaca artikel ini adalah diluar tanggung jawab penulis.

Pembukaan

Kali ini saya ingin sedikit sharing tentang kegiatan bug bounty hunting yang saya lakukan, pada case ini saya menemukannya pada sebuah Edutech Startup di Indonesia. Bug ini sudah dilaporkan dan sudah di lakukan fixing dari sisi mereka.

IDOR (Insecure Direct Object Reference)

Menurut situs Portswigger:

Insecure direct object references (IDOR) are a type of access control vulnerability that arises when an application uses user-supplied input to access objects directly. The term IDOR was popularized by its appearance in the OWASP 2007 Top Ten. However, it is just one example of many access control implementation mistakes that can lead to access controls being circumvented. IDOR vulnerabilities are most commonly associated with horizontal privilege escalation, but they can also arise in relation to vertical privilege escalation.

Singkatnya, IDOR terjadi ketika website/aplikasi membuka akses langsung ke object berdasarkan inputan pengguna, misal ketika sebuah aplikasi melakukan request API /user/200 yang berisi informasi user dengan id 200, lalu attacker mengubahnya menjadi /user/205, apabila tidak ada proteksi akan hal ini maka attacker dapat melihat informasi user dengan id 205, begitupun seterusnya. IDOR ini juga termasuk bug populer sehingga termasuk dalam OWASP 2007 Top 10.

GeeksforGeeks-media

Struktur Mongo Object ID

Saya lansir dari sebuah writeup Security Researcher lain pada website Techkranti, Mongo Object ID memiliki 12 byte hexadesimal, atau 24 character yang sebenarnya bukan character random, character itu memiliki sebuah pattern sebagai berikut:

Mongo object structure

Step to Reproduce

Sebagian developer mungkin menganggap bahwa menggunakan Mongo Object ID dirasa cukup aman karena ID tersebut sekilas terlihat seperti string acak yang tidak mungkin bisa di tebak atau bruteforce, namun sesungguhnya ID dari Mongo Object adalah bersifat sequensial dan bisa di prediksi. Disini saya menggunakan sebuah tools berbahasa Python untuk memprediksinya, bisa dilihat di https://github.com/andresriancho/mongo-objectid-predict.

Saya kembali ke website target dan membuka halaman Profile untuk melihat request API nya, dan didapati lah sebagai berikut:

image

Terlihat dari screenshot diatas user melakukan request GraphQL dengan nama GetUserById diiringi dengan variable id dari Mongo Object dibawahnya, lalu server meresponse dengan data user termasuk data sensitif seperti foto KTP, Ijazah, dll. Setelah saya mendapati ID akun saya, saya segera menggunakan tools mongo objectid predict untuk mendapatkan ID user yang lain, dan saya masukan ID tersebut ke fitur Intruder milik Burp Suite dan hasilnya beberapa ID merupakan valid, dengan begitu attacker dapat mengetahui informasi user lain, bahkan hal ini dapat menimbulkan pencurian data pribadi seperti KTP, Ijazah, dll.

Reference