Tấn công CSRF – Mượn gió bẻ măng

Tấn công CSRF – Mượn gió bẻ măng

Cross-site Request Forgery (CSRF) là kỹ thuật tấn công bằng cách sử dụng quyền chứng thực của người dùng đối với một website. CSRF là kỹ thuật tấn công vào người dùng, dựa vào đó hacker có thể thực thi những thao tác phải yêu cầu sự chứng thực.

Kỹ thuật tấn công CSRF

Để hiểu rõ hơn về CSRF, ta xét một ví dụ sau:

Dịch vụ Internet Banking của một ngân hàng có chức năng chuyển tiền giữa các tài khoản. Đường link chuyển tiền từ tài khoản A sang tài khoản B có dạng:


http://www.tek.eten.vn/bank/sendfund.php?sender=A&receiver=B&amount=1000000000

trong đó sender là người gửi tiền, receiver là người nhận tiền và amount là số tiền chuyển. Hiển nhiên là đường link này chỉ được người A thực thi, vì thế nên phải có một thao tác kiểm tra sender chính là người thực thi đường link.

Tuy vậy, bằng một cách nào đó, hacker lừa được A chạy đường link trên (có thể là chèn một iframe tới đường link này, tại bài viết trong một forum và lừa cho A đọc bài viết), thao tác xác thực được vượt qua và hacker có thể chuyển tiền từ A đến bất kỳ tài khoản nào.

Một ví dụ nữa, giả sử thao tác xóa bài viết trong một forum được thực hiện bằng link sau:


http://www.tek.eten.vn/forum/deletepost.php?postid=1221

Thao tác này chỉ được thực hiện bởi tài khoản có quyền admin. Nếu lừa được admin chạy đường link trên, hacker có thể xóa bất kỳ bài viết nào mình muốn.

Phòng chống

Để ngăn chặn CSRF, có hai phương pháp thường được sử dụng:

  • Chèn thêm token vào đường link thực hiện thao tác. Giá trị token này phải mạnh, khó đoán, thường là hash của session ID của user kết hợp với password, IP của user, thời điểm đăng nhập,…Mục đích của token là làm cho hacker không thể xác định được chính xác đường link thực hiện thao tác.

Ở ví dụ Internet Banking của ngân hàng trên, ta thêm một biến token vào, đường link chuyển tiền có dạng


http://www.tek.eten.vn/bank/sendfund.php?sender=A&receiver=B&amount=1000000000&token=6fcd62fe72377212ab1c998642993556

Giá trị của biến token được sinh ra dựa trên những thông tin đặc trưng của user. Trong file sendfund.php sẽ có một hàm sinh ra token này và kiểm tra xem có khớp với giá trị token trên URL không, nếu không khớp thì thao tác chuyển tiền trên không được thực hiện

  • Chèn thêm bước xác nhận trung gian trước khi thực hiện các thao tác nhạy cảm: yêu cầu user nhập lại password để xác nhận thao tác của mình trước khi thực hiện hoặc sử dụng captcha để xác nhận.


facebook confirmFacebook yêu cầu nhập lại mật khẩu khi thực hiện những tác vụ nhạy cảm

Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!