![ảnh](https://hackmd.io/_uploads/S17Nc1A5A.png) Đây là một bài lab PortSwigger về khai thác Web Cache Deception (tạm dịch là đánh lừa cache lưu trữ nội dung web) [Link Here](https://portswigger.net/web-security/web-cache-deception/lab-wcd-exploiting-path-mapping). ## Tổng quan về lý thuyết Web Cache ### Web Cache Web Cache là một hệ thống nằm giữa Web Server và Client. Mục đích làm tăng tốc và tối ưu hóa trải nghiệm Web, hoạt động bằng cách lưu trữ tạm thời các bản sao của nội dung web (như hình ảnh, tệp CSS, Js,...) trên các máy chủ hoặc thiết bị (CDN server) gần người dùng hơn, giúp giảm thời gian load và truy cập nội dung nhanh hơn. ![caching](https://hackmd.io/_uploads/ry6vAJAqR.svg) Ví dụ , khi người dùng yêu cầu một nội dung static resource (blog content) , đầu tiên ,browser sẽ request tới Web Server lấy nội dung, lưu lại ở Cache server , rồi trả về client. Trong các lần request tiếp theo , thay vì request trực tiếp lên Web Server , browser sẽ request đến Cache server lấy nội dung rồi trả về Client. Do do giảm tải cho Web server và cải thiện trải nghiệm duyệt web. ### Web Cache Deception Web Cache Deception là một lỗ hổng cho phép kẻ tấn công lừa bộ đệm web lưu trữ nội dung động, nhạy cảm. Nguyên nhân do sự khác biệt giữa cách máy chủ bộ đệm và máy chủ gốc xử lý các yêu cầu (giữa Traditional URL mapping và RESTful URL mapping). Chi tiết xem [tại đây](https://portswigger.net/web-security/web-cache-deception). ![ảnh](https://hackmd.io/_uploads/HyC7MgR9A.png) ![ảnh](https://hackmd.io/_uploads/HyTvfeA9A.png) Ví dụ , khi người dùng request một nội dung không tồn tại `(a.js)` từ path `/profile;a.js` (/profile chứa thông tin người dùng). Máy chủ web nếu được cấu hình không đúng , sẽ trả về toàn bộ nội dung của /profile (chứa thông tin người dùng). Do các Cache server thường lưu các nội dung có extension là `.js` , `.css`, ... Do đó ,nội dung từ `/profile` được lưu ở Cache Server với `key-url=.../profile;a.js`. Kẻ tấn công lúc này chỉ cần truy cập `url=.../profile;a.js` là có thể lấy được thông tin người dùng. ![wcd-image-1](https://hackmd.io/_uploads/r1pCo1C50.png) ## Khai thác lỗ hổng Web Cache Deception Giải thích có vẻ dài và khó hiểu 🫠, nên là mình sẽ trình bày chi tiết với việc solve bài lab của PortSwigger , link đã để ở trên. ### Recon ![ảnh](https://hackmd.io/_uploads/S1xY8xR5C.png) Truy cập trang lab , có chức năng login , enter với `username` và `password` được cung cấp `(wiener:peter)` , ta redirect tới path `/my-account`, ở đây xem được API của người dùng: ![ảnh](https://hackmd.io/_uploads/rkMZDgAcA.png) Yêu cầu đề bài là tìm API Key của người dùng `Carlos` .Ta test thử với path `/my-account/hehe.js` để xem phản hồi web server: ![ảnh](https://hackmd.io/_uploads/S1VzOxRc0.png) Sau khi enter , nội dung trả về vẫn chứa nội dung `/my-account `, điều này là do file `hehe.js` không tìm thấy trên máy chủ web , nên web server sẽ trừu tượng (abstract) path `/my-account/hehe.js` thành `/my-account/`. ![ảnh](https://hackmd.io/_uploads/BkJUdeAc0.png) ### Exploit Intercept lại request bằng Burpsuite: ![ảnh](https://hackmd.io/_uploads/r13BqgRcA.png) Có header `X-Cache: hit `, chứng tỏ nội dung được lưu và trả về từ Cache , thử bật tap private và test được dẫn sau : .../my-account/hehe.js : ![ảnh](https://hackmd.io/_uploads/HJ_VolA90.png) Ta thu được thông tin người dùng được trả về khi truy cập đường dẫn trên mà không cần đăng nhập ==> trang web dính Web Cache Deception. Kịch bản khai thác: Kẻ tấn công tạo một URL request một nội dung không tồn tại (/my-account/non-exist.js), và lừa người dùng thực hiện đăng nhập , khi người dùng truy cập URL trên , nội dung /my-account được lưu trữ ở Cache Server với `Cache-key` là URL đó, và kẻ tấn công có thể truy cập cùng URL trên để xem đựợc thông tin người dùng. ## Khắc phục - Luôn sử dụng tiêu đề `Cache-Control` để đánh dấu các Dynamic resource, thiết lập bằng các giá trị `no-store` và `private`. - Cấu hình CDN server các quy tắc lưu trữ Cache không ghi đè lên tiêu đề `Cache-Control`. - Đảm bảo không có sự khác biệt giữa cách máy chủ Web và Cache server diễn giải đường dẫn URL. ## Tổng kết Lâu lâu không viết write-up nên bài này viết đần quá, hiểu mà không biết diễn tả sao cho đúng🫠🫠🫠