Struktur Klasifikasi

Taksonomi ini mengorganisir seluruh attack surface dari kerentanan IDOR/BOLA melalui tiga sumbu yang saling ortogonal. Sumbu 1 (Target Mutasi Identifier) adalah sumbu struktural utama — mengklasifikasikan teknik berdasarkan komponen mana dari object reference atau alur otorisasi yang dimanipulasi. Sumbu 2 (Jenis Celah Otorisasi) adalah sumbu lintas-sektor — menjelaskan jenis kekurangan otorisasi apa yang membuat setiap mutasi dapat dieksploitasi. Sumbu 3 (Skenario Dampak) memetakan teknik ke hasil eksploitasi di dunia nyata.

IDOR/BOLA pada dasarnya adalah pemeriksaan otorisasi yang tidak ada atau cacat terhadap identifier objek yang disuplai pengguna. Tidak seperti kerentanan injeksi atau parsing-differential, akar penyebabnya bukan cacat parsing teknis, melainkan sebuah ketiadaan logis — aplikasi mengautentikasi pengguna tetapi tidak pernah memverifikasi apakah identitas yang telah diautentikasi tersebut berwenang mengakses objek yang direferensikan. Hal ini membuat IDOR/BOLA sangat persisten: tidak dapat dieliminasi oleh satu library, fitur framework, atau perubahan protokol, melainkan membutuhkan penegakan otorisasi per-endpoint.

Ringkasan Sumbu 2: Jenis Celah Otorisasi

Jenis CelahDeskripsi
Absent CheckTidak ada logika otorisasi untuk endpoint tersebut; pengguna mana pun yang sudah (atau belum) terautentikasi dapat mengakses objek apa pun
Inconsistent CheckOtorisasi diterapkan pada beberapa endpoint/method tetapi tidak pada yang lain yang menyentuh resource yang sama
Bypassable CheckLogika otorisasi ada tetapi dapat dilewati melalui encoding, manipulasi format, atau trik parameter
Logic FlawPemeriksaan otorisasi ada tetapi menggunakan validasi kepemilikan yang salah (misalnya, memeriksa org tetapi bukan user di dalam org)
Temporal GapOtorisasi lolos saat waktu pemeriksaan, tetapi state berubah sebelum waktu penggunaan (TOCTOU)
Trust Boundary ViolationLayanan internal atau komponen downstream melewati otorisasi, mempercayai upstream untuk telah melakukannya

§1. Tipe Identifier dan Prediktabilitas

Sifat identifier objek menentukan attack surface untuk enumerasi dan penebakan. Meskipun identifier yang tidak dapat diprediksi meningkatkan standar keamanan, hal tersebut tidak menggantikan pemeriksaan otorisasi — hanya menggeser serangan dari blind enumeration menjadi eksploitasi kebocoran identifier.

§1-1. Identifier Numerik Sekuensial

Vektor IDOR paling klasik dan paling banyak dieksploitasi. Aplikasi yang menggunakan primary key database auto-increment sebagai identifier eksternal mengekspos seluruh ruang enumerasi ke aritmetika trivial.

SubtipeMekanismeKondisi Utama
Integer increment/decrementMengubah user_id=1001 menjadi user_id=1002 untuk mengakses record yang berdekatanPK auto-increment terekspos tanpa pemeriksaan otorisasi
Range enumerationIterasi melalui id=1 hingga id=N untuk membuang semua recordTidak ada rate limiting dikombinasikan dengan otorisasi yang tidak ada
Negative / zero IDMemasukkan id=0 atau id=-1 untuk mengakses record default, admin, atau sentinelAplikasi menggunakan ID khusus untuk objek sistem tanpa membatasi akses
Large integer overflowMemasukkan nilai yang melebihi rentang yang diharapkan (misalnya id=999999999) untuk memukul record edge-casePerbedaan penanganan integer antara lapisan validasi dan lapisan database
ID arithmetic pada composite keyMemanipulasi satu komponen dari identifier komposit (misalnya org_id=5&user_id=3org_id=5&user_id=4)Pemeriksaan otorisasi hanya memeriksa satu komponen dari composite key

§1-2. Identifier UUID / GUID

UUID (v4) adalah nilai 128-bit dengan 122 bit keacakan (6 bit dicadangkan untuk versi/varian), menghasilkan ~2^122 kemungkinan nilai, sehingga blind enumeration tidak layak dilakukan. Namun, persepsi keamanan yang mereka berikan sering membuat developer melewati pemeriksaan otorisasi sepenuhnya, menciptakan rasa aman yang palsu yang runtuh ketika identifier bocor.

SubtipeMekanismeKondisi Utama
UUID leakage via endpoint lainMemanen UUID dari listing pengguna, hasil pencarian, activity feed, atau shared link, lalu menggunakannya di endpoint yang tidak terlindungiUUID diperlakukan sebagai rahasia, bukan identifier; tidak ada authz check di endpoint konsumer
UUID leakage via pesan errorAplikasi mengembalikan UUID dalam respons error (misalnya “User abc-def-123 not found”)Pesan error verbose mengekspos identifier internal
UUID leakage via kode client-sideSource JavaScript, komentar HTML, atau respons API menyematkan UUID objek pengguna lainFrontend membocorkan identifier yang dipercaya backend sebagai “tidak dapat ditebak”
Prediksi timestamp UUIDv1UUIDv1 mengenkode timestamp dan alamat MAC; jika waktu pembuatan diketahui, ruang UUID dapat dipersempit secara dramatisAplikasi menggunakan UUIDv1 bukan UUIDv4; penyerang mengetahui waktu pembuatan perkiraan
Generasi UUID dengan PRNG lemahUUID yang dibuat dengan sumber acak lemah (misalnya Math.random() di JavaScript) dapat diprediksiGenerasi UUID kustom dengan entropi yang tidak memadai
UUID format downgradeMenukar UUID dengan integer sederhana (misalnya id=1 alih-alih id=550e8400-...) dan backend menerima kedua formatBackend ORM/DB menerima beberapa format ID tanpa membedakan

