Lab 1: SQL injection vulnerability in WHERE clause allowing login bypass
Aplikasi E-Commerce "Apex CyberStore" memiliki celah keamanan SQL Injection pada formulir login di mana input pengguna digabungkan langsung ke query SQL.
Objective:
Bypass login administrator secara manual tanpa mengetahui password asli dengan mengeksploitasi parameter login menggunakan SQL Injection.
Aplikasi e-commerce Apex CyberStore menggunakan query database relasional untuk memverifikasi autentikasi pengguna pada endpoint /api/login. Karakter masukan pada kolom email/username digabungkan langsung secara mentah (String Concatenation) tanpa proses sanitasi atau parameterized query. Tugas Anda sebagai Security Tester adalah membuktikan bahwa akun administrator dapat diakses tanpa kredensial yang sah dengan menyuntikkan logika boolean SQL yang selalu bernilai TRUE.
Pada kode rentan, masukan pengguna dianggap sebagai sintaks eksekutabel oleh engine SQL. Pada standar CodeBook, Parameterized Query memisahkan kompilasi SQL dari data literal sehingga karakter seperti petik tunggal (') hanya dianggap sebagai string biasa.
VULNERABLE CODE
// KODE RENTAN (String Concatenation Query)
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
// DANGEROUS: Input dimasukkan langsung ke sintaks SQL!
const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
db.query(query, (err, rows) => {
if (rows.length > 0) return res.json({ success: true, user: rows[0] });
res.status(401).json({ error: 'Invalid credentials' });
});
});SECURE CODEBOOK IMPLEMENTATION
// KODE AMAN CODEBOOK STANDARD (Parameterized Query)
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
// SAFE: Parameterized Query memisahkan logika SQL dengan data input
const query = 'SELECT id, username, role FROM users WHERE username = $1 AND password = $2';
db.query(query, [username, password], (err, rows) => {
if (rows.length > 0) return res.json({ success: true, user: rows[0] });
res.status(401).json({ error: 'Invalid credentials' });
});
});