Web Cache Deception
Web Cache Deception คือการหลอกให้ cache เก็บหน้าที่มีข้อมูลส่วนตัวของเหยื่อ (เช่นหน้า account) ไว้ที่ URL สาธารณะ แล้วผู้โจมตีเปิด URL นั้นเพื่ออ่านข้อมูล ต่างจาก cache poisoning ตรงที่ deception หลอกเรื่อง 'อะไรถูก cache' บทนี้อธิบายกลไก cache, เงื่อนไขที่ทำให้เกิด, เทคนิค path confusion และการทดสอบ (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)
1. แนวคิด — deception ต่างจาก poisoning
CDN/cache มักเก็บ static file (.css/.js/.jpg) ไว้แชร์ทุกคนเพื่อความเร็ว Cache Deception อาศัยช่องว่างระหว่าง 'cache ตัดสินใจ cache จากนามสกุล' กับ 'server ตอบเนื้อหาตาม path จริง' — ผู้โจมตีส่งลิงก์อย่าง /account/profile.css ให้เหยื่อ ถ้า server ไม่สน .css แล้วคืนหน้า profile (ข้อมูลเหยื่อ) แต่ cache เห็น .css เลย cache ไว้ → ผู้โจมตีเปิด URL เดียวกันอ่านข้อมูลเหยื่อจาก cache
| Cache Deception | Cache Poisoning | |
|---|---|---|
| เป้า | อ่านข้อมูลส่วนตัวของเหยื่อ | ยัด response อันตรายให้เหยื่อ |
| หลอกเรื่อง | อะไรถูก cache (path/ext) | ค่าใน cache key (header) |
| ผล | ข้อมูลรั่ว | XSS/redirect หมู่ |
2. เงื่อนไขที่ทำให้เกิด
- cache ตัดสินจากนามสกุล/path (cache
.css .js .jpgเสมอ) โดยไม่ดู Cache-Control จาก origin - server ทำ path ยืดหยุ่นเกินไป —
/account/profile.cssคืนหน้า/account/profile(ละเลยส่วนเกิน) - หน้ามีข้อมูลส่วนตัว (account, API key, token, session info)
- cache key ไม่รวมส่วนที่แยกผู้ใช้ — เก็บ response รวมไม่แยก cookie
3. เทคนิค path confusion
# ต่อ .css/.js ปลอม (server ละเลย, cache เห็น static)
/account -> /account/foo.css
/account -> /account/foo.js
# path parameter / delimiter ที่ server กับ cache parse ต่างกัน
/account;foo.css
/account%2ffoo.css
/account%00.css
/account#.css
/account?.css
# encoded path traversal กลับเข้า endpoint เดิม
/static/..%2faccount%2ffoo.css
# ดูว่าถูก cache ไหม: response header
# X-Cache: hit / miss
# CF-Cache-Status: HIT
# Age: <วินาที> (มี = ถูก cache)4. Workflow ทดสอบ
5. Quick Reference
- deception = หลอก cache ให้เก็บหน้า private ที่ URL สาธารณะ
- ลอง:
/account/foo.css, delimiter; %2f %00 # ? - ยืนยัน cache: header
X-Cache: HIT/Age - ทดสอบจริง: เปิด URL จาก context อื่น เห็นข้อมูลเหยื่อ = ช่องโหว่
- ป้องกัน: cache ตาม Cache-Control จาก origin, cache key แยกผู้ใช้
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเจอหน้าที่ต้อง login แล้วมีข้อมูลส่วนตัว (เช่น /account) และเว็บอยู่หลัง CDN มีแค่ Kali เปล่าๆ ไล่หา cache deception ทีละขั้น
- 1login เข้าเว็บ แล้วเปิด /account (หรือหน้าที่มีข้อมูลส่วนตัว) จับ request ด้วย Burp
- 2ต่อนามสกุลปลอมท้าย path แล้วลองด้วย curl: curl -s https://target/account/foo.css -b 'session=YOUR_SESSION'
- 3ดูว่า response ที่ได้ยังเป็นหน้า account (มีข้อมูลเหยื่อ) หรือเป็น 404/redirect
- 4ถ้าคืนหน้า account จริง เช็ค header ว่าถูก cache ไหม: curl -sI (ดู X-Cache, CF-Cache-Status, Age)
- 5ถ้าไม่ cache ลอง delimiter อื่นต่อท้าย path เช่น /account;foo.css, /account%2ffoo.css, /account%00.css
- 6เมื่อยืนยันว่า path+delimiter ที่ใช้ถูก cache แล้ว ให้เปิด URL เดียวกันจาก browser profile อื่น (private window ไม่ login)
- 7ถ้าเห็นข้อมูลของเหยื่อ (จาก session ที่ login ไว้ก่อนหน้า) ในหน้าที่ไม่ได้ login = ยืนยันช่องโหว่จริง
- 8บันทึก path + delimiter ที่ใช้ได้ผล เป็นหลักฐาน (screenshot + response header ที่มี X-Cache: HIT)
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ต่อนามสกุลปลอมทดสอบ path | curl | - | - |
| เช็คว่า cache ไหม | curl -sI | - | - |
| fuzz delimiter หลายแบบอัตโนมัติ | ffuf | - | - |
| เปิดจาก session/context อื่นเพื่อยืนยัน | Firefox Private Window | - | - |
| proxy ดูทุก request/response | Burp Suite Community | - | - |
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้