§1-3. Identifier Terenkode dan Ter-hash

Aplikasi terkadang mengenkode atau meng-hash identifier untuk menyamarkannya, memperlakukan ketidakjelasan sebagai mekanisme otorisasi. Ini adalah langkah-langkah security-through-obscurity yang runtuh di bawah analisis.

SubtipeMekanismeKondisi Utama
Decoding ID ter-Base64Mendekode aWQ9MTIz mengungkapkan id=123; penyerang mengenkode ID yang berbeda dan mengirimkannyaBase64 digunakan sebagai satu-satunya “perlindungan”; tidak ada otorisasi server-side
Enkripsi reversibelIdentifier dienkripsi dengan kunci statis atau bocor; penyerang mendekripsi, memodifikasi, dan mengenkripsi ulangEnkripsi simetris dengan kunci terekspos di kode client-side atau kebocoran konfigurasi
Hash collision / rainbow tableInput pendek atau berentripi rendah di-hash (misalnya MD5 dari integer sekuensial); penyerang pra-komputasi tabel hashHash dari input yang dapat diprediksi (misalnya MD5(user_id)) tanpa salt atau secret key
HMAC tanpa otorisasiObject reference dilindungi oleh HMAC tetapi aplikasi hanya memeriksa validitas HMAC, bukan kepemilikanToken HMAC yang valid untuk objek X tidak menjamin bahwa pengguna A seharusnya mengakses objek X
Object ID tertanam dalam JWTIdentifier objek tertanam dalam klaim JWT; memodifikasi klaim (dengan algoritma lemah/none atau key confusion) mengubah objek yang direferensikanCacat validasi JWT dikombinasikan dengan object ID dalam payload (lihat §4-4)

§1-4. Identifier Berbasis String dan Semantik

Ketika identifier adalah string yang dapat dibaca manusia (username, alamat email, nama file, slug), attack surface beralih dari enumerasi ke social engineering dan pengumpulan informasi publik.

SubtipeMekanismeKondisi Utama
Substitusi username/emailMengganti user=alice@corp.com dengan user=admin@corp.com dalam permintaan APIEmail/username digunakan sebagai kunci objek tanpa memverifikasi identitas pemanggil cocok
Manipulasi filenameMengubah file=report_alice.pdf menjadi file=report_bob.pdf untuk mengakses dokumen pengguna lainFilename sebagai referensi langsung ke file system atau objek penyimpanan
Slug/path guessingMengakses /api/projects/secret-project-name dengan menebak atau menemukan slug proyekSlug digunakan sebagai kontrol akses tunggal; tidak ada verifikasi keanggotaan
Wildcard dan glob injectionMengirimkan id=* atau username=* untuk memicu pattern matching yang mengembalikan semua recordBackend menginterpretasikan karakter wildcard di field identifier

§2. Lokasi Parameter dan Vektor Transport

Cacat otorisasi yang sama dapat bermanifestasi secara berbeda tergantung di mana identifier objek muncul dalam permintaan HTTP. Penyerang secara sistematis menguji semua lokasi parameter karena otorisasi mungkin diterapkan untuk satu vektor transport tetapi tidak yang lain.

§2-1. Parameter Path URL

SubtipeMekanismeKondisi Utama
Manipulasi segmen path RESTMengubah /api/users/123/orders menjadi /api/users/456/ordersRouting RESTful mengekstrak ID dari path; tidak ada authz di level middleware
Nested resource traversalMengakses /api/orgs/1/users/2/documents/3 dengan mengganti segmen mana sajaPemeriksaan otorisasi pada resource parent tetapi tidak pada child, atau sebaliknya
Path version bypassBeralih dari /api/v2/users/123 (terlindungi) ke /api/v1/users/123 (tidak terlindungi — versi lama)Versi API lama tidak memiliki otorisasi yang diterapkan pada versi yang lebih baru

§2-2. Parameter Query String

SubtipeMekanismeKondisi Utama
Penukaran parameter query sederhanaMengubah ?account_id=100 menjadi ?account_id=101Vektor IDOR paling umum dan paling sederhana
HTTP Parameter Pollution (HPP)Mengirimkan parameter duplikat: ?user_id=attacker&user_id=victim; backend menggunakan nilai terakhir sementara otorisasi memeriksa yang pertamaPrioritas parsing parameter server-side berbeda dari middleware otorisasi
Penambahan parameterMenambahkan parameter tak terduga seperti &admin=true atau &user_id=victim ke permintaan yang biasanya mengambil ID dari sesiAplikasi memprioritaskan parameter eksplisit atas nilai yang diambil dari sesi

§2-3. Request Body (JSON/XML/Form)

