Phân tích Tham số Mã hóa FECU trong Hệ thống Đặt vé Hàng không

Thiết lập điểm dừng XHR để theo dõi yêu cầu

Quá trình phân tích bắt đầu bằng việc xác định endpoint API xử lý yêu cầu tìm kiếm chuyến bay. Sau khi thiết lập điểm dừng trên các yêu cầu XHR, quan sát thấy tham số FECU xuất hiện trong URL với cấu trúc phức tạp.

Khám phá tài nguyên JavaScript

Tập tin flight_security.js chứa hàm mã hóa chính. Bằng cách đặt điểm dừng tại vị trí gọi hàm, phát hiện hàm generateSecureToken() chịu trách nhiệm tạo giá trị cho tham số FECU:

function generateSecureToken(inputData) {
    const tokenBase = buildTokenBase(inputData);
    const encrypted = encryptAesCbc(tokenBase, 'c77c9ccac77c9cca', 'c77c9ccac77c9cca');
    return encrypted.charAt(3) + encrypted + encrypted.charAt(7);
}

Phân tích thành phần tham số

Đối tượng tham số chính được định nghĩa dưới dạng:

const paramContainer = {
    0: '',   // Giá trị MD5 từ cookie
    2: '',   // Thông tin kiểm tra trình duyệt
    3: false,
    4: 'None',
    5: 0,
    6: 0,
    7: 0,
    8: '',   // Chuỗi băm từ cấu hình
    9: '',   // MD5 của User-Agent
    10: 6,
    11: null,
    12: ''   // Giá trị ngẫu nhiên
};

Thành phần chính

  • Vị trí 0: MD5 của giá trị cookie FECW từ phản hồi máy chủ
  • Vị trí 8: Kết quả băm từ mảng cấu hình ['chrome', 'safari']
  • Vị trí 9: MD5 của chuỗi User-Agent (Ví dụ: 8f694609bddc4903b8e8fee50d783cc1)
  • Vị trí 11: Thời gian Unix miligiây (Ví dụ: 1757312528565)
  • Vị trí 12: Chuỗi ngẫu nhiên 5 ký tự (Ví dụ: SDq4d)

Cơ chế mã hóa chi tiết

Quá trình mã hóa sử dụng thuật toán AES-CBC với cấu hình:

function encryptAesCbc(plainText, secretKey, initVector) {
    const key = CryptoJS.enc.Utf8.parse(secretKey);
    const iv = CryptoJS.enc.Utf8.parse(initVector);
    const encrypted = CryptoJS.AES.encrypt(
        plainText, 
        key, 
        { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
    );
    return encrypted.toString();
}

Chuỗi đầu vào trước mã hóa có cấu trúc:

[MD5_cookie][14_zeroes][config_hash][user_agent_md5][timestamp][random]

Ví dụ chuỗi gốc:

06546dae636aaccdb7a52c5c8065452b00000000000000f6d62a8e69201d3806ac1ef24ec64c4d8f694609bddc4903b8e8fee50d783cc11757312528565SDq4d

Quá trình xử lý cuối cùng:

  1. Mã hóa chuỗi bằng AES-CBC
  2. Thêm ký tự tại vị trí 3 vào đầu kết quả
  3. Thêm ký tự tại vị trí 7 vào cuối kết quả

Thẻ: AES-CBC MD5-hashing JavaScript-obfuscation browser-fingerprinting CryptoJS

Đăng vào ngày 12 tháng 7 lúc 03:06