How to stalk your crush like a Pro

Tl;dr: Lỗ hổng của API của đại học X cho phép mình lấy danh sách và thông tin của hơn 32,000 sinh viên đã và đang theo học tại trường.

Mở đầu

Trường đại học của mình, cũng giống như nhiều trường đại học khác, sử dụng hệ thống điện tử để lưu trữ thông tin của toàn bộ sinh viên trong trường. Những thông tin này khá nhạy cảm nhưng cũng rất cần thiết cho hoạt động của trường, vậy nên việc có một phương pháp để truy cập những thông tin này là cần thiết

Từ giờ mình sẽ gọi trường đại học mình đang theo học là trường X.

Lỗ hổng của trường X

Lỗ hổng của trường X nằm ở API mà trường sử dụng để trả về thông tin học sinh trùng với họ và tên mà người dùng tiềm kiém. API này được thiết kế để có có thể sử dụng bởi chương trình Excel.

Tìm API

Trường X sử dụng một file Excel để giao tiếp với server, yêu cầu người dùng nhập họ, tên rồi sau đó tìm tất cả học sinh có trùng hoặc bắt đầu bằng họ và tên này

Sau khi nhập họ và tên, file Excel sẽ giao tiếp với server và hiễn thị thông tin

Từ đây mình có 2 cách để tìm url của API: extract file Excel hoặc dùng WireShark để capture package.

Cách 1:

File excel thực chất cũng chỉ là file zip bình thường, với các thông tin đặc biệt để chương trình Excel có thể hiển thị nội dung một cách chính xác. Bằng cách đổi từ tenfile.xlsx sang tenfile.zip, mình đã có được thông tin bên trong của file excel này


Nhìn sơ qua, mình tìm thấy một file có tên connection.xml, mở file này, mình thấy có đoạn code sau

Nhìn qua đoạn code này, mình có thể thấy được những thông tin cơ bản như url, post parameters. Các parameters được mình liệt kê ben dưới, các bạn có thể tìm thấy trong đoạn code trên:

  • Base URL: “http://informp[….]/query”
  • token=062[…..]
  • id=8[….]
  • parameter_0=[first_name]
  • parameter_1=[last_name]
  • encoding=ANSI
  • mvSelection=NEWROW

Thử gửi request tới url bằng các thông tin phía trên sử dụng tên mình, mình nhận lại được thông tin của bản thân, chứng tỏ đây là API

Cách 2:

Như mình có để cập phía trên, cách thứ 2 là sử dụng Wireshark để capture package gửi từ chương trình excel. Nếu các bạn để ý đoạn code phía trên, sẽ thấy rằng request được thực hiên qua HTTP, không phải HTTPS, nên việc đọc package sẽ dễ hơn rất nhiều!

Đây là hình ảnh của package được gửi từ Excel, tất cả các parameter đều y như đoạn code phía trên:

Vấn đề của API

Một trong những tính năng quang trọng của file excel này là tìm thông tin của học sinh mà không cần nhập chính xác từng ký tự, nghĩa là nếu bạn tên “Tuấn” thì chỉ cần nhận “Tu” là sẽ có được danh sách những người có tên bắt đầu bằng 2 ký tự “Tu”, trong đó có Tuấn

Vì tò mò, nên mình đã quyết định để trống first name và last name, lúc này request sẽ có dạng url.com/token=062[...]&id=8[...]&toparameter_0=&parameter_2=&...

Gửi request này đi, server mất khá lâu để response, nhưng kết quả thì chứa toàn bộ thông tin của sinh viên.

Thông tin của những sinh viên từ năm 1995, khi trường bắt đầu chuyển sang lưu thông tin điện tử và sinh viên vẫn chưa được cấp email

Cho tới những sinh viên vừa mới nhập học năm nay

Tại sao lỗ hổng này ở đây?

Một trong những lý do chính lỗ hổng này tồn tại là Excel không cho phép bạn gửi một parameter_0 và parameter_1 trống. Lúc nào request từ Excel cũng luôn có giá trị nào đó cho 2 parameters này. Vậy nên người viết server và tester đã không nghĩ tới trường hợp 2 parameters này bị bỏ trống.

Ranh giới giữa features và bug

Như mình có nói ở trên, một trong những tính năng chính của API này là cho phép người dùng tìm thông tin về sinh viên mà không cần biết chính xác từng chữ cái. Thế nhưng việc không kiểm soát được tính năng này, API đã làm lộ một một phần thông tin của hơn 32,000 sinh viên.

Timeline

  • 11/12/2019: Trình bày lỗ hổng trong final project của một lớp mình đang theo học
  • 13/12/2019: Giảng viên liên hệ trực tiếp để tìm hiểu thêm về lỗ hổng này
  • 18/12/2019: Bộ phận IT trường X xác nhận đã được thông báo về lỗ hổng
  • 12/2019: URL bị giới hạn truy cập, chỉ những máy tính trong các văn phòng mới truy cập được URL này.

Mình không nhận được bất kỳ cập nhật gì sau đó, token và id vẫn không được thay đổi, vậy nên mình đoán là API vẫn chưa được cập nhật để sửa lỗi, mà chỉ bị giới hạn truy cập.

Nếu bài viết có sai sót, mong các bạn hãy góp ý!

Bài viết followup đầu tiên của mình, inspired by Việt Thảo write up from J2Team!

Leave a Reply

Your email address will not be published.