SubtipeMekanismeKondisi Utama
Substitusi field body JSONMengubah {"user_id": 123} menjadi {"user_id": 456} dalam body POST/PUT/PATCHParameter body digunakan untuk pencarian objek tanpa verifikasi kepemilikan
Array wrappingMengubah {"id": 123} menjadi {"id": [123, 456]} untuk mengakses beberapa objek atau melewati pemeriksaan otorisasi berbasis tipeBackend menerima array di mana skalar diharapkan; iterasi tanpa authz per elemen
Nested object injectionMengubah {"id": 123} menjadi {"user": {"id": 456}} untuk melewati pemeriksaan otorisasi flat-parameterLogika otorisasi memeriksa body.id tetapi ORM mengikat dari body.user.id
XML entity / attribute injectionDalam API berbasis XML, memodifikasi <userId>123</userId> atau menyuntikkan referensi entitas untuk mengubah nilai ID yang ter-resolveAPI berbasis XML dengan entity expansion diaktifkan
Mass assignment pada properti objekMengirimkan field tambahan seperti {"user_id": 456, "role": "admin"} yang langsung diikat API ke data modelFramework API secara otomatis mengikat semua field input ke model (§5-2 BOPLA)
SubtipeMekanismeKondisi Utama
Custom header injectionMemodifikasi header X-User-Id: 123 atau X-Account-Id: 456 yang dipercaya layanan internalHeader diatur oleh reverse proxy atau API gateway; penyerang dapat menyuntikkan/menimpanya
Manipulasi nilai cookieMengubah cookie seperti user_session=base64(user_id=123) untuk mereferensikan pengguna yang berbedaObject reference tertanam dalam nilai cookie alih-alih sesi server-side
Akses berbasis Referer/OriginAplikasi memberikan akses berdasarkan header Referer yang berisi URL objek yang “benar”Referer digunakan sebagai sinyal otorisasi implisit

§2-5. WebSocket dan Saluran Real-Time

SubtipeMekanismeKondisi Utama
WebSocket message ID swapSetelah membuat koneksi WebSocket, mengirimkan pesan dengan channel/room ID pengguna lainOtorisasi WebSocket hanya dilakukan saat waktu koneksi, bukan per pesan
Subscription channel hijackingBerlangganan saluran real-time (misalnya channel=user_456_notifications) yang dimiliki pengguna lainNama saluran pub/sub dibuat dari identifier yang dapat diprediksi tanpa otorisasi langganan

§3. Teknik Bypass Logika Otorisasi

Ketika pemeriksaan otorisasi ada, penyerang menggunakan teknik manipulasi struktural untuk menghindarinya. Bypass ini menargetkan implementasi pemeriksaan, bukan ketiadaan-nya.

§3-1. HTTP Method Tampering

SubtipeMekanismeKondisi Utama
Method switching (GET ↔ POST)Otorisasi diterapkan pada GET /api/users/123 tetapi tidak pada POST /api/users/123 atau sebaliknyaKonfigurasi otorisasi per-method; beberapa method tidak terlindungi
PUT/PATCH/DELETE bypassOperasi baca terlindungi tetapi operasi tulis/hapus pada resource yang sama tidak memiliki otorisasiDeveloper mengamankan jalur baca tetapi mengabaikan jalur mutasi
HEAD/OPTIONS information leakHEAD /api/users/123 mengembalikan status code atau header yang mengungkapkan keberadaan objek tanpa memicu otorisasiHandler method HEAD melewati middleware otorisasi
Method override headersMenggunakan X-HTTP-Method-Override: DELETE dengan permintaan GET untuk melewati aturan otorisasi berbasis methodFramework mendukung method override; otorisasi diperiksa terhadap method asli

§3-2. Evasion Encoding dan Format

SubtipeMekanismeKondisi Utama
URL encodingMengenkode identifier (%31%32%33 untuk 123) untuk melewati aturan otorisasi berbasis string-matchingOtorisasi melakukan perbandingan string tanpa URL-decoding
Double encodingDouble-encoding (%2531%2532%2533) melewati satu langkah decode di lapisan otorisasiOtorisasi mendekode sekali; aplikasi mendekode lagi
Unicode normalizationMenggunakan varian Unicode dari digit atau karakter (misalnya fullwidth 123) yang dinormalisasi ke nilai yang samaBackend menormalisasi Unicode setelah pemeriksaan otorisasi
Case manipulationMengubah case dari identifier string (misalnya UserName vs username) ketika otorisasi case-sensitive tetapi lookup case-insensitiveKetidaksesuaian case sensitivity antara otorisasi dan lapisan data
JSON type jugglingMengirimkan {"id": "123"} (string) alih-alih {"id": 123} (integer) atau {"id": 123.0} (float) untuk melewati pemeriksaan tipe-ketatOtorisasi melakukan perbandingan tipe ketat; backend melakukan type coercion
Null byte injectionMenambahkan %00 ke identifier untuk memotongnya di satu lapisan sambil melewatinya di lapisan lainPenanganan string berbasis C dalam otorisasi vs. penanganan length-aware di aplikasi

§3-3. Manipulasi Struktur Permintaan

