Insecure Direct Object References (IDOR)
Insecure Direct Object References (IDOR) adalah salah satu kerentanan keamanan aplikasi web yang terjadi ketika aplikasi memberikan akses langsung ke objek atau sumber daya berdasarkan input pengguna tanpa validasi atau kontrol akses yang memadai. Kerentanan ini memungkinkan penyerang untuk mengakses atau memodifikasi data yang seharusnya tidak dapat mereka akses.
Sejarah
Konsep IDOR pertama kali mendapatkan perhatian luas dengan publikasi OWASP Top Ten, yang memperkenalkannya sebagai salah satu risiko keamanan aplikasi web yang paling umum. IDOR menjadi semakin penting dengan pertumbuhan aplikasi berbasis web dan API, di mana kontrol akses yang tidak memadai dapat mengekspos data sensitif.
Cara Kerja IDOR
IDOR terjadi ketika aplikasi web menggunakan parameter input untuk secara langsung merujuk ke objek atau sumber daya tanpa memverifikasi bahwa pengguna memiliki izin untuk mengakses objek tersebut. Parameter ini bisa berupa ID database, nama file, atau elemen lain yang merujuk langsung ke sumber daya internal.
Contoh IDOR
Misalkan ada aplikasi web yang memungkinkan pengguna melihat faktur mereka dengan mengakses URL berikut:
GET /invoice/view?invoice_id=12345
Jika aplikasi tidak memverifikasi bahwa pengguna saat ini memiliki izin untuk mengakses faktur dengan ID tersebut, penyerang dapat memodifikasi parameter invoice_id
untuk mengakses faktur milik pengguna lain:
GET /invoice/view?invoice_id=54321
Dampak Kerentanan
IDOR dapat mengakibatkan pengungkapan data sensitif, seperti informasi pribadi, catatan medis, atau informasi keuangan. Selain itu, kerentanan ini dapat dimanfaatkan untuk melakukan tindakan yang tidak sah, seperti mengubah data atau mendapatkan akses administratif ke sistem.
Cara Mencegah IDOR
Untuk mencegah IDOR, penting untuk menerapkan kontrol akses yang ketat dan memverifikasi otorisasi pengguna sebelum memberikan akses ke objek atau sumber daya. Berikut adalah beberapa pendekatan pencegahan dalam berbagai bahasa pemrograman:
JavaScript (Node.js)
Gunakan middleware atau logika aplikasi untuk memverifikasi izin akses:
app.get('/invoice/view', (req, res) => {
const userId = req.user.id;
const invoiceId = req.query.invoice_id;
Invoice.findOne({ where: { id: invoiceId, userId: userId } })
.then(invoice => {
if (!invoice) {
return res.status(403).send('Unauthorized access');
}
res.json(invoice);
})
.catch(err => res.status(500).send('Server error'));
});
Python
Gunakan pembatasan berdasarkan user ID sebelum mengakses sumber daya:
from flask import Flask, request, jsonify
from models import Invoice
@app.route('/invoice/view', methods=['GET'])
def view_invoice():
user_id = request.user.id
invoice_id = request.args.get('invoice_id')
invoice = Invoice.query.filter_by(id=invoice_id, user_id=user_id).first()
if not invoice:
return jsonify({'error': 'Unauthorized access'}), 403
return jsonify(invoice.to_dict())
Java
Verifikasi izin akses di tingkat layanan atau kontroler:
public Invoice getInvoice(Long invoiceId, Long userId) {
Optional<Invoice> invoice = invoiceRepository.findByIdAndUserId(invoiceId, userId);
if (!invoice.isPresent()) {
throw new UnauthorizedException("Unauthorized access");
}
return invoice.get();
}
PHP
Gunakan validasi akses sebelum mengakses objek:
function getInvoice($invoiceId, $userId) {
$query = "SELECT * FROM invoices WHERE id = ? AND user_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$invoiceId, $userId]);
$invoice = $stmt->fetch();
if (!$invoice) {
throw new Exception('Unauthorized access');
}
return $invoice;
}
Ruby
Gunakan pembatasan akses sebelum memberikan respons:
def view_invoice
invoice = Invoice.find_by(id: params[:invoice_id], user_id: current_user.id)
if invoice.nil?
render plain: 'Unauthorized access', status: :forbidden
else
render json: invoice
end
end
Kesimpulan
IDOR adalah kerentanan umum yang dapat memiliki dampak serius jika dieksploitasi. Menerapkan kontrol akses yang tepat dan memverifikasi izin pengguna sangat penting untuk melindungi aplikasi web dari ancaman ini. Dengan mengikuti praktik terbaik dalam pengembangan perangkat lunak, pengembang dapat mengurangi risiko IDOR dan menjaga keamanan data pengguna.