Nui Blog

Trời tính không bằng máy tính

Secret Docs

[RPT/Bug] Web ColorME.vn

Created on 02/08/2019 – n32ubrh1xn

(1) Thiếu auth validations tại endpoint lưu bài viết – Mức độ nghiêm trọng

POST https://colorme.vn/api/v3/save-product?token=

  • Endpoint này không kiểm tra author_id == user_id đang đăng nhập không
  • Không kiểm tra xem người dùng có đc quyền đặt "kind": "blog" hay không (nếu =blog thì bài viết sẽ hiện ở https://colorme.vn/blogs)

Ảnh hưởng: có thể sửa bài viết của 1 người dùng bất kỳ

Giải pháp:
Giải pháp tạm thời có thể là thêm middleware để kiểm tra các input / auth
Về lâu dài, server nên chuyển sang dùng GraphQL, vì framework này cân bằng hơn giữa cả bảo mật và mức độ mở rộng về sau

(2) Stored XSS – Mức độ nghiêm trọng

Khi đăng bài, nội dung bài viết sẽ đc lưu dưới dạng HTML vào "product_content". Tuy rằng các thẻ <script> hay attribute onload đã đc loại bỏ trên phía server, cơ chế lọc này có vẻ đc code bằng thủ công nên không thể bắt tất cả các trường hợp.

Ví dụ như:
<img onload="alert(1)"> khi up lên sẽ thành <img >
Tuy nhiên,
<img onload = "alert(1)"> khi up lên sẽ đc giữ nguyên. Có vẻ như trên server đã sử dụng regex /on[a-z]+="[^"]+"/g

Ảnh hưởng: có thể lấy access_token của người xem bài viết (lưu trong localStorage.auth)

Giải pháp:
Xin lưu ý, việc lọc bỏ các phần javascript không nên được không hiện ở phía server. Thay vào đó nên sử dụng các thư viện sanitize HTML sẵn có. Tham khảo lý do tại đây: https://www.youtube.com/watch?v=lG7U3fuNw3A
Hoặc, có thể đặt code HTML của bài viết vào 1 iframe như các codepen làm, nhưng tất nhiên là sẽ ko tốt cho SEO rồi.

(Bonus) Phương án tấn công có thể xảy ra

Bằng việc kết hợp 2 lỗ hổng trên, kẻ xấu có thể dựng lên 1 kế hoạch:

  1. Chuẩn bị 1 script để đọc token từ localStorage.auth, sau đó lưu lên server kẻ tấn công
  2. Sử dụng để chèn script vào bài viết trên blog mà không làm thay đổi nội dung của bài đó
  3. Sử dụng token cho mục đích xấu (lấy thông tin, giáo trình, …)

Ghi chú

Theme by Anders Norén