Home Pelajaran Web Security Insecure Direct Object References (IDOR)
Pemula 20 min Web Security

Insecure Direct Object References (IDOR)

IDOR: mengakses data pengguna lain dengan mengubah ID di URL. UUID vs auto-increment, reference maps, vertical vs horizontal.

Insecure Direct Object References (IDOR) adalah kerentanan di mana aplikasi mengekspos referensi langsung ke object internal (seperti ID database) dan penyerang bisa memanipulasinya untuk mengakses data milik pengguna lain. IDOR sangat umum dan sering diabaikan karena kesederhanaannya.

Bagaimana IDOR Bekerja

Contoh klasik: URL profil yang menggunakan ID numerik langsung.

IDOR Example
# User A mengakses profilnya:
GET /profile.php?user_id=123

# User A mengubah user_id menjadi 124:
GET /profile.php?user_id=124

# Jika aplikasi TIDAK memvalidasi ownership — User A melihat data User B!

Di Mana IDOR Sering Ditemukan

  • URL Parameters: /invoice?id=1001, /user/123, /doc/456.pdf
  • POST Body: {"user_id": 789, "action": "delete"}
  • API Endpoints: /api/v1/users/456/orders
  • Cookies/Headers: X-User-ID: 999

Teknik Eksploitasi IDOR

Enumerasi Massal

Gunakan Burp Intruder atau script untuk mengakses ID secara berurutan:

Bash Loop IDOR
for i in $(seq 1 1000); do
  curl -s -b "session=..." "https://target.com/profile?id=$i" | grep "email"
done

IDOR dengan UUID

UUID lebih sulit ditebak tapi IDOR tetap mungkin jika UUID bocor di response lain atau referer header.

Pencegahan IDOR

  • Jangan gunakan ID database langsung — gunakan reference map atau random tokens
  • Validasi ownership — selalu cek apakah user yang login adalah pemilik resource
  • Gunakan UUID/GUID — lebih baik dari auto-increment integer, tapi bukan solusi lengkap
  • Authorization check setiap request — jangan asumsikan user hanya akses datanya sendiri
PHP (Aman)
// Selalu cek ownership sebelum memberikan data
$id = $_GET["id"];
$userId = $_SESSION["user_id"];

// Cek apakah user adalah pemilik resource
$stmt = $pdo->prepare("SELECT * FROM profiles WHERE id = ? AND user_id = ?");
$stmt->execute([$id, $userId]);
$data = $stmt->fetch();

Referensi

  • OWASP IDOR: https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/04-Testing_for_Insecure_Direct_Object_References
  • PortSwigger IDOR: https://portswigger.net/web-security/access-control/idor