Web Cache Deception Demo Lab
Web Cache Deception Demo Lab
Tổng quan Web Cache Deception
Lỗ hổng “web cache deception” (đánh lừa bộ nhớ đệm web) là một dạng lỗ hổng bảo mật web, cho phép kẻ tấn công lừa hệ thống cache (bộ nhớ đệm web) lưu trữ và phục vụ lại những nội dung nhạy cảm hoặc riêng tư cho các bên không được ủy quyền. Đây là một hình thức khai thác sự khác biệt trong cách các server cache và server gốc xử lý các request—đặc biệt là về quy tắc lưu cache cho các tài nguyên động (như trang tài khoản người dùng, trang admin, v.v.).
Cách hoạt động của Web Cache Deception:
- Hệ thống cache thường chỉ lưu trữ các tài nguyên tĩnh (file .css, .js, hình ảnh, v.v.) nhằm tăng tốc độ truy cập và giảm tải cho server.
- Với web cache deception, kẻ tấn công có thể gửi request với các phần mở rộng tên file (vd: /profile.js) hoặc thêm tham số giả mạo tới các URL vốn dĩ là nội dung động (ví dụ trang profile người dùng) có thể nói đây là fall back routing.
- Nếu ứng dụng web hoặc cache server xử lý sai, nó sẽ trả về nội dung động (ví dụ thông tin tài khoản) nhưng lưu nhầm vào cache. Những người dùng khác khi truy cập tới URL đó sẽ thấy được nội dung nhạy cảm đã bị cache, dù không có quyền truy cập.
Source code
Phân tích và POC

Ở đây chỉ là demo cho lỗ hổng deception nên ta chỉ làm một cái func đăng nhập đơn giản sau đó dùng file static là /account.css để lấy được thông tin của user qua đó.
Đầu tiên ta sẽ đăng nhập với user là alice trước.

Sau khi đăng nhập thì ta có session token của user vừa đăng nhập ở đây là alice 6324a18d.
Tới bước này thì có thể thấy user alice đã được đăng nhập, bước tiếp theo nếu là trong thực tế thì attacker sẽ làm sao để cho user bấm vào đường dẫn để dẫn đến static file nhằm đánh lừa web cache.

Với session của alice ta tiến hành truy cập /account.css ở đây ta có thể thấy rằng trường X-Cache-Status trả về giá trị là MISS.
Với trường cache như vậy thì bước đầu ta đã thành công trong việc đánh lừa web cache server bây giờ ta sẽ thử với trình duyệt khác không có session thử truy cập đến /account.css xem nó sẽ có gì.

Ta sẽ tạo một tab mới và để chắc chắn thì mình sẽ xoá session đi cho chắc.


Truy cập vào /account.css ở đây ta có thể thấy rằng web cache deception đã thành công vì ở đây ta đã lấy ra được CSRF token của user alice ra sau khi user đó truy cập đến file static thì phần config lỗi của web cache đã lưu lại session của alice và từ đó tạo cơ hội cho attacker truy cập lại vào đó và lấy cắp thông tin user.
1 | location ~* \.(?:css|js|png|jpg|gif|ico)$ { |
Đoạn config gây ra lỗi nó nằm ở đây ở đây nginx được config để cache tất cả các đuôi tĩnh và điều đó dẫn đến khi người dùng truy cập đến file có đuôi tĩnh thì nó gây hiểu lầm cho server từ đó gây nên web cache deception.
1 | location ^~ /assets/ { |
Ở đây là cách fix đúng ta sẽ chỉ cache cho mỗi allow list và không cache các đường dẫn khác ngoài nó bên cạnh đó không cache những file tĩnh không tồn tại nếu người dùng trỏ đến thì nên trả hẳn về 403 401 luôn để tránh lỗ hổng này.