SubtipeMekanismeKondisi Utama
Content-Type switchingMengubah Content-Type dari application/json ke application/x-www-form-urlencoded atau multipart/form-data untuk melewati parsing body di middleware otorisasiMiddleware otorisasi hanya mem-parse satu content type
Parameter migrationMemindahkan identifier dari query string ke body atau sebaliknya untuk menghindari pemeriksaan spesifik-lokasiOtorisasi memeriksa query param; aplikasi juga membaca body param
Batch request injectionMenyematkan object reference yang tidak diotorisasi di dalam panggilan API batch/bulk (misalnya POST /api/batch dengan operasi campuran authorized dan unauthorized)Endpoint batch melakukan otorisasi pada batch secara keseluruhan, bukan per operasi
GraphQL alias abuseMenggunakan alias GraphQL untuk meminta field yang sama dengan ID berbeda dalam satu query, melewati rate limiting atau otorisasi per-queryGraphQL resolver memeriksa otorisasi per query tetapi bukan per alias (§4-2)

§3-4. Bypass Resolusi Referensi Tidak Langsung

SubtipeMekanismeKondisi Utama
Reference map predictionKetika aplikasi menggunakan peta referensi tidak langsung (token acak yang dipetakan ke ID nyata), menebak atau brute-forcing token pemetaanPeta referensi tidak langsung menggunakan entropi yang tidak mencukupi atau generasi yang dapat diprediksi
Map pollutionMenyuntikkan entri ke dalam peta referensi untuk membuat pemetaan dari token yang dikontrol penyerang ke ID objek korbanPeta referensi dapat ditulis oleh pengguna (misalnya disimpan dalam sesi client-side)
Cache key manipulationMengakses respons yang ter-cache untuk objek pengguna lain dengan memanipulasi cache key (misalnya menghapus header Vary atau parameter cache-buster)Cache tidak menyertakan konteks otorisasi dalam cache key

§4. Vektor Spesifik Paradigma API

Arsitektur API dan bahasa kueri yang berbeda memperkenalkan attack surface khusus paradigma untuk IDOR/BOLA.

§4-1. Vektor REST API

SubtipeMekanismeKondisi Utama
Sub-resource traversalMengakses /users/{victim_id}/settings ketika hanya diotorisasi untuk /users/{attacker_id}/settingsOtorisasi per-resource tidak diterapkan pada rute bersarang
Collection endpoint data leakMengakses endpoint listing /api/users atau /api/orders yang mengembalikan semua record tanpa memfilter berdasarkan kepemilikanEndpoint koleksi tidak memiliki filtering per-objek
HATEOAS link followingRespons API menyertakan hypermedia link ke resource terkait; mengikuti link yang ditujukan untuk pengguna lain melewati kontrol akses berbasis navigasiOtorisasi bergantung pada “pengguna hanya akan mengikuti link mereka sendiri”
Bulk/batch endpoint abusePOST /api/bulk yang menerima array ID di mana otorisasi ID individual dilewati demi performaOperasi batch mengoptimalkan otorisasi per-elemen

§4-2. Vektor GraphQL

Struktur query GraphQL yang fleksibel memperkenalkan attack surface IDOR unik yang tidak ada di REST API.

SubtipeMekanismeKondisi Utama
Node/Global ID queryMelakukan query node(id: "Base64EncodedGlobalId") untuk mengakses objek apa pun dalam skema berdasarkan ID globalnyaInterface node bergaya Relay tidak memiliki otorisasi per-tipe
Introspection-guided attackMenggunakan introspection untuk menemukan tipe objek, field, dan relasi, lalu membuat query untuk mengakses objek yang tidak diotorisasiIntrospection diaktifkan di produksi; mengungkapkan seluruh authorization surface
Nested relationship traversalMelakukan query user(id: attacker) { organization { users { privateData } } } untuk melintasi relasi ke data pengguna lainOtorisasi diperiksa pada field root tetapi tidak pada relasi yang ter-resolve
Alias-based enumerationMenggunakan a1: user(id: 1) { email } a2: user(id: 2) { email } ... untuk menumerasi objek dalam satu permintaan, melewati rate limitRate limiting per-permintaan; tidak ada otorisasi per-field; alias melewati logika rate
Mutation argument tamperingMemodifikasi mutation { updateUser(id: victim_id, input: {...}) } untuk memperbarui record pengguna lainMutation resolver tidak memverifikasi kepemilikan objek target
Fragment-based field extractionMenggunakan fragment untuk secara selektif meminta field sensitif yang mungkin memiliki tingkat otorisasi berbedaOtorisasi di level field tidak konsisten di seluruh ekspansi fragment

§4-3. Vektor gRPC dan Protocol Buffer

SubtipeMekanismeKondisi Utama
Manipulasi field number ProtobufMemodifikasi nomor field dalam pesan protobuf yang telah di-serialize untuk mereferensikan objek yang berbedaLayanan gRPC mengekspos object ID dalam field protobuf tanpa otorisasi
Akses service methodMemanggil method internal layanan gRPC (misalnya AdminService.GetUser) yang tidak memiliki otorisasi karena dianggap “internal”Service mesh mempercayai semua pemanggil internal; tidak ada otorisasi per-method

§4-4. Vektor Webhook dan Callback

SubtipeMekanismeKondisi Utama
Webhook URL manipulationMendaftarkan webhook untuk event pengguna lain dengan menentukan ID pengguna/resource mereka dalam langganan webhookPendaftaran webhook tidak memverifikasi kepemilikan resource yang dilanggan
Callback parameter injectionCallback OAuth/payment menyertakan object ID dalam return URL; memodifikasinya mengalihkan hasil callback ke objek penyerangHandler callback mempercayai object ID dalam callback URL tanpa memverifikasi kepemilikan ulang

