Trong thế giới an ninh mạng, nơi các khái niệm như phishing, malware hay zero-day dường như đã quá quen thuộc, CSRF (Cross-Site Request Forgery – Tấn công giả mạo yêu cầu từ trang chéo) lại thường bị lãng quên hoặc xem nhẹ. Có ý kiến cho rằng, CSRF thực tế không còn là mối đe dọa nghiệm trọng nữa, nhất là khi nhiều framework và trình duyệt hiện đại đã cập nhật biện pháp bảo vệ. Tuy nhiên, cũng không ít chuyên gia bảo mật chỉ ra rằng, chính sự chủ quan này mới là kẽ hở nguy hiểm nhất. Vậy thực chất CSRF nguy hiểm đến mức nào, hay nó chỉ là "bóng ma công nghệ" bị thổi phồng?
Nhiều người nhầm lẫn CSRF là một dạng tấn công phải có code tinh vi và phức tạp như XSS, SQL Injection. Thực tế, CSRF là một cuộc tấn công "thầm lặng" hơn rất nhiều và lại phụ thuộc nhiều vào tâm lý chủ quan của nạn nhân hơn là lỗ hổng về code.
CSRF là kiểu tấn công khiến người dùng vô tình thực hiện những hành động không mong muốn trên website mà họ đã đăng nhập sẵn, chẳng hạn như chuyển tiền, đổi mật khẩu, gửi tin nhắn, v.v. Điều này xảy ra khi kẻ xấu gửi một yêu cầu ngụy trang, lợi dụng quyền xác thực của nạn nhân. Khi nạn nhân đang đăng nhập trên một website (ví dụ Internet Banking), nếu truy cập hoặc nhấp link độc hại từ một website khác, bộ cookie xác thực của phiên đăng nhập sẽ được gắn vào request đó và yêu cầu sẽ được hệ thống xác thực như một người dùng thực sự.
Giả sử bạn đang dùng chức năng chuyển khoản ngân hàng trực tuyến và vẫn còn phiên đăng nhập. Hacker gửi cho bạn một email hoặc bình luận trên diễn đàn chứa đường dẫn:
<img src="https://taikhoannganhang/demo/chuyenkhoan?to=123456&amount=10000000" width="0" height="0">
Chỉ cần bạn truy cập email hoặc trang web có chứa đoạn mã HTML này, trình duyệt của bạn sẽ tự động gửi request mà không hề hỏi lại, và điều đó đủ để hacker hưởng chục triệu đồng một cách dễ dàng, nếu hệ thống không có bất kỳ cơ chế chống CSRF nào.
Sự phát triển vượt bậc của phần mềm quản lý phiên đăng nhập, các framework web hiện đại và trình duyệt, khiến CSRF như bị "cô lập" trong giới hạn hệ thống kém bảo mật. Vậy, CSRF có thực sự lỗi thời?
Hầu hết các framework MVC phổ biến (Django, Ruby on Rails, Laravel, Spring, v.v.) đều tích hợp chức năng CSRF Token ở tầng logic ứng dụng. Thêm vào đó, trình duyệt hiện đại áp dụng quy tắc SameSite cookie, hỗ trợ ngăn chặn cookies tự động gửi cùng request xuất phát từ domain khác.
Câu trả lời lại không hề đơn giản. Thực tế, hầu hết các website tự xây dựng–đặc biệt ở khu vực châu Á, bao gồm Việt Nam–vẫn mắc nhiều lỗi cấu hình cookie, mã nguồn thiếu sót hoặc các lỗ hổng chưa được cập nhật. Đa số hệ thống quản lý nội bộ (những hệ thống chỉ một số người dùng truy cập, như dashboard quản trị trường học, doanh nghiệp, hệ thống email nội bộ v.v.) vẫn thường xuyên thiếu các lớp phòng vệ cơ bản với CSRF đơn giản vì tư duy "dùng nội bộ, sẽ không bị hack".
Chính tâm lý này mở đường cho hacker, vì chỉ cần một tài khoản nội bộ bị lộ (thường xảy ra qua phishing), hoàn toàn có thể lần theo các hành động quản trị nguy hiểm mà bản thân CSRF là công cụ dễ dùng nhất.
Hàng năm, các báo cáo từ OWASP hoặc các hệ thống quản lý bug bounty (HackerOne, Bugcrowd...) vẫn nhận được vô số bug liên quan CSRF, đáng buồn là chủ yếu ở các hệ thống quản trị hoặc những dịch vụ nội bộ ít được kiểm toán. Đây không còn là vấn đề của công nghệ mà là của thói quen, thái độ với bảo mật của nhà phát triển lẫn tổ chức vận hành.
Khi so sánh với XSS, tấn công CSRF có xu hướng khiến nhà quản trị “xem nhẹ” bởi hậu quả dễ nhận biết hơn và phổ biến ít hơn. Nhưng đánh giá này liệu có chính xác?
XSS tận dụng khả năng inject mã độc ngay trên trình duyệt của nạn nhân, có thể đánh cắp cookies, chiếm quyền phiên đăng nhập, trích xuất dữ liệu hoặc chuyển hướng đến trang web giả. Đây được xem là lỗ hổng “nguy hiểm cấp cao” do phạm vi tác động cực rộng.
Trong khi đó, CSRF “không tạo ra cái gì mới” trên hệ thống mà lợi dụng chính quyền hạn của người dùng. Điểm lợi hại là: khi hacker dùng chiêu này, mọi thao tác sẽ được log lại và hợp pháp từ phía server–chỉ có điều, chính nạn nhân thực hiện trước sự dẫn dắt của hacker.
Hacker gửi một email giả thông báo từ ngân hàng, đính kèm link hoặc file có chứa đoạn mã chạy CSRF (ví dụ chuyển hết tiền). Người dùng truy cập khi vẫn đăng nhập sẵn trên website ngân hàng. Kết quả: số tiền trong tài khoản “bốc hơi” mà mọi log trên server đều ghi nhận là “người dùng đã thực hiện hợp pháp”.
| CSRF | XSS | |
|---|---|---|
| Khả năng ảnh hưởng | Hạn chế hơn XSS, nhưng sâu sắc khi liên quan đến thao tác nhạy cảm | Rộng, đánh cắp dữ liệu hoặc tấn công mở rộng |
| Đòi hỏi kỹ thuật | Cần cấu hình cookie, request, không cần inject code phức tạp | Cần khả năng inject và thực thi JavaScript |
| Dễ phát hiện | Thường bị bỏ qua, xảy ra ngẫu nhiên | Nhiều trường hợp dễ phát hiện hơn do xuất hiện script lạ |
| Hậu quả Pháp Lý | Khó truy ra hacker thực sự | Dễ truy vết hơn nếu có dấu vết mã độc inject |
=> Có thể thấy, XSS nguy hiểm về mặt lan truyền và kỹ thuật, nhưng CSRF đặc biệt rủi ro về mặt hậu quả thực thi hành động “trái phép hợp pháp” dưới nhân dạng người thật.
Nhiều người nghĩ rằng CSRF chỉ còn trên lý thuyết, nhưng thực tế ngành bảo mật Việt Nam đã từng chứng kiến không ít vụ "đánh" nội bộ chỉ nhờ yếu tố này.
Một doanh nghiệp Việt nhỏ sử dụng hệ thống quản trị quảng cáo trong nội bộ. Lập trình viên quên dựng biện pháp chống CSRF cho các request “Tạo chiến dịch mới” và “Nạp tiền”. Một nhân sự không hài lòng, nhân dịp gửi link chat nội bộ tích hợp script ngầm post lên chức năng này, sau đó tạo ra loạt chiến dịch rút tiền thật từ tài khoản công ty sang đối tác ngoài do mình chỉ định. Sự việc bị phát hiện khi ngân sách công ty giảm mạnh mà không ai hiểu lý do – quá muộn để truy ngược kẻ đã dàn dựng. Động cơ: thủ phạm khai nhận chỉ thử “xem web nội bộ có bảo mật kém không”. Hệ quả: mất hơn 200 triệu đồng chỉ trong 4 giờ.
Một công ty vận hành hệ thống email nội bộ tích hợp webmail, tài khoản admin chỉ với xác thực cookie, không CSRF token. Hacker gửi link lừa đảo qua chat, khiến IT nội bộ khi bấm vào vô tình xóa toàn bộ user hoặc gửi password đến hộp thư của hacker. Ngay cả sau sự cố, mãi tới khi quy định kiểm toán bậc ba được áp dụng, lỗ hổng này mới được lấp kín.
Năm 2023, một số ngân hàng lớn ở khu vực Đông Nam Á bị phát hiện lỗ hổng CSRF tại chức năng duyệt hoặc cấp mã OTP cho giao dịch tài chính. Hacker chỉ cần chiếm quyền truy cập session của kỹ thuật viên được phép “duyệt”, sau đó gửi link giả mạo khiến kỹ thuật viên click, vô tình phê duyệt rất nhiều đề xuất tạo mã xác thực giả trong một ngày.
=> Qua các ví dụ thực tiễn, có thể thấy CSRF không chỉ nằm trên sách vở mà hoàn toàn có thể gây tổn thất tài chính, gián đoạn dịch vụ nghiêm trọng hoặc thậm chí dẫn đến lộ thông tin cá nhân nghiêm trọng.
Mặc dù lý thuyết phòng vệ CSRF rất đơn giản (CSRF token, SameSite cookie), lý do lỗ hổng kéo dài là gì?
Tới tận năm 2024, nhiều hệ thống vẫn dùng lại bản dựng cũ, không tích hợp token ngẫu nhiên riêng cho mỗi người dùng/phiên truy cập. Thậm chí, không hiếm website chỉ dùng token chung hoặc token đặt cứng trong source code – khiến việc khai thác CSRF dễ dàng hơn bao giờ hết.
Trình duyệt hiện đại đã hỗ trợ chế độ SameSite=Lax hoặc SameSite=Strict giúp ngăn request từ domain khác gửi cookie xác thực về cho website. Tuy nhiên, nhiều nhà phát triển ngại chỉnh sửa hệ thống cũ, hoặc không hiểu rõ tác động thực tế, vẫn để mặc định SameSite=None không lý do dẫn đến cookies tải cùng POST/GET request độc hại.
Khi chuyển sang ứng dụng SPA, nhiều lập trình viên vô tình bỏ qua CSRF vì nghĩ “không có form, không có CSRF”. Tuy nhiên, nhiều API vẫn xác thực qua cookie hoặc JWT, hacker hoàn toàn có thể dàn dựng CSRF qua AJAX, đặc biệt trong các trang nhúng iframe hoặc các ứng dụng phụ lục nội bộ.
CAPTCHA và 2FA không phải là giải pháp hữu hiệu tuyệt đối chống CSRF. CAPTCHA có thể bị lừa hoặc ghi nhận sai khi áp dụng không đúng vị trí, còn 2FA dạng cũ (gửi mã OTP qua email/SMS) một khi bị lộ vẫn bất lực trước dạng tấn công tinh vi, phối hợp cùng tactic khác (ví dụ exploit chiếm quyền gửi OTP qua CSRF request).
Không cần đến hệ thống tiên tiến mới giải quyết triệt để CSRF. Sau đây là một checklist thực tiễn giúp bạn (dù là CTO hay một developer mới vào nghề) luôn có hệ thống an toàn hơn.
SameSite=Lax hoặc SameSite=Strict tùy app;Một ví dụ token CSRF sinh động bạn có thể dễ thử nghiệm với code Python Flask:
from flask import Flask, session, request, render_template_string
import os
app = Flask(__name__)
app.secret_key = os.urandom(32)
def get_csrf_token():
if 'csrf_token' not in session:
session['csrf_token'] = os.urandom(16).hex()
return session['csrf_token']
@app.route('/form', methods=['GET', 'POST'])
def handle_form():
if request.method == 'POST':
if request.form.get('csrf_token') != session.get('csrf_token'):
return 'CSRF attack detected!', 403
return 'Form submitted successfully!'
form = f'''
<form method="POST">
<input name="data"/>
<input name="csrf_token" value="{get_csrf_token()}" type="hidden"/>
<button>Submit</button>
</form>'''
return render_template_string(form)
Có những trường hợp, nhà phát triển tự hỏi: “Nếu app tôi chỉ toàn GET request, hoặc các form đều gửi email xác nhận thì có thật là lo CSRF không?”
Một sai sót nhỏ (ví dụ: chỉ bỏ quên CSRF token ở form “Đổi mật khẩu”, hoặc trong API delete user) có thể dẫn tới mất kiểm soát dữ liệu/site, tặc quyền admin hoặc hậu quả “treo bảng cáo phó” như các vụ gần đây trên thế giới.
Công nghệ phòng vệ càng ngày càng cải thiện, cộng đồng bảo mật đều nghĩ rằng CSRF đã quá lạc hậu. Tuy nhiên, có một điệp khúc không bao giờ cũ: “con người là mắt xích yếu nhất”.
Khi Google Chrome cố định SameSite=Lax, số vụ tấn công CSRF từ bên ngoài web gần như là con số nhỏ giọt. Nhưng chính việc nhiều app bỏ qua cập nhật, hệ thống lay lắt trên phần mềm cũ (rất phổ biến ở các phòng lab, doanh nghiệp SMEs và cả ở những trường đại học lớn Việt Nam), hễ còn một form không token hoặc một cookie SameSite=None không hazzard thì hacker, scammer vẫn chờ đón ngày "ăn quả ngọt".
Hơn nữa, các thiết bị IoT, các hệ thống nội bộ dùng duy nhất whitelist IP, ngày càng bị tấn công CSRF thông qua các bên thứ 3 hoặc các script độc nhúng "ngược" từ chính hạ tầng phụ trợ công ty.
Vậy, CSRF không phải là bóng ma đã biến mất, cũng chẳng phải quái vật không tên. Nó là hiện thân của sự chủ quan, của câu “chắc đồ mình không lỗi đâu” – một câu nói bị lạm dụng và trả giá hàng trăm triệu, thậm chí cả tài sản khổng lồ về sau. Hãy chủ động thắt chặt an ninh ngay từ chi tiết nhỏ nhất, bởi hacker sẽ không bao giờ bỏ lỡ một cơ hội "ăn sẵn" nguy hiểm mà bảo vệ chỉ đơn giản là đừng lười biếng hoặc ỷ lại vào công nghệ.