Chương 12 • Bài 1

Base64 Authentication Vulnerability

Phân tích lỗ hổng mã hóa Base64 thay vì mã hóa thực sự

📖 Đề bài & Phân tích

1. Source code (PHP mẫu)

login.php

<?php
$data = json_decode(file_get_contents("php://input"), true);
$username = $data['username'];
$password = $data['password'];
if($username == "admin" && $password == "admin123"){
    $token = base64_encode("admin");
    echo json_encode(["token" => $token]);
} else {
    echo json_encode(["error" => "Invalid login"]);
}
?>

api.php

<?php
$token = $_GET['token'];
$user = base64_decode($token);
if($user == "admin"){
    echo json_encode(["secret" => "Admin data"]);
} else {
    echo json_encode(["error" => "Access denied"]);
}
?>

2. Phân tích lỗ hổng

1. Phân tích cơ chế: Hệ thống dùng `base64_encode()` để tạo ra Token từ chính `$username` mà không có Secret Key hay Hashing bảo vệ.

2. Attacker có thể tạo token giả không? CÓ! Bất kỳ ai cũng có thể tự mở console lên, mã hóa chữ "admin" sang Base64 thành YWRtaW4= và gửi lên Server. Server sẽ hoàn toàn tin tưởng token này là của Admin.

3. Tại sao Base64 không bảo mật? Base64 KHÔNG PHẢI LÀ MÃ HÓA (Encryption). Nó chỉ là một dạng biểu diễn dữ liệu (Encoding) để truyền tải, bất kỳ ai cũng có thể `base64_decode` ngược lại dễ dàng mà không cần Password hay Key.

4. Đề xuất cách Fix:
- Tuyệt đối không dùng Base64 làm cơ chế xác thực.
- Sử dụng JWT (JSON Web Token) với thuật toán HS256 hoặc RS256 có kèm Secret Key (như trang bài tập 12).
- Hoặc sử dụng cơ chế Session/Cookie ngẫu nhiên được lưu trữ tại DB.

🛠 Thực Hành 2: Lỗ hổng Insecure Token

Giả sử bạn không biết mật khẩu của admin, nhưng bạn biết định dạng token là Base64 của username. Hãy tự sinh ra token giả!

🛠 Thực Hành 3: Khai thác lấy Admin Data

Gọi vào api.php (giả lập) bằng Token có được ở trên (cho dù là token tự chế hay lấy từ bước 1).