Cách vượt mặt các công cụ validate ở client

Một website sẽ được chia ra làm 2 phần là backend và frontend. Backend là nơi xử lý dữ liệu từ người dùng, còn fronted là nơi hiển thị giao diện cho người sử dụng.

Tuy chỉ là nơi hiện thị giao diện, nhưng với sự phát triển mạnh mẽ của javascript và html5, thì nay cũng xuất hiện nhiều công cụ, thư viện cho phép xử lý dữ liệu cơ bản ở frontend trước khi nó được gửi lên backend để xử lý tiếp.

Việc xử lý phần nào dữ liệu ở frontend trước khi gửi lên backend để xử lý, sẽ làm tăng trải nghiệm người dùng, cũng như giảm tải được những logic không cần thiết ở phía backend. Tuy nhiên, lại có nhiều bạn developer không hiểu được ý nghĩa của việc validate dữ liệu ở frontend, cứ nghĩ dữ liệu validate ở frontend là đủ rồi, trên backend không cần validate lại nữa – đây là một suy nghĩ sai lầm vô cùng, và hậu quả của nó là để lại những lỗ hổng bảo mật Siêu to khổng lồ.

Bài viết sau đây, tôi sẽ chỉ cho các bạn một vài cách vượt mặt các tool, thư viện validate dữ liệu ở frontend, để các thấy rằng validate ở frontend chưa bao giờ là an toàn.

Một số cách validate ở frontend kèm cách vượt mặt chúng

1. Thuộc tính required của html

Thuộc tính required của html được áp dụng ở các thẻ input. Khi thẻ input mà đặt thuộc tính này thì trình duyệt sẽ bắt buộc người dùng phải nhập nội dung vào ô input rồi mới có thể submit được form.

Xem thêm: Chi tiết về thuộc tính required

Cách vượt mặt

Rất đơn giản, bạn chỉ cần bật tính năng “Kiểm tra phần tử” có sẵn trên trình duyệt, tìm đến thẻ input đó, xóa cái thuộc tính required đi. Lúc này, bạn đã có thể submit form mà không cần phải nhập gì vào ô input. Nếu ở backend không validate lại lần nữa, thì coi như bạn đã hack thành công.

2. Thuộc tính accept của html

Gần giống với thuộc tính required, thuộc tính accept được sử dụng trong thẻ input type="file" (thẻ sử dụng để upload file). Giá trị của thuộc tính accept là định dạng các tệp tin mà người được phép upload.

Xem thêm: Chi tiết về thuộc tính accept

Ví dụ đoạn code sau chỉ cho phép người dùng chọn các file định dạng ảnh để upload

Cách vượt mặt

Cách vượt mặt tương tự như thuộc tính required, bạn bật tình năng “kiểm tra phần tử” có sẵn trên trình duyệt, tìm đến thẻ input file đó, xóa thuộc tính accept="xxx" đi, là bạn có chọn bất kỳ định dạng file nào bạn muốn upload, chứ không nhất thiết phải là các định dạng file mà thuộc tính accept chỉ ra. Nếu trên server không validate lại định dạng các file được phép upload một lần nữa, thì bạn có thể upload được shell và tiến hành khai khác thông tin từ file shell đã upload. Bạn có thể tham khảo bài viết sau của tôi để hiểu rõ hơn về loại lỗ hổng bảo mật kiểu này.

Đọc thêm: Cơ duyên với lỗ hổng lớn và đánh giá Tool shell p0wny-shell

3. Các thư viện validate bằng javascript

Nếu như bạn muốn validate dữ liệu theo những điều kiện phức tạp, những điều kiện mà thuộc tính required hay accept tôi kể ra ở trên không thể đáp ứng được (như validate định dạng ngày tháng năm, định dạng số điện thoại,..). Thì bạn có thể tìm thấy một vài thư viện validate dữ liệu viết bằng javascript vô cùng hữu ích. Như tôi, tôi rất hay sử dụng thư viện này cho dự án của mình khi cần validate dữ liệu ở frontend.