§5. Eksploitasi Scope Objek dan Relasi

IDOR/BOLA menjadi lebih rumit ketika menargetkan objek yang terhubung melalui hierarki relasional, batasan multi-tenant, atau aturan akses di level properti.

§5-1. Akses Objek Horizontal vs. Vertikal

SubtipeMekanismeKondisi Utama
Horizontal IDORMengakses resource pengguna lain pada tingkat hak yang sama (misalnya Pengguna A membaca pesanan Pengguna B)Pola IDOR paling umum; tidak ada pemeriksaan kepemilikan
Vertical IDOR (privilege escalation)Mengakses resource khusus admin dengan mereferensikan ID objek admin (misalnya mengakses /admin/config/1 sebagai pengguna biasa)Kontrol akses berbasis peran tidak diterapkan di level objek
Cross-role function access (BFLA crossover)Pengguna dengan peran “viewer” mengakses endpoint yang ditujukan untuk peran “editor” dengan mereferensikan ID objek yang samaOtorisasi di level fungsi dan objek tercampur; pemeriksaan peran hilang

§5-2. Manipulasi di Level Properti Objek (BOPLA)

BOPLA (Broken Object Property Level Authorization) adalah penyempurnaan dari BOLA di mana penyerang dapat mengakses atau memodifikasi properti tertentu dari objek yang mungkin mereka miliki akses parsial.

SubtipeMekanismeKondisi Utama
Sensitive field exposureAPI mengembalikan objek lengkap termasuk field yang seharusnya tidak dilihat pengguna (misalnya password_hash, ssn, internal_notes)Tidak ada pemfilteran di level field berdasarkan peran/izin pemohon
Mass assignment / property injectionMengirimkan {"role": "admin"} atau {"balance": 99999} bersama field yang sah dalam permintaan updateFramework secara otomatis mengikat request body ke model; tidak ada whitelist field yang dapat diperbarui
Read-only field overwriteMemodifikasi field yang dimaksudkan tidak dapat diubah (misalnya created_by, owner_id, plan_tier) melalui permintaan APIAPI tidak menerapkan izin tulis di level field
Partial update privilege bypassEndpoint PATCH memungkinkan pembaruan field apa pun dari objek yang dapat diakses pengguna secara parsialHandler PATCH tidak membatasi field mana yang dapat dimodifikasi per peran

§5-3. Akses Multi-Tenant dan Cross-Organisasi

SubtipeMekanismeKondisi Utama
Cross-tenant ID referencePengguna di Tenant A mengakses resource milik Tenant B dengan menggunakan ID objek Tenant BIsolasi tenant diterapkan di level aplikasi tetapi tidak di lapisan akses data
Manipulasi tenant IDMemodifikasi tenant_id, org_id, atau workspace_id dalam parameter permintaanScoping tenant bergantung pada identifier tenant yang disuplai klien, bukan yang diambil dari sesi
Shared resource tenant leakMengakses resource shared/global yang secara tidak sengaja mengekspos data spesifik-tenantEndpoint shared tidak memfilter hasil berdasarkan konteks tenant
Sub-organization traversalMengakses data organisasi saudara dalam struktur org hierarki dengan memodifikasi ID level-orgOtorisasi memeriksa keanggotaan org parent tetapi bukan sub-org spesifik

§5-4. Akses Objek Relasional dan Tidak Langsung

SubtipeMekanismeKondisi Utama
Foreign key traversalMengakses objek terkait melalui relasi foreign key (misalnya order.customer_id → akses record pelanggan)Otorisasi pada objek primer tidak meluas ke objek terkait
Inverse relationship exploitationMelakukan query dari “sisi lain” suatu relasi (misalnya alih-alih user/123/orders, query order/456 secara langsung)Otorisasi diterapkan pada satu arah traversal tetapi tidak pada arah sebaliknya
Aggregation endpoint data leakEndpoint seperti /api/stats?group_by=user_id atau /api/reports mengagregasi data lintas pengguna tanpa filter kepemilikanQuery agregasi melewati row-level security

§6. Model Observasi: Blind IDOR dan Second-Order IDOR

Tidak semua eksploitasi IDOR menghasilkan hasil yang langsung terlihat. Memahami model feedback sangat penting untuk eksploitasi maupun deteksi.

§6-1. Direct (Visible) IDOR

SubtipeMekanismeKondisi Utama
Data dalam response bodyData yang tidak diotorisasi dikembalikan langsung dalam respons HTTPIDOR klasik; konfirmasi eksploitasi langsung
Status code differentialKode status HTTP yang berbeda untuk objek yang ada vs. tidak ada mengungkapkan keberadaan objek200 untuk ID valid vs 404 untuk ID tidak valid; memungkinkan enumerasi bahkan tanpa eksposur data
Response timing differentialWaktu respons yang berbeda secara terukur untuk ID objek valid vs. tidak validWaktu pencarian database bervariasi; memungkinkan blind enumeration melalui timing side-channel

§6-2. Blind IDOR

Dalam blind IDOR, tindakan penyerang berhasil pada objek korban, tetapi penyerang tidak menerima konfirmasi langsung dalam respons.

