Server-Side Request Forgery (SSRF)
Pendahuluan
Server-Side Request Forgery (SSRF) adalah kerentanan yang memungkinkan penyerang memaksa server aplikasi untuk membuat HTTP request ke target yang tidak diinginkan. Penyerang mengeksploitasi fitur aplikasi yang melakukan request ke URL eksternal (seperti webhook, fetch metadata, import gambar, atau proxy) untuk mengakses resource internal yang seharusnya tidak terjangkau dari luar.
SSRF sangat berbahaya karena server aplikasi biasanya memiliki akses ke jaringan internal, layanan cloud metadata, dan sistem backend yang tidak terekspos ke internet.
Cara Kerja SSRF
Aplikasi yang rentan SSRF biasanya memiliki fungsionalitas seperti:
- Import file dari URL:
http://example.com/document.pdf - Webhook callback: Konfigurasi URL notifikasi
- Proxy API: Server menerima URL dan mengambil kontennya
- Image processing: Memuat gambar dari URL eksternal
- SSO / OAuth callback
Penyerang mengganti URL target dengan alamat internal atau layanan sensitif.
Contoh Serangan SSRF
1. Internal Network Scanning
Penyerang dapat memindai port internal dengan memanipulasi URL:
http://vuln.cybersecurity.or.id/admin
http://127.0.0.1:22
http://192.168.1.1:80
http://10.0.0.1:3306
Respons atau waktu respons server mengungkapkan port mana yang terbuka.
2. Cloud Metadata Service Access
Ini adalah salah satu serangan SSRF paling kritis. Setiap penyedia cloud menyediakan metadata endpoint yang hanya bisa diakses dari dalam instance.
AWS (Endpoint: http://169.254.169.254/latest/meta-data/):
http://169.254.169.254/latest/meta-data/iam/security-credentials/
http://169.254.169.254/latest/meta-data/iam/security-credentials/admin-role
Dengan mengakses endpoint ini, penyerang bisa mendapatkan AWS temporary credentials (access key, secret key, token).
GCP (Endpoint: http://metadata.google.internal/):
http://metadata.google.internal/computeMetadata/v1/project/project-id
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
GCP memerlukan header Metadata-Flavor: Google untuk
mengakses metadata, yang bisa dilewati dengan teknik redirect.
Azure (Endpoint: http://169.254.169.254/metadata/instance):
http://169.254.169.254/metadata/instance?api-version=2021-02-01
Azure memerlukan header Metadata: true dan parameter
query.
3. File Access via URL Schemes
Penyerang dapat membaca file lokal menggunakan skema URL:
file:///etc/passwd
file:///etc/shadow
file:///proc/1/environ
4. Blind SSRF
Penyerang tidak melihat respons langsung tetapi dapat menyimpulkan informasi melalui timing attack atau out-of-band channels (DNS, HTTP callback). Contoh:
- Out-of-band SSRF: Aplikasi melakukan DNS lookup ke domain penyerang
- Timing-based SSRF: Respon lambat menunjukkan koneksi berhasil (port terbuka)
- Error-based SSRF: Perbedaan pesan error mengungkapkan informasi internal
Dampak SSRF
- Eksfiltrasi Cloud Credentials: Akses ke IAM roles pada AWS/GCP/Azure.
- Internal Network Pivot: Akses ke sistem internal yang tidak terekspos (database, Redis, internal API).
- Remote Code Execution: Eksploitasi aplikasi internal yang rentan.
- Data Leakage: Membaca file lokal server.
- Denial of Service: Memicu koneksi ke resource yang lambat atau besar.
Mitigasi
1. Allowlist Domain / IP
Pertahanan paling efektif adalah daftar putih (allowlist) domain atau IP yang diizinkan untuk diakses.
ALLOWED_DOMAINS = ['api.trusted.com', 'cdn.example.com']
Jika tidak memungkinkan, gunakan blocklist dengan hati-hati - blocklist seringkali bisa di-bypass.
2. Validasi URL
- Parsing URL dengan benar dan validasi komponennya
- Blokir penggunaan hostname localhost, 127.0.0.1, 0.0.0.0, alamat broadcast
- Blokir alamat IPv4 internal (10.x.x.x, 172.16-31.x.x, 192.168.x.x)
- Blokir skema URL berbahaya (file://, gopher://, dict://)
3. Disable Unused Protocols
Batasi protokol yang didukung aplikasi hanya ke HTTP/HTTPS:
if url.scheme not in ['http', 'https']:
raise ValueError("Protocol not allowed")
4. Network Segmentation
- Pisahkan jaringan aplikasi dari jaringan internal sensitif
- Gunakan firewall untuk membatasi akses keluar dari server aplikasi
- Implementasikan egress filtering: hanya izinkan koneksi keluar ke domain yang diperlukan
5. Non-Routable Address Blocking
Di level firewall atau proxy, blokir koneksi ke alamat:
169.254.169.254(cloud metadata)0.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16127.0.0.0/8(localhost)100.64.0.0/10(CG-NAT)
6. Gunakan Library yang Aman
Gunakan library HTTP yang tidak mengikuti redirect ke protokol berbeda:
import requests
session = requests.Session()
session.max_redirects = 5
# Jangan izinkan redirect dari HTTP ke file://
7. Authentication untuk Metadata Services
Di environment cloud, gunakan IMDSv2 (AWS) yang menggunakan sesi token berbasis PUT request untuk mengakses metadata, membuatnya lebih sulit dieksploitasi via SSRF.
Kesimpulan
SSRF adalah kerentanan serius yang sering diremehkan tetapi dapat mengakibatkan kompromi total infrastruktur cloud. Pertahanan terbaik adalah kombinasi validasi URL yang ketat, allowlist, network segmentation, dan pembatasan protokol. Di era cloud-native di mana metadata service menjadi target utama, SSRF mitigation harus menjadi prioritas dalam security review.