Skip to main content

4.01 | Spoofing an Authentication Cookie

🔐 Phòng tránh lỗ hổng bảo mật liên quan đến Authentication Cookies

📌 1️⃣ Tại sao authentication cookies dễ bị tấn công?

  1. Dự đoán thuật toán sinh cookie → Hacker có thể tạo cookie giả mạo.
  2. Đánh cắp cookie qua XSS → Nếu trang web có lỗ hổng XSS, hacker có thể lấy cookie của user.
  3. Tấn công Man-in-the-Middle (MitM) → Nếu cookie không được bảo vệ bằng HTTPS, hacker có thể chặn cookie trong quá trình truyền.
  4. Cookie không có thời hạn hết hạn (Session Fixation) → Hacker có thể dùng lại cookie cũ để truy cập vào tài khoản.

💡 Mục tiêu của chúng ta:
✔️ Bảo vệ cookie khỏi bị đánh cắp.
✔️ Ngăn hacker giả mạo cookie.
✔️ Giảm thiểu thời gian hacker có thể khai thác cookie.

✅ 2️⃣ Giải pháp phòng tránh

📌 Sai lầm phổ biến:

  • Không đặt thuộc tính HttpOnly, cho phép hacker lấy cookie bằng JavaScript (XSS).
  • Không đặt Secure, khiến cookie bị gửi qua HTTP thay vì HTTPS.
  • Không có SameSite, làm cho cookie bị gửi đến trang web khác (CSRF).

📌 Cách làm đúng:
🔹 Kích hoạt các thuộc tính bảo mật trong cookie:

Set-Cookie: sessionId=abc123; Secure; HttpOnly; SameSite=Strict; Path=/; Domain=example.com;

🔹 Ý nghĩa các thuộc tính:

Thuộc tínhÝ nghĩa
SecureChỉ gửi cookie qua HTTPS, ngăn chặn tấn công MitM.
HttpOnlyNgăn JavaScript truy cập cookie, giảm rủi ro XSS.
SameSite=StrictNgăn CSRF bằng cách chỉ gửi cookie trong cùng một site.
Domain & PathGiới hạn cookie chỉ được sử dụng trong phạm vi nhất định.

📌 Sai lầm phổ biến:

  • Lưu thông tin session trực tiếp trong cookie dưới dạng plaintext.
  • Không có cơ chế xác thực tính hợp lệ của cookie.

📌 Cách làm đúng:
🔹 Sử dụng JWT (JSON Web Token) để ký và mã hóa cookie
🔹 Dùng thuật toán băm mạnh như HMAC-SHA256 để đảm bảo tính toàn vẹn của cookie

🚀 Ví dụ: Tạo cookie an toàn với JWT trong Node.js

const jwt = require('jsonwebtoken');

const user = { id: 123, username: "admin" };
const secretKey = "supersecretkey";
const token = jwt.sign(user, secretKey, { expiresIn: '1h' });

// Lưu vào cookie với các thuộc tính bảo mật
res.cookie('auth', token, { httpOnly: true, secure: true, sameSite: 'Strict' });

💡 Lợi ích:
✅ Hacker không thể sửa nội dung cookie do có chữ ký số.
✅ Token có thời hạn hết hạn, giảm nguy cơ bị lợi dụng lâu dài.

📌 Sai lầm phổ biến:

  • Cookie không có thời gian hết hạn → Nếu bị đánh cắp, hacker có thể dùng mãi mãi.

📌 Cách làm đúng:
🔹 Đặt thời gian hết hạn ngắn cho cookie.
🔹 Bắt buộc đăng xuất người dùng sau một khoảng thời gian không hoạt động.

🚀 Ví dụ: Đặt thời gian hết hạn cho cookie

Set-Cookie: sessionId=abc123; Secure; HttpOnly; Expires=Wed, 21 Oct 2025 07:28:00 GMT;

💡 Lợi ích:
✅ Nếu hacker có cookie, nó cũng sẽ hết hạn nhanh chóng.
✅ Giảm thời gian hacker có thể khai thác phiên người dùng.

🔹 4. Chống tấn công Cross-Site Scripting (XSS)

📌 Sai lầm phổ biến:

  • Website có lỗ hổng XSS → Hacker có thể lấy cookie qua document.cookie.

📌 Cách làm đúng:
🔹 Đặt thuộc tính HttpOnly để ngăn JavaScript đọc cookie.
🔹 Lọc & mã hóa đầu vào để tránh XSS.
🔹 Dùng Content Security Policy (CSP) để ngăn chặn JavaScript độc hại.

🚀 Ví dụ: Kích hoạt CSP trong header

Content-Security-Policy: default-src 'self'; script-src 'self';

💡 Lợi ích:
✅ Ngăn hacker chèn mã JavaScript để lấy cookie.
✅ Tăng cường bảo mật cho toàn bộ ứng dụng web.

🔹 5. Chống tấn công Session Fixation

📌 Sai lầm phổ biến:

  • Hệ thống giữ nguyên sessionId sau khi user đăng nhập → Hacker có thể ép user sử dụng session của mình.

📌 Cách làm đúng:
🔹 Tạo session mới sau khi đăng nhập thành công.
🔹 Không cho phép người dùng tự đặt sessionId.

🚀 Ví dụ: Reset session sau khi đăng nhập

req.session.regenerate(function(err) {
req.session.user = user;
res.redirect('/dashboard');
});

💡 Lợi ích:
✅ Hacker không thể ép user dùng session cũ của hắn.
✅ Đảm bảo mỗi lần đăng nhập có session riêng.

🔎 3️⃣ Kết luận

Sai lầmCách sửa
Không đặt HttpOnly, cho phép hacker lấy cookie qua XSSĐặt HttpOnly để ngăn JavaScript truy cập cookie
Không đặt Secure, cho phép gửi cookie qua HTTPĐặt Secure để chỉ gửi cookie qua HTTPS
Không đặt thời gian hết hạn cho cookieThiết lập thời gian hết hạn (Expires hoặc Max-Age)
Lưu thông tin session trong cookie không mã hóaSử dụng JWT hoặc HMAC-SHA256 để bảo vệ dữ liệu trong cookie
Không đổi sessionId sau khi đăng nhậpRegenerate session sau khi đăng nhập thành công

📌 Bài học quan trọng:
Cookie phải được bảo vệ bằng nhiều lớp: mã hóa, ký, hạn chế truy cập.
Chỉ sửa lỗi trên UI không đủ – phải kiểm tra backend!
Bảo mật authentication cookies là cốt lõi của mọi hệ thống đăng nhập.

🔥 "Một cookie không được bảo vệ có thể phá hủy toàn bộ hệ thống!" 🚀