SubtipeMekanismeKondisi Utama
Write-only blind IDORMemodifikasi data pengguna lain (misalnya mengubah email mereka, menghapus item mereka) tanpa menerima data kembaliEndpoint tulis mengembalikan respons sukses generik; korban mengamati perubahan
Side-effect blind IDORMemicu tindakan atas nama pengguna lain (misalnya mengirim password reset, berhenti berlangganan dari layanan, memicu notifikasi)Endpoint aksi tidak mengembalikan data pengguna target tetapi menjalankan efek samping
Blind enumeration via error differentialPesan error berbeda secara subtle untuk objek yang diotorisasi-tapi-tidak-ada vs. yang tidak diotorisasi (misalnya “Not found” vs. “Forbidden”)Respons error membocorkan state otorisasi

§6-3. Second-Order IDOR

Efek eksploitasi bermanifestasi di fungsionalitas yang berbeda atau pada waktu yang lebih lambat dari injeksi awal. Pola umum meliputi object reference yang disuntikkan muncul di laporan/ekspor yang dihasilkan (di mana batch job memproses referensi tersimpan tanpa memeriksa ulang otorisasi) atau target notifikasi yang dimodifikasi (misalnya URL webhook) pada objek pengguna lain yang menyebabkan eksfiltrasi data melalui pipeline notifikasi.

§6-4. UI-Layer Information Disclosure via Failed Operation

Dalam pola ini, server memproses object reference yang tidak diotorisasi cukup jauh untuk mengekspos konten objek di lapisan UI/frontend, meskipun operasi API secara formal dikembalikan sebagai error. Berbeda dengan §6-2 yang hanya mengkonfirmasi keberadaan objek melalui perbedaan pesan error, §6-4 mengekspos konten aktual objek melalui side-effect rendering — tanpa data tersebut pernah muncul di HTTP response body.

Pola ini paling sering muncul pada aplikasi SPA modern yang menggunakan GraphQL, karena spesifikasi GraphQL memperbolehkan data dan errors hadir bersamaan dalam satu respons, dan framework seperti Apollo Client atau React Query melakukan optimistic update atau partial cache population sebelum error handling selesai dieksekusi.

SubtipeMekanismeKondisi Utama
Mutation-triggered UI render leakMutation gagal di API level (NOT_FOUND/FORBIDDEN), tetapi UI tetap merender nama atau atribut objek yang direferensikan di halaman attackerServer memproses referensi objek cukup jauh untuk menulis ke UI state sebelum permission check final; atau frontend tidak memisahkan “operasi berhasil” dari “objek ada di store”
Optimistic update disclosureFramework frontend melakukan optimistic update sebelum konfirmasi server — state optimistic mengekspos data objek korban dan tidak di-rollback dengan benarOptimistic update diimplementasikan tanpa rollback atomik; atau rollback terjadi setelah data sudah ter-render dalam window yang cukup untuk dibaca
GraphQL partial response cache leakGraphQL mengembalikan {"data": null, "errors": [...]} namun Apollo Client / client cache mempopulasi store dari partial data sebelum error di-handle, sehingga data objek korban dapat diakses via cache queryGraphQL client tidak membersihkan cache entry untuk operasi yang gagal; normalized cache menyimpan fragment objek meski mutation ditolak

§7. Manipulasi Temporal dan Berbasis State

Keputusan otorisasi dapat dibatalkan oleh timing attack, transisi state, dan manipulasi alur kerja.

§7-1. Race Condition / TOCTOU IDOR

SubtipeMekanismeKondisi Utama
Concurrent request authorization bypassMengirimkan permintaan simultan untuk mengubah kepemilikan objek dan mengakses objek; satu permintaan lolos pemeriksaan sebelum yang lain mengubah statePola check-then-act non-atomik dalam otorisasi
Permission change raceMengakses resource dalam jendela antara pencabutan izin dan penegakannyaPropagasi izin asinkron; keputusan otorisasi yang di-cache
Token refresh raceMenggunakan sesi/token lama untuk mengakses objek selama jendela di mana token baru (dengan izin terbatas) sedang diterbitkanValidasi token di-cache; revokasi tidak instan

§7-2. Penyalahgunaan Alur Kerja dan Transisi State

SubtipeMekanismeKondisi Utama
Multi-step process ID swapDalam alur kerja multi-langkah (misalnya buat → konfigurasi → kirim), menukar object ID antar langkah untuk melampirkan tindakan penyerang ke objek korbanOtorisasi diperiksa pada langkah 1 tetapi tidak diverifikasi ulang pada langkah berikutnya
Draft/pending state accessMengakses objek dalam state pra-publikasi (misalnya draft post, pesanan yang tertunda) melalui referensi ID langsungVisibilitas berbasis state tidak diterapkan di lapisan akses objek

§8. Eksploitasi Konteks Arsitektur dan Deployment

Arsitektur deployment aplikasi modern menciptakan celah otorisasi di batas-batas sistem yang mungkin tidak ditangani oleh layanan individual.

§8-1. Pelanggaran Trust Boundary Microservice

SubtipeMekanismeKondisi Utama
Inter-service trust assumptionLayanan A mengautentikasi pengguna dan meneruskan konteks pengguna ke Layanan B; Layanan B mempercayai otorisasi Layanan A tanpa memeriksanya ulangPola “trusted caller” antar microservice; tidak ada otorisasi end-to-end
API gateway bypassMengakses langsung endpoint microservice backend yang melewati lapisan otorisasi API gatewayLayanan backend terekspos di jaringan internal tetapi dapat dijangkau via SSRF atau jaringan yang salah konfigurasi
Service mesh token reuseMenggunakan token service-to-service yang diperoleh untuk satu tujuan untuk mengakses objek di layanan lainToken layanan berbutir kasar tanpa scope di level objek

