15 April, 2020

#34: Có thể "gian lận" kiểm tra trên Shub không ?

#34: Có thể "gian lận" kiểm tra trên Shub không ?
Available in:
 Vietnamese
Reading time: 5 min.
Table of content

    Dạo này, DT khi kể cho mình về tình hình ở VN, thường nhắc đển việc phải làm bài kiểm tra trên một phần mềm tên là Shub. Do đây là một cái tên hoàn toàn xa lạ với mình, nên mình có cũng tìm hiểu qua về Shub. Có vẻ như đây là một startup mới nổi, với mục đích chính để đáp ứng nhu cầu học tập / kiểm tra online trong hoàn cảnh cách ly xã hội hiện tại.

    Và do cũng tò mò về mặt công nghệ (bệnh nghề nhiệp ý mà), nên mình quyết định sẽ “nghịch ngợm” một chút. Sau khi “đi dạo” qua một chút, mình thống nhất với DT rằng có 3 câu hỏi cần được giải đáp:

    Trước hết, mình cũng xin khẳng định mình không thể coi những thứ nói tới trong bài viết này là bug / lỗi (xin đọc phần giải tích ở cuối mỗi phần để hiểu rõ hơn). Ngoài ra, cũng vì những vấn đề này không nghiêm trọng, nên mình quyết định sẽ viết để chia sẻ, cho vui.

    1. Có thể gian lận thời gian làm bài không ?

    Mình bắt đầu bằng DevTool > Network, và khám phá ra rằng mỗi khi bắt đầu làm một bài kiểm tra, trình duyệt sẽ gửi 5 truy vấn về server:

    1. tests.findOne: lấy thông tin về bài kiểm tra
    2. tests.getFileLink: lấy link file PDF chứa đề bài
    3. user_test.isDid: kiểm tra xem người dùng đã làm bài chưa (isDone nghe sẽ hợp lý hơn nhỉ?)
    4. test_questions.getAll: lấy các câu hỏi của bài KT
    5. user_test.start: truy vấn này nghe có vẻ thú vị nhất, nó trả về 1 số nguyên tượng trưng cho thời gian làm bài đã trôi qua (trong trường hợp bạn lỡ F5 trang web)

    Như vậy mình tập trung nghiên cứu vào user_test.start. Thoạt đầu mình tưởng rằng nó thông báo cho server bắt đầu tính giờ làm bài, nên mình đã tạo một chrome extension nhỏ để redirect hết các truy vấn về server trung gian, chặn truy vấn đó, và luôn trả về giá trị 0 (tức là vừa mới bắt đầu làm bài)

    Tuy nhiên, khi test thực tế, mình nhận ra rằng kể cả có chặn truy vấn này, thì thời gian làm bài vẫn được tính như bình thường (thời gian được tính từ 1 trong các truy vấn trước nó).

    Vậy tính thì tính, nhưng còn nộp bài thì sao ?

    Để trả lời câu hỏi này, mình nhờ DT tạo một bài kiểm tra dài 5 phút trên một tài khoản khác, và mình sẽ thử vào, với extension để chặn user_test.start. Mình sẽ bấm vào làm bài, đợi hẳn 10 phút rồi mới nộp. Và kết quả bất ngờ, mình vẫn nộp được; thời gian làm bài được hiện lên là 5 phút.

    Nhưng đừng vội mừng, liệu chăng đây có phải lỗi ?

    Mình đoán là không. Có lẽ đây là một giải pháp cho vấn đề mạng lag không nộp được bài. Ví dụ như đang làm bài, gần hết giờ mà bạn bị mất internet, bạn có thể kết nối vào sau, và nộp bài như bình thường.

    2. Chưa tham gia lớp mà xem đề bài, có được không ?

    Truy vấn thứ 2 trong đống trên, tests.getFileLink, có nhiệm vụ đơn giản là lấy file PDF đề bài. Tuy nhiên, liệu rằng mình có thể lấy trước đề bài, sau đó nhờ người làm hộ, và lúc vào kiểm tra chỉ cần điền lại ?

    Để trả lời câu hỏi này, mình sử dụng Postman

    Câu trả lời là không. Và còn tệ hơn nữa, thời gian làm bài sẽ được tính ngay từ khi bạn gửi truy vấn tests.getFileLink.

    3. Khi làm bài xong và rời khỏi lớp, thì kết quả có còn lưu lại không ?

    Câu hỏi trên thực ra là “phiên bản ngắn gọn” hơn của kịch bản sau:

    1. Mình lập 1 account fake. Mình sẽ chọn tên tài khoản với những ký tự lộn xộn, để giáo viên vào sẽ nghĩ “có vẻ là lỗi, không cần quan tâm”
    2. Join lớp, làm bài kiểm tra
    3. Nếu may mắn, sau khi làm xong, bài sẽ đi kèm với đáp án
    4. Lưu đáp án này lại, rời khỏi lớp

    Tất cả những hành động trên, nếu dùng API, thì chỉ tốn chưa đến 15 giây để hoàn thành, đủ để giáo viên không để ý.

    Và thực tế khi mình test, điều này hoàn toàn có thể thực hiện được. Khi rời khỏi lớp, toàn bộ dữ liệu của bạn sẽ được “ẩn đi”, chỉ riêng có một cái thông báo hiện lên như thế này:

    Trường hợp của mình, mình sử dụng invisible unicode characters, nên chắc chắn khi nhìn vào, đa phần giáo viên sẽ nghĩ có lỗi, và bỏ qua.

    Nhưng tất nhiên con đường tới thành công không “thẳng” như vậy, cách này sẽ gặp các vấn đề sau:

    • Lớp học phải cho phép thêm người vào
    • ~~Giáo viên phải cho phép biết đáp án sau khi làm xong~~ (có thể bruteforce được đạp án, dù giáo viên có ẩn đáp án sau khi nộp bài)

    Lời kết

    Mặc dù một vài người sẽ thất vọng vì cái bài viết này chẳng chỉ cho bạn cách hack điểm, hack đề thế nào, nhưng mình vẫn mong các bạn cảm thấy hứng thú với những chi tiết kỹ thuật được nói tới.

    Đối với mình, việc viết lách và chia sẻ trong khoảng thời gian giới nghiêm (Confinement) này một phần khiến mình thấy có động lực làm việc hơn.

    Và mình mong bạn cũng vậy !

    Want to receive latest articles from my blog?