Insecure Direct Object References (IDOR): Difference between revisions

From DefacerID Encyclopedia
No edit summary
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
'''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.
'''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.[[File:Insecure-direct-object-reference.png|thumb|IDOR (https://spanning.com/blog/insecure-direct-object-reference-web-based-application-security-part-6/)]]
 
== Sejarah ==
== Sejarah ==
[[File:Insecure-direct-object-reference.png|thumb|IDOR (https://spanning.com/blog/insecure-direct-object-reference-web-based-application-security-part-6/)]]
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.
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.


Line 9: Line 7:


=== Contoh IDOR ===
=== Contoh IDOR ===
Misalkan ada aplikasi web yang memungkinkan pengguna melihat faktur mereka dengan mengakses URL berikut:<syntaxhighlight lang="http">
GET /invoice/view?invoice_id=12345
</syntaxhighlight>


Misalkan ada aplikasi web yang memungkinkan pengguna melihat faktur mereka dengan mengakses URL berikut:
<code>GET /invoice/view?invoice_id=12345<br /></code>
Jika aplikasi tidak memverifikasi bahwa pengguna saat ini memiliki izin untuk mengakses faktur dengan ID tersebut, penyerang dapat memodifikasi parameter <code>invoice_id</code> untuk mengakses faktur milik pengguna lain:


Jika aplikasi tidak memverifikasi bahwa pengguna saat ini memiliki izin untuk mengakses faktur dengan ID tersebut, penyerang dapat memodifikasi parameter <code>invoice_id</code> untuk mengakses faktur milik pengguna lain:<syntaxhighlight lang="http">
<code>GET /invoice/view?invoice_id=54321</code>
GET /invoice/view?invoice_id=54321
</syntaxhighlight>


== Dampak Kerentanan ==
== Dampak Kerentanan ==
Line 25: Line 23:


=== JavaScript (Node.js) ===
=== JavaScript (Node.js) ===
Gunakan middleware atau logika aplikasi untuk memverifikasi izin akses:<syntaxhighlight lang="javascript">
Gunakan middleware atau logika aplikasi untuk memverifikasi izin akses:
app.get('/invoice/view', (req, res) => {
 
  const userId = req.user.id;
<code>app.get('/invoice/view', (req, res) => {</code>
  const invoiceId = req.query.invoice_id;
 
<code>  const userId = req.user.id;</code>
 
<code>  const invoiceId = req.query.invoice_id;</code>
 
<code>  Invoice.findOne({ where: { id: invoiceId, userId: userId } })</code>
 
<code>    .then(invoice => {</code>
 
<code>      if (!invoice) {</code>
 
<code>        return res.status(403).send('Unauthorized access');</code>


  Invoice.findOne({ where: { id: invoiceId, userId: userId } })
<code>      }</code>
    .then(invoice => {
 
      if (!invoice) {
<code>      res.json(invoice);</code>
        return res.status(403).send('Unauthorized access');
 
      }
<code>    })</code>
      res.json(invoice);
 
    })
<code>    .catch(err => res.status(500).send('Server error'));</code>
    .catch(err => res.status(500).send('Server error'));
 
});
<code>});</code>
</syntaxhighlight>


=== Python ===
=== Python ===
Gunakan pembatasan berdasarkan user ID sebelum mengakses sumber daya:<syntaxhighlight lang="python">
Gunakan pembatasan berdasarkan user ID sebelum mengakses sumber daya:
from flask import Flask, request, jsonify
 
from models import Invoice
<code>from flask import Flask, request, jsonify</code>
 
<code>from models import Invoice</code>


@app.route('/invoice/view', methods=['GET'])
<code>@app.route('/invoice/view', methods=['GET'])</code>
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()
<code>def view_invoice():</code>
    if not invoice:
        return jsonify({'error': 'Unauthorized access'}), 403


    return jsonify(invoice.to_dict())
<code>    user_id = request.user.id</code>
</syntaxhighlight>
 
<code>    invoice_id = request.args.get('invoice_id')</code>
 
<code>    invoice = Invoice.query.filter_by(id=invoice_id, user_id=user_id).first()</code>
 
<code>    if not invoice:</code>
 
<code>        return jsonify({'error': 'Unauthorized access'}), 403</code>
 
<code>    return jsonify(invoice.to_dict())</code>


=== Java ===
=== Java ===
Verifikasi izin akses di tingkat layanan atau kontroler:<syntaxhighlight lang="java">
Verifikasi izin akses di tingkat layanan atau kontroler:
public Invoice getInvoice(Long invoiceId, Long userId) {
 
    Optional<Invoice> invoice = invoiceRepository.findByIdAndUserId(invoiceId, userId);
<code>public Invoice getInvoice(Long invoiceId, Long userId) {</code>
    if (!invoice.isPresent()) {
 
        throw new UnauthorizedException("Unauthorized access");
<code>    Optional<Invoice> invoice = invoiceRepository.findByIdAndUserId(invoiceId, userId);</code>
    }
 
    return invoice.get();
<code>    if (!invoice.isPresent()) {</code>
}
 
</syntaxhighlight>
<code>        throw new UnauthorizedException("Unauthorized access");</code>
 
<code>    }</code>
 
<code>    return invoice.get();</code>
 
<code>}</code>


=== PHP ===
=== PHP ===
Gunakan validasi akses sebelum mengakses objek:<syntaxhighlight lang="php">
Gunakan validasi akses sebelum mengakses objek:
function getInvoice($invoiceId, $userId) {
 
    $query = "SELECT * FROM invoices WHERE id = ? AND user_id = ?";
<code>function getInvoice($invoiceId, $userId) {</code>
    $stmt = $pdo->prepare($query);
 
    $stmt->execute([$invoiceId, $userId]);
<code>    $query = "SELECT * FROM invoices WHERE id = ? AND user_id = ?";</code>
    $invoice = $stmt->fetch();
 
<code>    $stmt = $pdo->prepare($query);</code>
 
<code>    $stmt->execute([$invoiceId, $userId]);</code>
 
<code>    $invoice = $stmt->fetch();</code>
 
<code>    if (!$invoice) {</code>
 
<code>        throw new Exception('Unauthorized access');</code>
 
<code>    }</code>
 
<code>    return $invoice;</code>


    if (!$invoice) {
<code>}</code>
        throw new Exception('Unauthorized access');
    }
    return $invoice;
}
</syntaxhighlight>


=== Ruby ===
=== Ruby ===
Gunakan pembatasan akses sebelum memberikan respons:<syntaxhighlight lang="ruby">
Gunakan pembatasan akses sebelum memberikan respons:
def view_invoice
 
  invoice = Invoice.find_by(id: params[:invoice_id], user_id: current_user.id)
<code>def view_invoice</code>
  if invoice.nil?
 
    render plain: 'Unauthorized access', status: :forbidden
<code>  invoice = Invoice.find_by(id: params[:invoice_id], user_id: current_user.id)</code>
  else
 
    render json: invoice
<code>  if invoice.nil?</code>
  end
 
end
<code>    render plain: 'Unauthorized access', status: :forbidden</code>
</syntaxhighlight>
 
<code>  else</code>
 
<code>    render json: invoice</code>
 
<code>  end</code>
 
<code>end</code>


== Kesimpulan ==
== 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.
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.
[[Category:Vulnerability]]

Latest revision as of 00:23, 8 August 2024

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.

IDOR (https://spanning.com/blog/insecure-direct-object-reference-web-based-application-security-part-6/)

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.