§8-2. Vektor Spesifik Mobile dan Client-Side

SubtipeMekanismeKondisi Utama
Mobile API parameter exposureAplikasi mobile mengirimkan object ID yang tersembunyi di UI tetapi terlihat dalam traffic yang diintersep (misalnya via Burp Suite/mitmproxy)Backend mobile mempercayai pembatasan UI client-side sebagai kontrol akses
Offline cache exploitationAplikasi mobile menyimpan objek secara lokal dengan ID mereka; reverse-engineering cache mengungkapkan ID yang dapat digunakan terhadap APIPenyimpanan/cache lokal berisi ID untuk objek di luar scope otorisasi pengguna
Deep link / URL scheme abuseMembuat deep link seperti myapp://user/456/profile untuk memicu aplikasi mengambil profil pengguna lain tanpa otorisasiHandler deep link tidak memverifikasi otorisasi sebelum mengambil objek yang direferensikan

§8-3. Vektor Cloud dan Infrastruktur

SubtipeMekanismeKondisi Utama
Cloud storage object ID guessingMengakses https://bucket.s3.amazonaws.com/user_456_document.pdf dengan memodifikasi pola nama fileObjek cloud storage diberi nama dengan pola yang dapat diprediksi; tidak ada kebijakan IAM per-objek
Shared database tanpa row-level securityBeberapa microservice berbagi database; satu layanan melakukan query tanpa filter tenant/user yang diterapkan layanan lainDatastore bersama; otorisasi diterapkan di lapisan aplikasi, bukan di lapisan database

Pemetaan Skenario Serangan (Sumbu 3)

SkenarioArsitekturKategori Mutasi UtamaDampak Tipikal
Akses data horizontalAplikasi web/API apa pun§1 + §2 + §6-1Eksposur PII, pelanggaran privasi
Vertical privilege escalationSistem berbasis peran§5-1 + §3-1 + §5-2Akses admin, kontrol konfigurasi
Cross-tenant breachSaaS multi-tenant§5-3 + §8-1 + §2-3Kompromi data tenant penuh
Mass data exfiltrationAPI dengan ID yang dapat dienumerasi§1-1 + §6-1 + §4-1Pelanggaran data berskala besar
Account takeover chainAplikasi dengan API profil/pengaturan§2-3 + §6-2 + §7-2Perubahan email/kata sandi → ATO penuh
Financial manipulationSistem pembayaran/penagihan§5-2 + §7-1 + §3-3Manipulasi saldo, transaksi tidak diotorisasi
Destructive blind IDORAPI mana pun yang mendukung penulisan§6-2 + §3-1 + §2-2Penghapusan data, gangguan layanan
Supply chain compromiseSistem CI/CD dan artifact§8-1 + §4-3 + §5-3Modifikasi build/deploy tidak diotorisasi
IoT/device takeoverPlatform manajemen IoT§8-2 + §1-1 + §5-3Kontrol perangkat, manipulasi firmware

Pemetaan CVE / Bug Bounty (2023–2025)

Kombinasi MutasiCVE / KasusDampak / Bounty
§1-1 + §4-1 (Sequential ID + REST sub-resource)CVE-2024-1313 (Grafana)Akses snapshot dashboard oleh pengguna yang tidak terautentikasi di Grafana (20 juta+ pengguna). Patch di v10.4.1
§1-1 + §5-3 (Sequential ID + multi-tenant)CVE-2024-46528 (KubeSphere v3.4.1/v4.1.1)Pengguna berhak rendah mengakses resource cluster Kubernetes sensitif lintas tenant
§4-1 + §5-1 (REST endpoint + horizontal access)CVE-2023-3285 hingga CVE-2023-3290 (Easy!Appointments)6 kerentanan BOLA dalam rentang CVE ini. Akses penuh ke data pasien/janji temu
§4-1 + §8-1 (REST + microservice trust)CVE-2024-22278 (Harbor)BOLA di container registry cloud-native; akses tidak diotorisasi ke container image dan repositori
§1-1 + §2-1 (Sequential ID + path param)CVE-2024-56404 (One Identity Manager 9.x)IDOR di sistem manajemen identitas; akses ke record identitas di seluruh perusahaan
§2-3 + §5-2 (Body param + mass assignment)CVE-2024-1626 (Lunary AI)IDOR di platform AI yang memungkinkan akses data tidak diotorisasi
§1-1 + §5-1 (Numeric ID + horizontal)CVE-2024-55471 (Oqtane Framework)IDOR yang memungkinkan akses data lintas pengguna dalam framework CMS .NET
§1-1 + §2-1 (Numeric param + path param)CVE-2025-40658 (DM Corporative CMS < 2025.01)CVSS 7.5. IDOR di panel admin melalui manipulasi parameter option di /administer/selectionnode/framesSelection.asp.
§1-1 + §6-1 (Enumerable ID + direct feedback)HackerOne PayPal$10.500. IDOR untuk menambahkan pengguna sekunder dalam manajemen akun bisnis PayPal
§6-2 + §3-1 (Blind IDOR + method bypass)HackerOne various$12.500. IDOR yang memungkinkan penghapusan lisensi/sertifikasi dari profil pengguna lain
§5-3 + §8-3 (Cross-tenant + cloud)Growatt Solar IoT (2025)BOLA dalam API inverter surya memungkinkan peretas mengambil kendali perangkat IoT lintas organisasi
§1-3 → §1-1 → §4-2 → §6-4IDOR Vulnerability at AddTagToAssets operation nameLead to disclose all of victim’s new custom tags without any interaction with victim.

