Table of contents
Open Table of contents
Delimiters
Pemisah URL (URL delimiters) bervariasi tergantung framework dan server yang digunakan, yang memengaruhi cara permintaan diproses dan respons ditangani. Beberapa pemisah umum yang digunakan adalah:
- Titik koma: Digunakan dalam Spring untuk variabel matrix (contoh:
/hello;var=a/world;var1=b;var2=c
→/hello/world
). - Titik: Menunjukkan format respons di Ruby on Rails (contoh:
/MyAccount.css
→/MyAccount
). - Null Byte: Memotong path di OpenLiteSpeed (contoh:
/MyAccount%00aaa
→/MyAccount
). - Byte Newline: Memisahkan komponen URL di Nginx (contoh:
/users/MyAccount%0aaaa
→/account/MyAccount
).
Untuk menemukan pemisah lainnya, bisa mengikuti langkah-langkah berikut:
- Langkah 1: Identifikasi permintaan yang tidak dapat di-cache dan gunakan untuk memantau bagaimana URL dengan pemisah yang potensial ditangani.
- Langkah 2: Tambahkan sufiks acak pada path dan bandingkan respons server untuk menentukan apakah karakter tersebut berfungsi sebagai pemisah.
- Langkah 3: Masukkan pemisah potensial sebelum sufiks acak untuk melihat apakah respons berubah, yang menandakan penggunaan pemisah.
Normalisasi & Pengkodean
- Tujuan: Parser URL di server cache dan origin melakukan normalisasi URL untuk mengekstrak path untuk pemetaan endpoint dan cache key.
- Proses: Mengidentifikasi pemisah path, mengekstrak dan menormalkan path dengan mendekode karakter dan menghapus segmen titik.
Pengkodean
Berbagai server HTTP dan proxy seperti Nginx, Node, dan CloudFront mendekode pemisah dengan cara yang berbeda, yang menyebabkan inkonsistensi di antara CDN dan server origin yang bisa dieksploitasi. Misalnya, jika server web melakukan transformasi seperti /myAccount%3Fparam
→ /myAccount?param
, tetapi server cache tetap menyimpan path dengan key /myAccount%3Fparam
, maka akan ada inkonsistensi.
Cara untuk memeriksa inkonsistensi ini adalah dengan mengirim permintaan yang mengkodekan berbagai karakter setelah memuat path tanpa pengkodean dan memeriksa apakah respons dari path yang terkode dikembalikan dari respons yang disimpan di cache.
Segmen Titik
Normalisasi path yang melibatkan titik juga sangat menarik untuk serangan poisoning cache. Misalnya, /static/../home/index
atau /aaa..\home/index
, beberapa server cache akan menyimpan path ini dengan dirinya sendiri sebagai kunci sementara yang lain mungkin akan menyelesaikan path tersebut dan menggunakan /home/index
sebagai kunci cache.
Seperti sebelumnya, mengirim permintaan semacam ini dan memeriksa apakah respons berasal dari cache membantu untuk mengetahui jika respons untuk /home/index
sama dengan respons yang dikirim ketika path tersebut diminta.
Sumber Daya Statis
Beberapa server cache akan selalu menyimpan respons jika itu dikenali sebagai statis. Ini mungkin disebabkan oleh:
- Ekstensi: Cloudflare akan selalu menyimpan file dengan ekstensi berikut: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
- Anda bisa memaksa cache untuk menyimpan respons dinamis dengan menggunakan pemisah dan ekstensi statis seperti permintaan ke
/home$image.png
yang akan menyimpan/home$image.png
dan server origin akan merespons dengan/home
- Anda bisa memaksa cache untuk menyimpan respons dinamis dengan menggunakan pemisah dan ekstensi statis seperti permintaan ke
- Direktori statis yang dikenal: Direktori berikut berisi file statis dan oleh karena itu respons mereka seharusnya disimpan di cache: /static, /assets, /wp-content, /media, /templates, /public, /shared
- Anda bisa memaksa cache untuk menyimpan respons dinamis dengan menggunakan pemisah, direktori statis, dan titik seperti:
/home/..%2fstatic/something
yang akan menyimpan/static/something
dan respons yang diberikan adalah/home
- Direktori statis + titik: Permintaan ke
/static/..%2Fhome
atau ke/static/..%5Chome
mungkin akan disimpan seperti semula tetapi respons yang diberikan mungkin adalah/home
- Anda bisa memaksa cache untuk menyimpan respons dinamis dengan menggunakan pemisah, direktori statis, dan titik seperti:
- File statis: Beberapa file spesifik selalu disimpan di cache seperti
/robots.txt
,/favicon.ico
, dan/index.html
. Ini bisa disalahgunakan seperti/home/..%2Frobots.txt
di mana cache mungkin akan menyimpan/robots.txt
dan server origin merespons ke/home
.