Gần đây, càng tìm hiểu nhiều về CTF, mình càng chú trọng tới bảo mật hơn. Điều này làm mình nhớ tới khoảng tgian khi mình bắt đầu hoạt động theo hướng chuyên nghiệp, mở rộng ra bên ngoài. Mình đã gặp nhiều CEO, được nghe và học hỏi nhiều điều từ câu chuyện của họ. Mình chợt nhớ tới 1 CEO cũng khá “ngầu” mà mình đã từng có dịp được học hỏi, đó là anh Hùng Color Me.

Tiện ghé qua web bên anh, mình có thử về mặt bảo mật của hệ thống. Kết quả là mình tìm đc 4 lỗ hổng trên website colorme.vn. Trong bài này, mình xin giới thiệu 2 lỗ hổng nghiêm trọng nhất, mà đã được bên anh vá khá nhanh, gần như ngay sau khi mình thông báo:

  1. Lỗ hổng Stored XSS – mức độ cực kỳ nghiêm trọng
  2. Lộ thông tin thông tin (sđt, email, địa chỉ,…) thông qua API

Lỗ hổng Stored XSS

XSS luôn là vấn đề nhức đầu nhất trong lập trình web. Đối với trang web Color Me, hầu hết tất cả mọi chỗ người dùng có thể nhập dữ liệu lên, đều được quản lý chặt chẽ.

Tuy nhiên, chỉ có duy nhất 1 vị trí bị nghi ngờ, đó chính là hành động đăng bài viết.

Rõ ràng là để up những bài viết sinh động, có video, chữ in đậm, nghiêm,… thì cho phép người dùng sử dụng HTML là điều đương nhiên. Tuy nhiên, ở các hệ thống như wordpress, họ cũng phải quản lý rất rất chặt chẽ phần này.

Ở web của Color Me, họ cũng cho phép viết bài dưới dạng html, nhưng bên server lại ko kiểm soát gì liên quan đến nội dung. Đội lập trình đã làm cách nào đó để tránh browse đọc các thẻ <script> được load vào cùng nội dung. Tuy nhiên có vẻ họ quên mất 1 điều nữa cũng rất quan trọng, đó là không phải đoạn mã javascript nào cũng viết trong thẻ <script>

POC (proof of concept) của mình dưới đây đặt 1 đoạn mã đơn giản để xóa sạch nội dung bên trong trang web, và ghi vào dòng chữ “this page has been hacked”. Tất nhiên, nếu là kẻ xấu, họ hoàn toàn có thể đánh cắp token, hoặc thậm chí đổi giao diện thành 1 trang login giả mạo để lấy password.

Lộ thông tin thông tin (sđt, email, địa chỉ,…) thông qua API

Trong khi khám phá web của Color Me, mình nhận thấy rằng website này được làm từ những bộ phận không thống nhất.

Ví dụ như trang quản lý (manage) được lập trình hoàn toàn trên angular, trong khi toàn bộ giao diện trang chủ lại lập trình trên php – laravel, phần xem tác phẩm của học viên thì lại là react. Liệu chăng sự thiếu đồng bộ này có thể tạo ra 1 lỗ hổng?

Và câu trả lời là có. Mình đã tìm ra lỗ hổng ở tính năng chỉnh sửa thông tin, cụ thể là tính năng đó hoạt động như sau:

Bước 1: Load giao diện

Bước 2: Load thông tin có sẵn của người dùng

Bước 3: Người dùng chỉnh sửa

Bước 4: Server lưu lại thông tin mới này

Ở bước 2, thông tin có sẵn này được tải về từ API JSON của hệ thống. Điều đặc biệt là nó ko yêu cầu token, có nghĩa là bạn ko cần thiết đăng nhập, bạn vẫn có thể lấy mọi thông tin về 1 người bất kỳ, chỉ cần biết username của họ.

Ở đây mình ví dụ từ 1 email mình lấy được từ lỗ hổng đầu tiên. Mình có thể xem đc cả ngày tháng năm sinh, sđt, địa chỉ, trường học của họ.

Tuy nhiên, không phải email nào cũng đăng ký học colorme, và thậm chí có khi email họ lại khác với username, và thậm chí ko phải ai cũng đưa đầy đủ thông tin của họ lên web.

Vậy mình sẽ làm cách nào để lấy toàn bộ username đã có trong database? Các bạn hãy đón xem phần 2 nhé!

Update tiến độ sửa lỗi:

  • Chiều ngày 16/09 (giờ Pháp), mình tìm đc 1 lỗ hổng và thông báo cho Color ME.
  • Tối ngày 18/09, mình tìm ra 3 lỗ hổng còn lại và thông báo cho Color ME. Tuy nhiên lỗ hổng trước đó vẫn chưa đc sửa.
  • Chiều ngày 19/09, mình đã xác nhận rằng bên kỹ thuật đã sửa 3 / 4 lỗi, chỉ trong vòng 24h kể từ sau khi mình thông báo. Anh Hùng cũng đã gửi 1 khoản bonus thưởng cho mình.