Tóm Tắt
Lỗ hổng bảo mật Session Fixation có thật sự nguy hiểm như bạn nghỉ? Có cách nào để phòng chống và khắc phục?
Cách thức hoạt động của Session Fixation
Việc xử lý session IDs
không an toàn có thể khiến người dùng bị tấn công. Websites với tài khoản người dùng thông thường triển khai cơ chế xác thực để định danh người dùng và trả về cho người dùng. Sau khi xác thực, session sẽ được tạo. Server và browser sẽ hiều với nhau session ID, vậy nên server sẽ phân biệt được người dùng với mỗi HTTP request.
Nếu như hacker có thể truy cập tới session ID của người dùng khác, họ có thể mạo danh người dùng khác. SESSION FIXATION
là một phương thức tấn công mà hacker sử dụng để làm điều đó.
Trong bài viết này, Mal sẽ chỉ cho bạn cách thức hoạt động của lỗ hổng này, nếu như bạn chưa biết về nhân vật này thì có thể tìm hiểu trong của mình. Giả sử website của bạn passes session ID trong query string (chắc cũng hiếm người làm vậy :v). Mal chế ra URL có chưa session ID : www.lptech.asia?jsessionid=STEALING_UR_DATA
.
Vic là một người dùng trong hệ thống của bạn, anh ta rất thích chuột hamster, và cũng giả sử Mal biết được email của bạn, hoặc là đoán được. Hắn gửi cho Vic một email với đường link hấp dẫn về chuột hamster, trỏ tới đường dẫn đã được hắn craft
Vic click vào đường dẫn, giả sử anh ta chưa login, trang của bạn sẽ chuyển hướng về trang đăng nhập. Nó sẽ accepts session ID trước đó được chỉnh sửa bởi Mal trên URL. khi Vic đăng nhập thành công, session được establish, và anh ta có thể enjoy bức ảnh gif về chuột hamster:
Tuy nhiên, bây giờ Mal có thể truy cập theo đường dẫn mà hắn đã gửi cho Vic, và hắn cũng có thể truy cập với session của Vic, tức là hắn đã đăng nhập với tài khoản của Vic.
Bảo vệ Session Fixation
Nhìn chung thì nó cũng hiếm gặp, dễ khai thác và rất nguy hiểm.
Với kiểu tấn công này, hacker có thể bypass phương thức xác thực của bạn, và tệ hơn là bạn khó có thể phát hiện khi nó xảy ra. Có vài cách chống lỗ hổng này như sau.
Không truyền Session ID trong biến GET/POST
Truyền session ID trong query strings
, hoặc trong body của POST request chính là vấn đề. Ngoài ra session ID có thể bị rò rỉ theo những cách sau:
- Nếu người dùng follows link bên ngoài (
Referer
header sẽ mô tả trình duyệt tới từ đâu). - Trong lịch sử duyệt web và bookmarks.
- trong log trên server và bất ky proxy server nào.
Tốt hơn là truyền vào HTTP cookie, chẳng hạn như với PHP thì bạn có thể dùng
Tạo lại session ID khi xác thực
Do đã bị tạo lại nên session ID mà Mal tạo ra đã không còn trùng khớp nữa
chỉ chấp nhận tạo session ID ở phía server
Nó là practive tốt để chắc chắn chỉ server mới được phép tạo session ID.
Đặt Timeout và thay thế session ID cũ
Reset session ID định kỳ sẽ làm giảm rủi do gây lỗi này.
triển khai logout function đủ mạnh
Hàm logout nên đánh dấu session ID đã hết hạn.
Yêu cầu Session mới khi truy cập từ Referrers đáng ngờ
Xem xét việc login lại nếu nó truy cập từ nguồn khác.