CODEBOOK
Website Platform Belajar Dan Edukasi
By Shadownex 2025-2026
← Kembali ke Katalog Lab
SQL InjectionUNSOLVEDReward: +150 XP

Lab 7: SQL injection UNION attack allowing database table exfiltration

Fitur pencarian katalog produk e-commerce rentan terhadap UNION SELECT SQL Injection, memungkinkan penyerang membaca data dari tabel rahasia sistem.

TARGET OBJECTIVE & BRIEFING

Objective:

Hitung jumlah kolom query asli dengan `ORDER BY`, lalu gabungkan query menggunakan `UNION SELECT` untuk mengekstrak kredensial admin dari tabel `system_credentials`.

Aplikasi Apex Marketplace menyajikan katalog barang menggunakan query SQL pencarian teks: `SELECT id, name, category, price FROM products WHERE name LIKE '%[SEARCH]%'` Karena input pencarian disisipkan langsung tanpa sanitasi, Anda dapat menyisipkan klausa `UNION SELECT` untuk memaksa database mengembalikan baris data dari tabel rahasia `system_credentials`.

PENTESTING METHODOLOGY
1. Akses halaman pencarian katalog produk.
2. Masukkan payload `' ORDER BY 1--`, `' ORDER BY 2--`, dst., hingga menemukan batas error kolom (4 kolom).
3. Uji tipe data string pada kolom: `' UNION SELECT 'a', 'b', 'c', 'd'--`.
4. Ekstrak data rahasia dengan payload: `' UNION SELECT 1, username, 0, password_hash FROM system_credentials--`.
5. Salin Flag rahasia dari baris hasil pencarian.
CODE SECURITY INSPECTION

Serangan UNION SELECT terjadi saat penyerang menggabungkan dua kueri terpisah. CodeBook mencegahnya dengan Parameterized Queries di mana variabel input tidak diinterpretasikan sebagai operator SQL.

VULNERABLE CODE

// KODE RENTAN (String Interpolation)
app.get('/api/products/search', (req, res) => {
  const { q } = req.query;
  // DANGEROUS: Input disisipkan langsung ke klausa LIKE
  const query = `SELECT id, name, category, price FROM products WHERE name LIKE '%${q}%'`;
  
  db.query(query, (err, rows) => {
    if (err) return res.status(500).json({ error: err.message });
    res.json({ results: rows });
  });
});

SECURE CODEBOOK IMPLEMENTATION

// KODE AMAN CODEBOOK STANDARD (Parameterized LIKE Query)
app.get('/api/products/search', (req, res) => {
  const { q } = req.query;
  // SAFE: Parameterized Query memisahkan token SQL dari nilai pencarian
  const query = 'SELECT id, name, category, price FROM products WHERE name LIKE $1';
  
  db.query(query, [`%${q}%`], (err, rows) => {
    if (err) return res.status(500).json({ error: 'Terjadi kesalahan sistem' });
    res.json({ results: rows });
  });
});