Xuyên thủng Exact-Match Cache: Nghệ thuật kết hợp Delimiter và Normalization
Ý kiến
0
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Chưa có ý kiến nào. Hãy là người đầu tiên chia sẻ!
Bạn sẽ làm gì khi mục tiêu từ chối mọi yêu cầu lưu bộ nhớ đệm (Cache), ngoại trừ một lối đi hẹp duy nhất dành cho tệp /robots.txt? Bỏ cuộc, hay tìm cách 'bẻ cong' đường dẫn để lách qua khe cửa hẹp đó? Bài viết này sẽ vạch trần sự thật về lỗ hổng Web Cache Deception cấp độ cao. Chúng ta sẽ cùng nhau đi sâu vào lòng hệ thống, xem cách những sai lệch nhỏ nhất trong việc giải mã (Decoding) và chuẩn hóa (Normalization) URL có thể kết hợp thành một vũ khí chí mạng, giúp hacker cuỗm trọn dữ liệu nhạy cảm ngay trước mắt các lớp phòng ngự.
#NOTE:
Delimiter (Ký tự phân cách): Là các dấu hiệu (như dấu phẩy ,, dấu gạch đứng |, hoặc phím tab \t) giúp máy tính biết chỗ nào để "chặt" một chuỗi văn bản liền tù tì thành các cột dữ liệu riêng biệt.
Normalization (Chuẩn hóa):
Trong Database (Cơ sở dữ liệu): Kỹ thuật thiết kế lại cấu trúc bảng để loại bỏ hoàn toàn các thông tin bị trùng lặp dư thừa.
Trong Data/AI (Phân tích): Phép toán ép các số liệu chênh lệch lớn về chung một hệ quy chiếu (thường từ $0$ đến $1$) để dễ so sánh và tính toán.
Lỗ hổng xảy ra do sự bất đồng bộ trong việc phân tích URL giữa máy chủ Cache (Nginx) và máy chủ gốc (PHP). cụ thể:
Máy chủ Cache (Nginx): Tự động chuẩn hóa URL (giải mã %2f thành / và lùi thư mục khi gặp ../). Chỉ lưu cache nếu URL khớp chính xác (Exact-match) với /robots.txt.
Máy chủ gốc (PHP): Đọc chuỗi thô (không giải mã %2f), nhưng lại dùng dấu chấm phẩy (;) làm dấu phân cách, tự động cắt bỏ mọi nội dung sau dấu ;.
GET /profile.php/;%2f%2e%2e%2frobots.txt?wcd HTTP/1.1
(Lưu ý: %2f%2e%2e%2f là mã hóa URL của /../)
Tại Cache: Giải mã thành /profile.php/;/../robots.txt?wcd → Xử lý lùi thư mục (../) thành /robots.txt?wcd → Khớp quy tắc Exact-match → Tiến hành lưu Cache.
Tại Origin (PHP): Đọc chuỗi thô, thấy dấu ; nên cắt toàn bộ phần sau → Nhận diện URL là /profile.php/→ Trả về dự liệu nhạy cảm (CSRF Token).
Đóng vai nạnn nhân: Đăng nhập hợp lệ, dùng Burp Suite bắt request truy cập profile.
Chèn Payload: Chuyển request sang tab Repeater, thay thế URL bằng payload ở mục 2. bấm SEND.
Lưu Cache: Gói tin hợp lệ đi qua Nginx, lọt vào PHP và trả về mã 200 OK chứa CSRF Token.
HTTP/1.1 200 OK
Host: localhost:3000
Date: Thu, 04 Jun 2026 04:02:09 GMT
Connection: close
X-Powered-By: PHP/8.0.30
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: application/json
{
"user":"Khách hàng VIP",
"email":"khachhang@vlk-shop.com",
"csrf_token":"TOKEN-BIMAT-DUNG-DE-DOI-EMAIL-9999" <!-- CSRF Token ở đây -->
}
Lúc này Nginx đã lưu phản hồi vào bộ nhớ đệm (Header: X-Cache: miss chuyển thành hit ở lần gửi sau).
Đóng vai hacker (Khai thác): Xóa toàn bộ header Cookie: trong request trên và bấm SEND.
Kết quả: Hệ thống Cache trả thẳng mã 200 OK chứa CSRF Token của nạn nhân mà không chuyển tiếp vào PHP dể xác nhận quyền (Bypass thành công lỗi 401).
Kiểm soát đầu vào tại Origin: Backend không được tự động cắt URL. Trả ngay mã 400 Bad Request hoặc 404 Not Found nếu phát hiện ký tự phân cách lạ (;, %00).
Khoanh vùng Cache: Thay vì cấu hình Cache bằng tên file (/robots.txt) hoặc đuôi file, hãy áp dụng quy tắc Cache theo thư mục tĩnh cụ thể (VD: /static/*, /assets/*).
Bắt buộc sử dụng Header: Mọi API trả về dữ liệu nhạy cảm phải luôn đính kèm Header Cache-Control: private, no-store.
Giải mã (Decoding): Origin giải mã ký tự đặc biệt (VD: %23 →# rồi cắt chuỗi), còn Cache không giải mã, bị lừa lưu lại vì thấy đuôi .css.
Thứ tự xử lý: Cache áp dụng luật trên URL đang bị mã hóa, sau đó mới giải mã đẩy về Origin → Xuyên thủng logic.
Chuẩn hóa (Normalization): Mỗi hệ thống có cách xử lý ký tự lùi thư mục (%2f..%2f → /../ ) khác nhau, giúp Hacker qua mặt bộ lọc Exact-Match.
Đồng bộ 100%: Cache và Origin bắt buộc phải dùng chung một cơ chế giải mã và chuẩn hóa URL.
Cache theo Thư mục, KHÔNG theo Đuôi file: Chỉ định lưu đệm theo đường dẫn cố định (VD: /assets/), tuyệt đối không tin tưởng các đuôi .css, .js.
Origin "Không khoan nhượng": Trả ngay lỗi 400 hoặc 404 nếu URL có dấu phân cách hoặc mã hóa bất thường. Không bao giờ tự động cắt gọt hay "chữa lỗi" URL hộ người dùng.
Khóa bằng Header: Mọi API dữ liệu nhạy cảm bắt buộc phải gắn Cache-Control: private, no-store.