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

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.

TARGET OBJECTIVE & BRIEFING

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.

PENTESTING METHODOLOGY
1. Buka formulir login target pada lingkungan praktik.
2. Uji karakter petik tunggal (') pada kolom Username untuk memeriksa apakah terjadi SQL Syntax Error atau kegagalan respon.
3. Masukkan payload boolean logic seperti `admin' OR '1'='1` atau `administrator'--` untuk memotong verifikasi password.
4. Apabila berhasil, aplikasi akan merespon dengan status login Administrator dan memunculkan Flag Verifikasi.
CODE SECURITY INSPECTION

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' });
  });
});