Theo truyền thống, giao thức HTTP chỉ cho phép một yêu cầu / phản hồi trên mỗi kết nối TCP. JavaScript và XML không đồng bộ (AJAX) cho phép máy khách gửi và nhận dữ liệu không đồng bộ (trong nền mà không cần làm mới trang) đến máy chủ, tuy nhiên, AJAX yêu cầu máy khách khởi tạo các yêu cầu và đợi phản hồi của máy chủ (bán song công).
WebSockets cho phép máy khách hoặc máy chủ tạo kênh giao tiếp ‘full-duplex’ (hai chiều), cho phép máy khách và máy chủ thực sự giao tiếp không đồng bộ. WebSockets tiến hành bắt tay nâng cấp ban đầu của họ qua HTTP và từ đó trở đi tất cả giao tiếp được thực hiện qua các kênh TCP bằng cách sử dụng các khung. Để biết thêm, hãy xem Giao thức WebSocket.
Origin
Máy chủ có trách nhiệm xác minh tiêu đề Nguồn gốc trong quá trình bắt tay HTTP WebSocket ban đầu. Nếu máy chủ không xác thực tiêu đề gốc trong lần bắt tay WebSocket ban đầu, máy chủ WebSocket có thể chấp nhận các kết nối từ bất kỳ nguồn nào. Điều này có thể cho phép những kẻ tấn công giao tiếp với miền chéo của máy chủ WebSocket cho phép các vấn đề giống CSRF. Xem thêm Top 10-2017 A5-Kiểm soát truy cập bị hỏng.
Tính bảo mật và tính toàn vẹn
WebSockets có thể được sử dụng trên TCP không được mã hóa hoặc qua TLS được mã hóa. Để sử dụng WebSockets không được mã hóa, lược đồ ws: // URI được sử dụng (cổng mặc định 80), để sử dụng WebSockets được mã hóa (TLS), lược đồ wss: // URI được sử dụng (cổng mặc định 443). Xem thêm Phơi sáng dữ liệu nhạy cảm trên A3 tháng 10-2017.
Vệ sinh đầu vào
Như với bất kỳ dữ liệu nào có nguồn gốc từ các nguồn không đáng tin cậy, dữ liệu phải được làm sạch và mã hóa đúng cách. Xem thêm Top 10-2017 A1-Injection và Top 10-2017 A7-Cross-Site Scripting (XSS).
Xem thêm Bảo mật wordpress cho người mới bắt đầu
Mục tiêu kiểm tra bảo mật WebSockets
Mục tiêu chính của quá trình kiểm tra bảo mật WebSockets là không chỉ xác định việc sử dụng WebSockets mà còn đánh giá tính an toàn và bảo mật của triển khai thông qua việc áp dụng các phương pháp kiểm tra tương tự như trên các kênh HTTP thông thường. Dưới đây là các khía cạnh quan trọng cần được xem xét:
- Phân Tích Sử Dụng WebSockets:
- Xác định cách mà ứng dụng sử dụng WebSockets, bao gồm mục đích và tính chất của việc thiết lập kết nối WebSocket. Điều này có thể bao gồm truyền tải dữ liệu thời gian thực, cập nhật trạng thái của ứng dụng, hoặc tương tác người dùng thời gian thực.
- Kiểm Tra Các Điểm Cuối WebSocket:
- Đảm bảo rằng các điểm cuối (endpoints) WebSocket được xác định và bảo vệ một cách an toàn. Kiểm tra các cơ chế kiểm soát truy cập để đảm bảo rằng chỉ những người được ủy quyền mới có thể thiết lập kết nối và truyền thông tin.
- Sử Dụng Mã Hóa WebSocket (WSS):
- Nếu dữ liệu truyền tải qua WebSockets là nhạy cảm, đảm bảo rằng kết nối được thiết lập thông qua giao thức WSS (WebSocket Secure) để đảm bảo mã hóa dữ liệu trong quá trình truyền tải.
- Kiểm Tra Các Mô Hình Tấn Công:
- Thực hiện kiểm tra bảo mật để đánh giá khả năng chống lại các mô hình tấn công như XSS (Cross-Site Scripting) và CSRF (Cross-Site Request Forgery) trên kết nối WebSocket.
- Kiểm Tra Mô Hình Quyền Truy Cập:
- Đảm bảo rằng các kết nối WebSocket chỉ được thiết lập và sử dụng bởi những người dùng được ủy quyền. Kiểm tra mô hình quyền truy cập để ngăn chặn kết nối từ những nguồn không an toàn.
- Kiểm Tra Thời Gian Hết Hạn Của Kết Nối:
- Đặt thời gian hết hạn cho kết nối WebSocket để giảm nguy cơ lợi dụng kết nối mở không cần thiết và để đảm bảo rằng không có kết nối không hoạt động được duy trì quá lâu.
- Kiểm Tra và Ghi Nhật Ký An Ninh:
- Triển khai cơ chế ghi nhật ký an ninh để theo dõi và phát hiện các hoạt động bất thường trên kết nối WebSocket. Điều này có thể giúp xác định các tấn công có thể đang được thực hiện và thực hiện biện pháp ngăn chặn.
- Kiểm Tra Khả Năng Mở Rộng:
- Đánh giá khả năng mở rộng của hệ thống trong việc xử lý đồng thời nhiều kết nối WebSocket mà không ảnh hưởng đến hiệu suất tổng thể của ứng dụng.
Bằng cách thực hiện những bước kiểm tra này, người kiểm tra bảo mật có thể đảm bảo rằng triển khai WebSockets của hệ thống là an toàn và bảo mật, giảm nguy cơ bị tấn công và bảo vệ thông tin quan trọng được truyền tải qua kết nối này.
Xem thêm Kiểm tra lỗ hổng bảo mật Weak Transport Layer Security
Làm thế nào để kiểm tra bảo mật WebSockets
Blackbox testing
- Xác định rằng ứng dụng đang sử dụng WebSockets.
- Kiểm tra mã nguồn phía máy khách cho lược đồ ws: // hoặc wss: // URI.
- Sử dụng Công cụ dành cho nhà phát triển của Google Chrome để xem giao tiếp của Network WebSocket.
- Sử dụng tab WebSocket của ZAP.
- Origin.
- Sử dụng ứng dụng khách WebSocket (có thể tìm thấy ứng dụng này trong phần Công cụ bên dưới) cố gắng kết nối với máy chủ WebSocket từ xa. Nếu kết nối được thiết lập, máy chủ có thể không kiểm tra tiêu đề gốc của bắt tay WebSocket.
- Confidentiality and Integrity.
- Kiểm tra xem kết nối WebSocket có đang sử dụng SSL để vận chuyển thông tin nhạy cảm không wss: //.
- Kiểm tra Triển khai SSL để biết các vấn đề bảo mật (Chứng chỉ hợp lệ, BEAST, CRIME, RC4, v.v.). Tham khảo phần Kiểm tra bảo mật lớp truyền tải yếu của hướng dẫn này.
- Authentication.
- WebSockets không xử lý xác thực, nên thực hiện kiểm tra xác thực hộp đen thông thường. Tham khảo các phần Kiểm tra xác thực của hướng dẫn này.
- Authorization.
- WebSockets không xử lý ủy quyền, nên thực hiện kiểm tra ủy quyền hộp đen thông thường. Tham khảo các phần Kiểm tra Ủy quyền của hướng dẫn này.
- Input Sanitization.
- Sử dụng tab WebSocket của ZAP để phát lại và làm mờ yêu cầu và phản hồi của WebSocket. Tham khảo phần Kiểm tra xác thực dữ liệu của hướng dẫn này.
Xem thêm Dịch vụ tối ưu UX,UI
Ví dụ 1
Khi chúng tôi đã xác định rằng ứng dụng đang sử dụng WebSockets (như được mô tả ở trên), chúng tôi có thể sử dụng OWASP Zed Attack Proxy (ZAP) để chặn yêu cầu và phản hồi của WebSocket. Sau đó, ZAP có thể được sử dụng để phát lại và làm mờ các yêu cầu / phản hồi của WebSocket.
Gray Box testing
Gray Box testing tương tự như black box testing. Trong kiểm tra hộp xám, người pentesting có một phần kiến thức về ứng dụng. Sự khác biệt duy nhất ở đây là bạn có thể có tài liệu API cho ứng dụng đang được kiểm tra, bao gồm các phản hồi và yêu cầu WebSocket dự kiến.