Cách Phòng Tránh Session Hijacking, Injection Và Command Injection Hiệu Quả Cho Ứng Dụng Web
Khi phát triển hoặc sử dụng các ứng dụng web, bạn có thể đã quen với khái niệm “phiên” (session) – một phần quan trọng để duy trì trạng thái và xác thực người dùng. Tuy nhiên, phiên (session) cũng là mục tiêu béo bở cho kẻ xấu, đặc biệt khi xảy ra Session hijacking. Bên cạnh đó, Injection (chèn mã độc) cũng là một kiểu tấn công phổ biến và cực kỳ nguy hiểm, bao gồm các biến thể như SQL injection, command injection, parameter injection… Hậu quả thường gặp là đánh cắp dữ liệu, chiếm đoạt quyền điều khiển hoặc phá hoại hệ thống.
Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết:
- Session hijacking là gì, cách nó hoạt động và lỗi thường gặp.
- Các loại injection: SQL injection, command injection, parameter injection, XSS, file upload vulnerabilities…
- Cách kẻ xấu lấy cắp thông tin từ từng lỗ hổng.
- Phương pháp tối ưu và phòng tránh trong dự án thực tế.
Hy vọng sau khi đọc, bạn sẽ áp dụng được các giải pháp bảo mật giúp ứng dụng của mình an toàn hơn.
#1. Session hijacking
#1.1. Session hijacking là gì?
Session hijacking (chiếm đoạt phiên) là hành vi kẻ tấn công “chôm” thông tin phiên (thường là session ID) của người dùng. Từ đó, hacker “đóng giả” làm người dùng, đăng nhập hoặc thao tác trên ứng dụng như tài khoản hợp lệ.
#1.2. Cơ chế tấn công
- Đánh cắp cookie (Cookie Theft):
Kẻ tấn công dùng kỹ thuật sniffing (dò gói tin) trên mạng chưa mã hoá HTTPS, hoặc khai thác XSS để đọc cookie của người dùng. - Session fixation:
Kẻ xấu chủ động gán (fix) một session ID “dơ bẩn” cho người dùng. Khi người dùng đăng nhập thành công, session ID đó có hiệu lực, và hacker đã biết trước ID này.
#Ví dụ minh họa (Node.js)
1 | const http = require('http'); |
Kết quả:
- Lần đầu truy cập, trình duyệt sẽ nhận “SessionID” ngẫu nhiên.
- Nếu hacker “chặn” được cookie hoặc ép người dùng dùng session ID “gài sẵn”, hacker có thể đóng vai người dùng hợp lệ.
#1.3. Lỗi thường gặp trong thực tế
- Không mã hóa kênh truyền (chỉ dùng HTTP thay vì HTTPS): Kẻ xấu dễ sniffing cookie.
- Không đặt cờ
HttpOnly
vàSecure
: Cookie có thể bị đọc hoặc sửa bởi mã độc hại (XSS). - Session không hết hạn (không TTL): Phiên tồn tại lâu, hacker có nhiều thời gian khai thác.
#1.4. Cách kẻ xấu lấy cắp thông tin trong Session hijacking
Cookie Theft (Đánh cắp cookie):
- Sniffing mạng: Hacker phân tích lưu lượng mạng (đặc biệt là mạng Wi-Fi công cộng) để đọc cookie nếu trang chưa dùng HTTPS.
- XSS: Hacker chèn mã JavaScript đọc
document.cookie
và gửi về máy chủ của mình. - Hậu quả: Có được session ID, hacker chỉ cần giả lập trình duyệt gửi cookie lên server, từ đó chiếm tài khoản nạn nhân.
Session Fixation:
- Ép người dùng dùng session ID “bẫy”: Qua email, link độc hại, kẻ tấn công hướng người dùng truy cập trang với session ID đã chỉ định.
- Chờ nạn nhân đăng nhập: Khi người dùng nhập thông tin đăng nhập, session ID đó trở thành hợp lệ. Hacker dùng cùng ID để đăng nhập “giả”.
#2. Injection và cách phòng tránh
#2.1. Injection là gì?
Injection (chèn mã độc) là hành vi tận dụng việc không kiểm soát tốt đầu vào từ người dùng, làm thay đổi hoặc chèn thêm các câu lệnh/đoạn mã, dẫn đến thực thi ngoài ý muốn. Có nhiều loại injection khác nhau:
- SQL Injection (tác động lên cơ sở dữ liệu)
- Command Injection (thực thi lệnh hệ thống)
- Parameter Injection (lợi dụng tham số, chẳng hạn trong REST API)
- XSS (Cross-Site Scripting) (chèn JavaScript vào trang web)
- File upload vulnerabilities (tải tệp độc hại lên server, dẫn đến Remote Code Execution)
#2.2. SQL Injection
Kẻ tấn công chèn ký tự đặc biệt (' OR '1'='1
) để thay đổi câu lệnh SQL.
#Ví dụ minh họa (PHP)
1 |
|
Kết quả:
- Truy vấn trả về toàn bộ người dùng, tạo cơ hội đánh cắp dữ liệu nhạy cảm.
Cách khắc phục:
- Dùng Prepared Statement, ví dụ trong PHP (PDO), Node.js (pg, mysql2), v.v.
- Escape dữ liệu đầu vào, hoặc giới hạn ký tự.
- Tận dụng ORM tools. Các ORM tools (Sequelize, Hibernate, Django ORM, Entity Framework, v.v.) giúp hạn chế SQL Injection nhờ tự động escape dữ liệu đầu vào hoặc cung cấp Prepared Statements.
#2.3. XSS (Cross-Site Scripting)
Kẻ tấn công chèn JavaScript độc hại.
#Ví dụ minh họa (JavaScript)
1 | function renderComment(comment) { |
Kết quả:
- Nếu
comment
là<script>alert('Hacked!')</script>
, trình duyệt chạy luôn đoạn script này.
Cách khắc phục:
- Encode đầu vào trước khi hiển thị.
- Dùng thư viện DOMPurify (hoặc tương tự) để loại bỏ đoạn mã nguy hiểm.
- Thiết lập Content-Security-Policy (CSP).
#2.4. Command Injection
- Ứng dụng ghép chuỗi lệnh shell với dữ liệu người dùng (VD:
exec("ping " + userInput)
). - Hacker có thể thêm lệnh tùy ý, ví dụ
; rm -rf /
.
Cách phòng tránh:
- Không ghép chuỗi trực tiếp, sử dụng hàm hoặc API an toàn, ví dụ
child_process.spawn
(Node.js) với tham số riêng biệt. - Giới hạn loại lệnh, kiểm tra kỹ dữ liệu đầu vào.
#2.5. Parameter Injection
- Tận dụng tham số (URL, form data, header) để chèn giá trị nằm ngoài dự kiến của lập trình viên.
- Có thể dẫn đến thao tác vượt quyền, truy cập thông tin không được phép.
Cách phòng tránh:
- Xác thực, lọc dữ liệu ở từng tham số.
- Áp dụng nguyên tắc tối thiểu quyền (least privilege) trên server.
#2.6. File upload vulnerabilities & Remote Code Execution (RCE)
- Ứng dụng cho phép upload file nhưng không kiểm tra chặt chẽ phần mở rộng và nội dung file.
- Hacker tải lên file
.php
,.jsp
(hoặc shell web) để thực thi mã độc trên server. - Dẫn đến Remote Code Execution: Kẻ xấu có thể chạy lệnh, đọc/ghi file tuỳ ý.
Cách phòng tránh:
- Kiểm tra MIME type thực của file, không chỉ dựa vào đuôi
.jpg
,.png
. - Giới hạn kích thước, loại file, có thể quét virus.
- Không cho phép quyền thực thi trên thư mục lưu file upload.
#3. Kết luận
Session hijacking và injection (bao gồm command injection, parameter injection, file upload vulnerabilities, remote code execution…) đều là những lỗ hổng phổ biến nhưng rất nguy hiểm cho bất kỳ ứng dụng web nào. Việc nắm vững cơ chế tấn công cũng như cách kẻ xấu thực sự lấy cắp thông tin sẽ giúp bạn đề ra biện pháp phòng ngừa và giảm thiểu rủi ro:
- Mã hóa kênh truyền (HTTPS), thiết lập cookie an toàn (
HttpOnly
,Secure
). - Áp dụng kiểm soát đầu vào (input validation), Prepared Statement, ORM tools.
- Thường xuyên rà soát lỗ hổng (pentest), cập nhật thư viện, framework.
- Có quy trình xử lý file upload an toàn, hạn chế thực thi mã.
Hiểu rõ và áp dụng đúng, bạn sẽ bảo vệ lâu dài cho ứng dụng, bảo toàn dữ liệu và uy tín của dự án/doanh nghiệp.
#Bài tập tự kiểm tra:
- Hãy giải thích sự khác nhau giữa Session Hijacking và Session Fixation.
- Tìm hiểu về “Prepared Statement” trong ngôn ngữ bạn đang dùng và viết một đoạn code ngắn chống SQL Injection.
- Nêu một ví dụ XSS đơn giản và cách bạn ngăn chặn XSS trong dự án.
- Liệt kê các dạng injection phổ biến (SQL, command, parameter…) và chia sẻ cách áp dụng ORM tools phòng tránh.
- Mô tả cách file upload có thể dẫn đến remote code execution (RCE) và cách khắc phục.