Tool Deteksi

ToolCakupan TargetTeknik Inti
BOLABuster (Palo Alto Unit 42)REST API dengan spesifikasi OpenAPIAnalisis berbasis LLM dari spesifikasi API; menghasilkan test case BOLA secara otomatis; mengirim <1% permintaan dibanding fuzzer tradisional
Autorize (Ekstensi Burp)Aplikasi web apa pun via proxyMemutar ulang permintaan dengan sesi hak rendah; membandingkan respons untuk mendeteksi bypass otorisasi
AuthMatrix (Ekstensi Burp)Aplikasi web dengan akses berbasis peranPengujian berbasis matriks dari pengguna × endpoint × method; menyoroti celah otorisasi secara visual
APIsec ScannerREST dan GraphQL APIDeteksi BOLA otomatis dengan pemahaman logika bisnis; integrasi CI/CD
Cloudflare API ShieldAPI di belakang CloudflareDeteksi BOLA runtime via analisis pola traffic; memberi label endpoint dengan cf-risk-bola-enumeration dan cf-risk-bola-pollution
AktoREST dan GraphQL APIPengujian BOLA via parameter pollution; generasi test otomatis dari traffic API
Cequence UAPPlatform API enterprisePenemuan API berbasis jaringan + analisis perilaku; mendeteksi pola enumerasi saat runtime
InQL (Ekstensi Burp)GraphQL APIAnalisis introspeksi GraphQL; mengidentifikasi tipe yang dapat di-query dan authorization test surface
GraphQL VoyagerGraphQL APIVisualisasi skema; memetakan relationship graph untuk mengidentifikasi traversal path kritis otorisasi
Nuclei (ProjectDiscovery)Pemindaian kerentanan umumPemindaian berbasis template dengan template spesifik IDOR untuk pola umum
OWASP ZAP Access Control PluginAplikasi webPengujian kontrol akses melalui perbandingan konteks pengguna

Ringkasan: Prinsip Inti

Properti fundamental yang membuat IDOR/BOLA menjadi kelas kerentanan web paling persisten adalah pemisahan antara autentikasi dan otorisasi. Framework web modern secara universal menyediakan middleware autentikasi (manajemen sesi, validasi JWT, alur OAuth) yang diadopsi developer secara default. Namun, tidak ada framework yang dapat secara otomatis menentukan pengguna terautentikasi mana yang seharusnya mengakses objek spesifik mana — ini pada dasarnya merupakan keputusan logika bisnis. Hasilnya adalah celah yang sistematis: developer dengan benar memverifikasi siapa pengguna tersebut, tetapi mengabaikan verifikasi apa yang seharusnya diakses pengguna tersebut. Setiap endpoint yang menerima identifier objek yang disuplai pengguna adalah potensi attack surface IDOR, dan dengan proliferasi RESTful API, GraphQL, dan microservice, jumlah endpoint tersebut per aplikasi telah tumbuh dari puluhan menjadi ribuan.

Perbaikan inkremental gagal karena IDOR bukan satu bug melainkan kelalaian arsitekturil. Menambal satu endpoint meninggalkan ratusan lainnya tanpa perlindungan. Mengganti ID sekuensial dengan UUID menggeser serangan dari enumerasi ke eksploitasi kebocoran tanpa mengatasi akar masalah. Menambahkan API gateway memindahkan masalah otorisasi, bukan menyelesaikannya. Bahkan tool pemindaian otomatis kesulitan karena BOLA adalah cacat semantik — menentukan apakah Pengguna A seharusnya mengakses Objek X memerlukan pemahaman aturan bisnis aplikasi, bukan hanya perilaku HTTP-nya. Inilah mengapa BOLA telah mempertahankan posisi #1 dalam OWASP API Security Top 10 sejak 2019.

Solusi struktural membutuhkan arsitektur authorization-by-default: setiap operasi akses data harus melewati lapisan otorisasi yang mengevaluasi kepemilikan/izin sebelum mengembalikan data. Ini dapat diimplementasikan sebagai kebijakan row-level security (RLS) di level database, query scoping di level ORM (misalnya selalu memfilter berdasarkan tenant_id dan user_id), atau policy engine di level middleware (misalnya OPA, Casbin, Cedar). Prinsip arsitektur utamanya adalah bahwa otorisasi harus bersifat wajib dan tidak dapat dihindari — tidak ada jalur kode yang harus dapat mengakses objek tanpa melewati gerbang otorisasi. Dikombinasikan dengan integration testing komprehensif yang memverifikasi bahwa akses lintas pengguna ditolak untuk setiap endpoint (menggunakan tool seperti Autorize atau BOLABuster), ini mengubah IDOR dari masalah penambalan endpoint-per-endpoint menjadi jaminan sistemik.


Referensi


Dokumen ini dibuat untuk keperluan riset keamanan defensif dan pemahaman kerentanan.