Mình đã hack phần mềm myFSOFT của FPT Software như thế nào?
Trong bài viết này mình xin chia sẻ về cách mình thực hiện cheat trong phần mềm myFSOFT, một phần mềm dành cho nhân viên tại FPT Software, khi mình là thực tập sinh tại đây. Mình đã báo cáo lỗi này cho team myFSOFT và họ đã sửa trong phiên bản mới.
Bối cảnh
Khi đi thực tập tại FPT Software, mình đi xe bus của công ty đưa đón do khoảng cách xa. Và có một điều hay đó là hằng ngày bạn sẽ check-in trên xe bus và sẽ nhận được 5 xu (tương ứng với 5 nghìn đồng) bằng phần mềm myFSOFT. Việc này mất rất nhiều thời gian khi mà mình sẽ phải lấy điện thoại ra, bật bluetooth, bật GPS, vào phần mềm myFSOFT chọn chức năng checkin xe bus, đợi phần mềm detect ra thiết bị gắn trên xe sau đó mới checkin được. OMG! Lúc đó mình ước có thứ gì đó có thể hàng ngày giúp mình checkin thì tốt biết mấy. Thế là vào ngày thứ 3 đi xe bus, mình quyết định lấy điện thoại ra để phân tích API của ứng dụng với hi vọng tìm được gì đó hay ho với mục đích ban đầu là tạo ra cron job để tự động checkin hàng ngày. Và từ đây câu chuyện bắt đầu...
Phân tích
Sử dụng phần mềm trên điện thoại Android để sniff gói tin khi đăng nhập và khi thực hiện checkin. Server chỉ sử dụng HTTP nên việc sniff không có gì là khó khăn. Ảnh bên dưới mình đã paste thông tin của packet lên VS Code cho dễ nhìn.
Dựa vào các thông tin trên, mình xác định khi tạo cron job sẽ cần thực hiện các bước: * Đăng nhập vào phần mềm myFSOFT để lấy token. * Sử dụng token đó để thực hiện các request khác. * Khi checkin, ngoài việc gửi kèm token trong headers thì phần mềm gửi các thông tin khác bao gồm: – beacon_id: đây là id của thiết bị BLE trên xe bus – id_bus: id của xe bus – date_check: thời gian thực hiện checkin theo định dạng UTC
Vậy là hoàn toàn có thể tạo cron job để tự động checkin hằng ngày. Nhưng chưa dừng lại tại đây, điều thực sự hay ho nằm ở chỗ, phần mềm gửi ngày giờ checkin lên server, tức là sẽ lấy ngày giờ của hệ thống phía client để gửi đi. Mình tự hỏi “Liệu gửi thế này có validate ở phía server không?”.
Thực hiện cheat
Sau khi đặt câu hỏi trên, thay vì mục đích ban đầu là chỉ tạo ra cron job, mình còn viết thêm 1 script bằng python để thử gửi thời gian checkin là một ngày khác với ngày hôm nay. Điều bất ngờ đã xảy ra. :D
Như các bạn cũng đã thấy, vào 01/08/2019 mình vẫn có thể checkin cho 05/07/2019.
Thử 1 vòng lặp để checkin coi sao:
Xu về liên tục luôn, từ xu của myFSOFT, mình có thể đổi sang ví điện tử Utop để ăn trưa hoặc lấy vé xem phim.
Sau khi tìm ra lỗi này, mình đã báo cáo lại và phía team myFSOFT đã sửa lỗi cũng như chuyển sang dùng HTTPS. Why HTTPS?
Kết luận
Qua đây chúng ta rút ra được ba điều: 1. Không nên tin tưởng bất cứ thông tin gì từ phía client 2. Nên sử dụng HTTPS để bảo mật hơn, sniff cũng khó hơn 3. Lười đôi khi cũng không thực sự có hại =))))))