Cách vượt mặt

Đặc điểm chung của các thư viện validate ở frontend là đều được viết bằng javascript, vậy chỉ cần làm sao để trình duyệt của mình không chạy javascript nữa là được. Rất đơn giản, với chrome bạn hoàn toàn có thể vô hiệu hóa javascript trên một trang web bất kỳ mà không điều gì có thể ngăn cản bạn được cả. Cách làm chi tiết thì các bạn có thể tham khảo bài viết này nhé.

Vậy khi tắt javascript, thì cũng đồng nghĩa với việc là các thư viện validate bằng js trên trang web sẽ không hoạt động, và tôi có thể tự do nhập những gì mình thích và gửi lên backend. Nếu backend không kiểm tra lại, thì sẽ tiềm ẩn rất nhiều điều nguy hiểm từ lỗ hổng này.

4. Khi website yêu cầu người dùng phải bắt buộc bật javascript

Có một số website yêu cầu trình duyệt truy cập phải bắt buộc bật javascript. Điều này có nghĩa là bạn không thể sử dụng cách vượt mặt các thư viện validate js mà tôi nói ở trên để lách qua được trường hợp này. Nhưng đừng buồn, tôi vẫn còn chưa dùng chiêu cuối mà. Đó chính là…

Sức mạnh thật sự của chiêu cuối

Cách vượt mặt

Đó chính là sử dụng CURL. Khi sử dụng CURL thì cuộc chơi là của bạn, bạn sẽ không bị frontend bắt buộc phải nhập ô input nào cả, bạn cũng không phải tuân theo quy tắc nhập liệu mà frontend đặt ra. Bạn loại bỏ tất cả vướng víu của frontend và gửi thẳng dữ liệu tới backend. Nếu ở backend, developer chủ quan không kiểm tra lại dữ liệu thì bạn vừa hack thành công rồi đó.

Cách khắc phục những lỗ hổng trên

Validate lại dữ liệu ở backend. Validate dữ liệu ở frontend chỉ có tác dụng làm tăng trải nghiệm người dùng, chứ không thể đảm bảo là dữ liệu đã được xử lý sạch sẽ. Vì bạn hoàn toàn có thể lách luật được theo 1 trong 4 cách mà tôi chỉ ra ở trên. Khi làm backend, bạn phải nhớ là không được tin bất kỳ dữ liệu nào được gửi lên từ frontend cả, vì chúng luôn tiểm ẩn khả năng sinh ra lỗi. Luôn phải validate lại lần nữa trước khi làm việc với dữ liệu được gửi lên từ fronted. Nhớ nhé.

Lời kết

Trên là 4 cách vượt mặt vô cùng cơ bản, nhưng lại hiệu quả. Chỉ với 4 cách trên, tôi đã hack thành công rất nhiều website với cách tấn công, khai thác dữ liệu từ lỗ hổng cũng rất đa dạng. Hy vọng bạn sẽ không gặp những lỗ hổng tương tự sau khi đọc bài viết này của tôi.

Hẹn gặp lại.

Nguồn: https://bugjoker.com/bai-viet/cach-vuot-mat-cac-cong-cu-validate-o-client/

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

bugjoker

2 bài viết.
8 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
2 0
Chào các bạn, quên mật khẩu hay reset mật khẩu, đặt lại mật khẩu là một tính năng phổ biến mà gần như website nào cũng có. Nó sẽ được sử dụng khi u...
bugjoker viết 2 tháng trước
2 0
Bài viết liên quan
White
40 3
(Ảnh) Giới thiệu thư viện VisSense.js Chắc hẳn hiện giờ những bạn nào thường xuyên dùng Facebook đều biết một chức năng hay ho của mạng xã hội n...
Juno_okyo viết hơn 3 năm trước
40 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
8 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!