DEV Community

Cover image for Praktikum Keamanan Web: Broken Access Control & Insecure Direct Object Reference (IDOR) πŸ˜±πŸ”“
ahmadasroni38
ahmadasroni38

Posted on

Praktikum Keamanan Web: Broken Access Control & Insecure Direct Object Reference (IDOR) πŸ˜±πŸ”“

Halo, teman-teman mahasiswa! Selamat datang di praktikum super penting tentang Broken Access Control – vulnerability nomor 1 di OWASP Top 10 tahun 2025! Ini termasuk Insecure Direct Object Reference (IDOR), yang kayak pintu samping rumah yang lupa dikunci. Bayangkan kamu login sebagai user biasa, tapi cuma ganti angka di URL (misal /profile/123 jadi /profile/456), terus langsung bisa lihat atau edit data orang lain: profile, invoice, foto pribadi, bahkan delete akun! Serem banget kan? Hacker bisa curi data massal tanpa perlu password.

Ini beda dari authentication (yang cek "siapa kamu"), tapi authorization (yang cek "boleh nggak kamu akses ini?"). Yuk kita pelajari bareng, santai tapi seru, dengan contoh Laravel gampang dicoba di localhost!

Kartun hacker lagi eksploitasi IDOR ini lucu tapi nunjukin bahayanya – ganti ID doang, data orang lain kebuka! πŸ˜‚

Ilustrasi SVG keren ini gambarin konsep Broken Access Control secara visual – user biasa nyelonong ke area terlarang!

Apa Itu Broken Access Control & IDOR? πŸ€”

Broken Access Control terjadi saat aplikasi nggak cek hak akses dengan benar. IDOR adalah jenis paling umum: Aplikasi pakai reference langsung (seperti ID di database) tanpa verifikasi ownership.

Contoh sederhana: URL /user/5/edit β†’ Kalau nggak dicek, user ID 10 bisa edit user ID 5.

Diagram attack IDOR ini jelas banget: Attacker ganti reference object langsung, bypass authorization!

Flowchart serangan IDOR ini step-by-step – dari request normal sampai exploit ganti ID!

Contoh 1: Lihat Profile Orang Lain (Klasik IDOR!) πŸ‘€

Controller rentan:

public function show($id) {
    $user = User::findOrFail($id);  // Ambil user berdasarkan ID tanpa cek!
    return view('profile.show', compact('user'));
}
Enter fullscreen mode Exit fullscreen mode

Route: Route::get('/profile/{id}', [ProfileController::class, 'show']);

Kamu login sebagai user ID 10, buka /profile/10 β†’ Aman.

Hacker ganti jadi /profile/11 β†’ Langsung lihat data user lain: email, nomor HP, alamat!

Contoh 2: Edit atau Delete Data Orang Lain πŸ–ŠοΈπŸ—‘οΈ

Controller rentan:

public function update(Request $request, $id) {
    $user = User::findOrFail($id);
    $user->update($request->all());  // Update tanpa cek ownership
}
Enter fullscreen mode Exit fullscreen mode

Hacker kirim POST ke /user/999/update dengan data jahat β†’ Ubah email/password user lain.

Atau delete: User::findOrFail($id)->delete(); β†’ Hapus akun orang!

Contoh 3: Akses Invoice atau Order di E-Commerce 🧾

URL: /invoice/12345

User biasa ganti angka sequentially (12345, 12346, ...) β†’ Download semua invoice customer lain. Bisa curi data kartu kredit atau alamat!

Contoh 4: Admin Panel Tanpa Cek Role πŸ‘‘

Controller:

public function dashboard() {
    if (!auth()->check()) abort(403);
    // Hanya cek login, nggak cek role!
    return view('admin.dashboard');
}
Enter fullscreen mode Exit fullscreen mode

User biasa akses /admin/dashboard β†’ Lihat semua data sensitif.

Cara Mencegah di Laravel (Super Mudah & Keren!) πŸ›‘οΈβœ¨

Laravel punya tools pro: Policy, Gate, Middleware, dan $this->authorize().

  1. Pakai Policy (Rekomendasi untuk Model!) Buat policy: php artisan make:policy UserPolicy --model=User

Di UserPolicy.php:

   public function view(User $authUser, User $targetUser) {
       return $authUser->id === $targetUser->id;  // Hanya boleh lihat milik sendiri
   }

   public function update(User $authUser, User $targetUser) {
       return $authUser->id === $targetUser->id || $authUser->is_admin;
   }
Enter fullscreen mode Exit fullscreen mode

Di Controller:

   public function show(User $user) {  // Route Model Binding
       $this->authorize('view', $user);  // Otomatis cek policy!
       return view('profile.show', compact('user'));
   }
Enter fullscreen mode Exit fullscreen mode

Gambar ini nunjukin cara prevent Broken Access Control di Laravel – pakai policy & gate!

Contoh kode Laravel secure dengan authorization – langsung aman!

  1. Manual Check (Simple)
   if (auth()->id() !== $user->id) abort(403);
Enter fullscreen mode Exit fullscreen mode
  1. Middleware untuk Admin Buat middleware admin, apply ke route group.

Latihan Seru Buat Kamu! πŸ’ͺπŸ”₯

  1. Buat profile viewer rentan, test IDOR dengan ganti ID di URL.
  2. Tambahin policy, test lagi (harusnya 403 Forbidden!).
  3. Buat fitur invoice, exploit sequential ID.
  4. Implementasikan Gate untuk admin-only feature.

Selamat praktikum, guys! Broken Access Control/IDOR ini vulnerability "pintu samping" yang sering terlupakan, tapi dengan Laravel Policy & authorize, aplikasi kamu aman kayak benteng kerajaan πŸ‘‘πŸ”’ Jadi developer yang pro security dari sekarang! Ingat: Selalu cek ownership & role sebelum akses data! Keep coding safely and have fun! πŸŽ‰πŸ˜

Top comments (0)