Mình đã “vượt” captcha của trường đang học như thế nào?

Trang quản lý sinh viên của trường mình khá đơn giản và tốc độ truy cập rất nhanh, tuy nhiên có một điểm mình không thích là phải nhập captcha và đặc biệt lại phân biệt hoa thường khi gõ. Mình lười lắm, siêu lười, và đã ngâm cứu để tìm ra cách để có thể tự động điền captcha với độ chính xác 100%.

Mình nghĩ cũng khá đơn giản vì captcha chỉ có 4 kí tự thôi, và là hình ảnh đơn giản như video trong bài viết nên chắc cũng không quá khó để… lười 😛

Toàn bộ source code được mình public trên Github (tdtgit/CTUET-captcha-autocomplete), rất hoan nghênh các bạn PR để cho code được đẹp hơn và hoạt động tốt hơn.

Hoặc star cho Tuấn cũng được *chớp mắt* =))

Cập nhật 18.10.2017

Sau khi đăng bài viết lên J2Team Community và nhận được rất nhiều phản hồi từ các bạn, trong đó có cách làm rất hay của bạn Bi Nguyên mà mình lại không nghĩ ra, lại đi phức tạp hóa vấn đề.

Mình đã cập nhật extension lên bản 0.3, chạy ngon lành và tất nhiên là nhanh hơn rất nhiều. Cảm ơn tất cả mọi người.

Tìm hiểu

Nếu đọc code bằng cách click chuột phải rồi view source thông thường, chúng ta chỉ thấy được phần tĩnh của website. Như hình, các thuộc tính value đều bằng 0,thuộc tính src của thẻ hình ảnh cũng rỗng. Có thể suy ra website lấy captcha bằng Javascript.

Chuyển sang đọc code bằng trình Developer Tools của Chrome thì kết quả khả quan hơn. Input có tên txtSecurityCodeValue kia có đoạn value nhìn như mã hóa md5, website của trường cũng có load một đoạn giúp mã hóa md5. Vậy tập trung vào đây thôi.

Tại sao không chú ý đến link hình ảnh kia? Tên của file hình ảnh là mã hóa base64, giải mã ra, chúng ta được các giá trị ngày/tháng/năm giờ:phút:giây. Thử mã hóa thời gian trong tương lai để đoán trước hình ảnh được tạo ra nhưng không thành công, do trường dùng một phương thức ajax để tạo và hình ảnh này chỉ tồn tại khoảng vài chục giây. Vậy nên mình bỏ qua, tập trung vào đoạn md5 kia.

Mình càng chắc chắn hơn khi click vào refresh (yêu cầu mới) captcha thì chỉ có link hình ảnh và cái dãy md5 kia là thay đổi.

Thử vượt captcha

Lúc đầu, mình định giải mã dãy md5 này bằng cách dùng các API có sẵn trên mạng, kết quả thì khoảng 10% là giải mã được (dù gì cũng là một tỉ lệ rất cao). Tuy nhiên, dựa vào hình ảnh captcha của trường khá đơn giản, 4 kí tự, font chữ bình thường, không có rồng rắn. Vậy thử dùng các API nhận diện chữ viết xem sao.

Bạn cũng có thể dùng một hình ảnh nào đó có chữ viết và thử nghiệm khả năng nhận diện của dịch vụ tại đây. Như hình bên dưới, mình thấy khả thi khi dùng dịch vụ này để nhận diện captcha.

Kết quả rất mĩ mãn, tỉ lệ nhận diện chính xác khoảng 80 – 90%. Mình đã làm như thế nào để tỉ lệ này đạt 100% tuyệt đối? Hãy nhớ lại đoạn md5 phía trên, nó chính là đoạn mã hóa của 4 kí tự captcha. Mình chỉ việc so sánh kết quả của API nhận diện chữ viết với dãy md5 này, nếu không giống nhau, yêu cầu captcha mới và tự động thực hiện lại các bước giải mã từ đầu.

Các bạn nhấn vào video bên dưới để xem nhé, do nút Play trùng màu trắng 😛

Kết

Do captcha của trường mình đang học là tự xây dựng nên việc vượt qua là khá dễ dàng. Nếu nhà trường thay đổi font chữ, phông nền làm cho API nhận diện khó nhận diện hơn, thì vẫn còn dãy md5 kia để sử dụng, dù sẽ chậm hơn rất nhiều.

Giải pháp đơn giản là sử dụng reCaptcha của Google hoặc làm hình ảnh captcha khó đọc (nhận diện) hơn sẽ giúp website an toàn hơn 😀

Leave a Reply

Your email address will not be published. Required fields are marked *