Lab: Manipulating the WebSocket handshake to exploit vulnerabilities

📌 Bài viết này thuộc chuỗi write-up quá trình tiếp cận và đáp án cho các bài lab từ Portswigger Web Academy mà mình đã làm trong thời gian thực tập tại NCSC.

Mình không thích lắm cái cách mấy idol viết write-up lab theo kiểu cứ như thể họ đã biết đáp án từ đầu – họ chẳng bao giờ đủ kiên nhẫn để giải thích cặn kẽ tại sao họ lại làm một cái gì đó. Vậy nên, write-up phong cách bạn Tiểu ra đời. Mình mong là bạn có được những câu trả lời thoả đáng qua loạt bài này. Những ý kiến góp ý, thảo luận, báo lỗi – luôn luôn được hoan nghênh dưới mục comment.

Link bài lab

Đề bài

Ngữ cảnh: Shop online này có một tính năng live chat sử dụng kết nối WebSocket. Nó có một bộ lọc XSS tuy “gắt” nhưng tồn tại nhiều sơ hở.

Mục tiêu: Để giải được lab, gửi đi tin nhắn WebSocket để trigger alert() đến trình duyệt của người đang chat với bạn.

Phân tích

Vào lab, truy cập tính năng chat. Thử đấm cái xem bạn lab phản hồi thế nào:

Ái chà chà, dỗi luôn rồi.

Load lại trang để thấy “người ấy” đã thực sự kick bạn ra khỏi cuộc đời họ:

Một vòng đào bới và “thử bút” cho thấy tôi sẽ có hai tác vụ phải làm:

  1. Đặt payload làm sao đó để mã tạo alert() của tôi có tác dụng;
  2. Vượt qua được “tường” chặn IP của tôi một khi cái lab phát hiện ra tôi đang có ý định đấm nó.

Bài này tôi phải tìm kiếm Google hơi nhiều, vì để giải được nó đòi hỏi bạn phải thành thạo các thao tác cơ bản với tính năng cho WebSocket trong Burp Suite.

Lời giải

Bài này dùng tool với nhiều bước khá phức tạp, nên tốt nhất là bạn cứ làm theo video hướng dẫn của Portswigger:

Trong bài này, “manipulate WebSocket handshake” tức là việc mình sẽ clone kết nối để nối thêm Burp Repeater vào trong cuộc đối thoại:

Phải còn connected thì mới dùng được nhé. Clone ra cho Repeater rồi xài. Kết nối gốc ban đầu chính là từ Proxy.
  1. Clone kết nối (aka. handshake) và sau đó thêm X-Forwarded-For: 1.1.1.1 là bypass được cái chặn IP (làm như video hướng dẫn, nhớ chọn kết nối lấy /chat, chứ không phải cái lấy /labHeader). Thực ra lấy cái IP nào cũng được.
  2. Gửi lại payload:

3. Xáo trộn payload bằng cách thay đổi mấy chữ hoa chữ thường và các dấu để nó không nhận diện đó là một tấn công. Vì HTML coi chữ hoa chữ thường như nhau nên tôi thử:

<img sRc=1 onERRor='AlErt(1)'>

Khi parsing HTML mọi kí tự sẽ được chuyển về chữ thường. Nhưng cái này vẫn chưa đủ, vẫn sẽ bị nó báo “attack detected”.

4. Tôi đã phải viện tới sự trợ giúp từ idol tôi, cụ thể là cái write-up này:

Manipulating the WebSocket handshake to exploit vulnerabilities

Payload cuối cùng sẽ là:

<img src=1 oNeRrOr=alert`1`>

Lưu ý: Nếu như IP của bạn đã bị chặn sau vài lần thử không thành công, tắt đi bật lại lab vẫn bị chặn thì cách làm như sau:

Lấy cái connect cũ (miễn là vẫn chuẩn lab ID nhé) của Proxy tới /chat, thêm cái bypass XFF header kia, rồi kết nối lại. Làm thế là để tạo dựng lại kết nối WebSocket cho bên Proxy.

Tiếp tục clone kết nối sang cho Repeater như trên và giải nốt bài lab.