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.
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`.
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 });
});
});