1. Hiểu về cơ cấu bảo vệ cơ bản của Incapsula reese84
Incapsula, một giải pháp bảo vệ ứng dụng web nổi tiếng, sử dụng thuật toán reese84 để bảo vệ chống lại các bot và công cụ tự động. Thay vì sử dụng các biện pháp đơn giản như captcha hoặc giới hạn IP, reese84 sử dụng JavaScript phức tạp để thu thập thông tin từ môi trường trình duyệt, mã hóa dữ liệu và gửi lên máy chủ để xác thực.
Quy trình làm việc chính của reese84 bao gồm ba giai đoạn chính:
- Giai đoạn kiểm tra môi trường: Thu thập thông tin từ môi trường trình duyệt thông qua JavaScript.
- Giai đoạn mã hóa dữ liệu: Mã hóa và làm phức tạp thông tin đã thu thập.
- Giai đoạn xác thực token: Gửi dữ liệu mã hóa lên máy chủ để xác thực và nhận token truy cập.
1.1 Các khía cạnh quan trọng trong kiểm tra môi trường
reese84 kiểm tra nhiều khía cạnh khác nhau của môi trường trình duyệt, bao gồm:
| Loại kiểm tra | Các mục kiểm tra cụ thể | Đặc điểm của trình duyệt bình thường | Vấn đề phổ biến của công cụ tự động |
|---|---|---|---|
| **Navigator object** | userAgent, platform, plugins, mimeTypes | Thông tin định danh đầy đủ của trình duyệt | Thiếu một số thuộc tính hoặc giá trị bất thường |
| **Screen object** | width, height, availWidth, pixelDepth | Thông số màn hình phù hợp với thiết bị | Giá trị cố định hoặc không phù hợp với thiết bị |
| **Canvas fingerprinting** | Render 2D, lấy dữ liệu hình ảnh, render font | Tạo dữ liệu hình ảnh Canvas duy nhất | Trả về dữ liệu trống hoặc dữ liệu cố định |
| **Hỗ trợ WebGL** | Hỗ trợ mở rộng, lấy tham số, khả năng render | Hỗ trợ đầy đủ chức năng WebGL | Thiếu một số mở rộng hoặc trả về giá trị bất thường |
| **Thời gian liên quan** | Date object, performance API, múi giờ | Timestamp liên tục và múi giờ chính xác | Timestamp nhảy hoặc múi giờ bất thường |
| **DOM manipulation** | Tạo phần tử, thao tác thuộc tính, xử lý sự kiện | Năng lực thao tác DOM đầy đủ | Một số phương thức bị ghi đè hoặc thiếu |
Các điểm kiểm tra này tạo thành một dấu vân tay đa chiều, và bất kỳ bất thường nào cũng có thể dẫn đến thất bại trong quá trình kiểm tra.
2. Bước đầu tiên trong phân tích ngược: Xác định điểm vào mã hóa và cấu trúc mã
Để bắt đầu phân tích ngược reese84, chúng ta cần tìm điểm vào mã hóa. Một cách hiệu quả là tìm kiếm window.JSON.stringify() trong mã nguồn trang web, vì đây thường là bước cuối cùng trước khi dữ liệu được mã hóa.
2.1 Xác định hàm mã hóa
Mở công cụ phát triển của trình duyệt, tìm kiếm window.JSON.stringify( trong tab Sources. Tìm điểm gọi cuối cùng, vì đây thường là nơi thực hiện mã hóa dữ liệu.
// Trong console, thực hiện tìm kiếm
// Chú ý: Một số trang web có thể tải mã JS động, hãy đợi các file JS được tải xong trước khi tìm kiếm
// Phương pháp 1: Tìm kiếm trực tiếp
// Trong tab Sources, nhấn Ctrl+Shift+F (Windows) hoặc Cmd+Option+F (Mac) để tìm kiếm toàn cục
// Phương pháp 2: Debug bằng breakpoint
// Trong tab Network, tìm file JS chính, đặt breakpoint XHR ở yêu cầu đáng ngờ
Sau khi tìm thấy điểm vào mã hóa, bạn sẽ thấy mã thường bị làm phức tạp. Các kỹ thuật phổ biến bao gồm:
- Làm phức tạp tên biến: Đổi tên biến có nghĩa thành các ký tự ngắn không có nghĩa.
- Flatten control flow: Làm rối logic mã, tăng độ khó phân tích.
- Mã hóa chuỗi: Lưu trữ chuỗi hằng số dưới dạng mã hóa, giải mã khi sử dụng.
- Chèn code chết: Chèn nhiều code không thực thi để gây nhiễu phân tích.
2.2 Phục hồi và phân tích cấu trúc mã
Đối mặt với mã phức tạp, chúng ta cần sử dụng các công cụ và kỹ thuật để phục hồi logic ban đầu:
Công cụ phục hồi AST (Abstract Syntax Tree):
# Sử dụng babel để phân tích và phục hồi AST
npm install @babel/parser @babel/traverse @babel/generator
# Hoặc sử dụng các công cụ chuyên dụng cho JavaScript
# Như js-beautify, prepack, v.v.
Bước phân tích thủ công quan trọng:
- Nhận diện hàm tự thực thi: Mã reese84 thường được gói trong hàm tự thực thi.
- Theo dõi biến quan trọng: Tìm biến lưu trữ kết quả kiểm tra môi trường.
- Phân tích quy trình mã hóa: Hiểu cách dữ liệu được thu thập, xử lý và mã hóa.
Trong một ví dụ thực tế, cấu trúc mã reese84 có thể như sau:
// Cấu trúc mã reese84 (phiên bản đơn giản)
(function() {
// Mã kiểm tra môi trường
var envData = {};
// Kiểm tra thuộc tính navigator
envData.navigator = {};
for (var key in navigator) {
if (navigator.hasOwnProperty(key)) {
envData.navigator[key] = navigator[key];
}
}
// Kiểm tra canvas
envData.canvas = testCanvas();
// Kiểm tra WebGL
envData.webgl = testWebGL();
// Nhiều kiểm tra khác...
// Xử lý mã hóa
var encryptedData = encryptData(envData);
// Gửi yêu cầu
sendToServer(encryptedData);
})();
3. Phân tích sâu và chiến lược mô phỏng kiểm tra môi trường
Kiểm tra môi trường của reese84 là cốt lõi của hệ thống bảo vệ, và cũng là phần khó vượt qua nhất. Để mô phỏng một môi trường trình duyệt "thực sự", chúng ta cần hiểu rõ từng điểm kiểm tra và giá trị trả về mong đợi.
3.1 Chi tiết kiểm tra đối tượng Navigator
Kiểm tra đối tượng Navigator không chỉ đơn giản là lấy một số thuộc tính. reese84 sẽ kiểm tra chi tiết các mô tả thuộc tính, chuỗi nguyên mẫu, và thậm chí sử dụng Object.getOwnPropertyDescriptor để xác minh các thông tin siêu dữ liệu như khả năng cấu hình và ghi.
Mô phỏng hoàn chỉnh đối tượng Navigator:
// Mô phỏng đối tượng navigator đầy đủ
const fakeNavigator = {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
platform: 'Win32',
language: 'zh-CN',
languages: ['zh-CN', 'zh'],
hardwareConcurrency: 8,
maxTouchPoints: 0,
webdriver: false,
// Kiểm tra plugin
plugins: {
length: 3,
[Symbol.iterator]: function*() {
yield { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' };
yield { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' };
yield { name: 'Native Client', filename: 'internal-nacl-plugin' };
}
},
// Kiểm tra loại MIME
};