Sau một khoảng thời gian vật vã thì mình cũng hoàn thành bài đầu tiên trong series Bảo Mật Nhập Môn. Bài viết này sẽ bàn về sự “bảo mật” của giao thức HTTP.
Website của Lazada và Ngân hàng ACB sẽ bị lôi ra làm ví dụ. Vì bài viết khá dài nên các bạn cứ từ từ đọc nhé.
Ôn lại về HTTP
HTTP là một giao thức dùng để truyền nhận dữ liệu. Hiện tại, phần lớn dữ liệu trên Internet đều được truyền thông qua giao thức HTTP. Các ứng dụng Web hoặc Mobile cũng gọi Restful API thông qua giao thức HTTP.
Tuy nhiên, nhược điểm của HTTP là dữ liệu được truyền dưới dạng plain text, không hề được mã hoá hay bảo mật. Điều này dẫn đến việc hacker có thể dễ dàng nghe lén, chôm chỉa và chỉnh sửa dữ liệu. Người ta gọi kiểu tấn công này là Man-in-the-middle attack, viết tắt là MITM.
Sơ lược về Man-in-the-middle attack
Hãy tưởng tượng bạn đang tán tỉnh một em gái dễ thương mặt cute ngực to dánh khủng tên Linh. Để tăng tính lãng mạn, bạn không nhắn tin mà trực tiếp viết thư gửi cho nàng.
Lúc này, bạn là client, bé Linh là server, việc gửi thư là giao thức HTTP. Đương nhiên, hoa đẹp thì lắm ruồi bu. Có một thằng hacker xấu xa bỉ ổi tìm cách phá rối bạn, ta tạm gọi thằng này là Hoàng cờ hó.
Thằng Hoàng cờ hó có thể phá rối bạn bằng những cách sau:
1. Sniff packet để đọc lén dữ liệu
Bạn hí hửng bỏ thư vào hòm thư, chờ bức thư bay đến chỗ Linh. Thư đang trên đường tới, thằng Hoàng bắt được, mở bức thư ra xem, biết được hết những lời tâm tình ủ ê mà bạn dốc cạn tấm lòng ra viết.
Trong thực tế, khi bạn gửi username, password qua HTTP, hacker có thể dễ dàng chôm username, password này bằng cách đọc lén các packet trong mạng. (Bạn gửi clip 18+ thì nó cũng chôm được nốt).
2. Sửa đổi packet
Không chỉ đọc trộm, thằng Hoàng cờ hó kia còn có thể sửa thư của bạn. Bạn khen Linh đẹp như Maria Ozawa thì nó sửa thành Happy Polla. Linh reply lại, hẹn bạn đi nhà nghỉ lúc 5h thì nó sửa thành 5h15.
Bạn vẫn không hay biết thư đã bị tráo gì cả. Đến lúc đọc xong, 5h15 ra nhà nghỉ thì đã thấy thằng cờ hó và Linh tay trong tay dắt nhau ra. (Thằng H yếu sinh lý nên 15p là xong, các bạn nên thông cảm cho nó).
Trong thực tế, hacker có thể thay đổi nội dung bạn nhận được từ server, làm thay đổi thông tin hiển thị trên máy bạn. Cả 2 trường hợp này đều khá nguy hiểm vì bạn không hề biết mình bị tấn công.
Kiến thức này thuộc dạng vô cùng cơ bản, nhiều người đã nói rồi nên mình sẽ không giải thích kĩ về khía cạnh kĩ thuật. Các bạn có thể tự tìm hiểu thêm về MITM Attack ở đây:
- https://kechocgian.blogspot.com/2013/04/lan-attack-man-in-middle.html
- https://www.slideshare.net/tiktiktc/m-32494038
- VNPro forum
- https://en.wikipedia.org/wiki/Man-in-the-middle_attack
- https://www.familug.org/2012/03/gioi-thieu-ve-cach-thuc-tan-cong-man-in.html
Cách phòng chống
Các giải pháp chống MAIM trong mạng LAN thường do SysAdmin hoặc các bạn chuyên bảo mật lo, thông qua việc cài đặt thiết lập hệ thống. Là developer, cách phòng chống cơ bản nhất chúng ta có thể làm là sử dụng giao thức HTTPS cho ứng dụng, bằng cách thêm SSL Certificate.
Dữ liệu giao tiếp qua HTTPS đã được mã hoá nên người ngoài không thể đọc trộm hay chỉnh sửa được. Cách này tương tự như việc bạn và Linh viết mail cho nhau bằng teencode, thằng Hoàng cờ hó kia có đọc trộm mail cũng không hiểu hay sửa thư được.
Tuy độ bảo mật của HTTPS vẫn chưa phải là tuyệt đối, nó vẫn cao hơn nhiều so với chỉ dùng HTTP thuần. Trong phạm vi bài viết, mình không tìm hiểu thêm về những lỗi bảo mật của HTTPS, mong các pro vào góp ý.
Ngoài ra, nếu trang web của bạn chưa thể tích hợp https, bạn có thể tích hợp chức năng đăng nhập thông qua Facebook, Google. Tuy hacker vẫn có thể chôm cookie của người dùng, nhưng ít ra họ không bị lộ username và password.
Lưu ý
Hiện tại nhiều trang web vẫn sử dụng “https giả cầy” – chỉ sử dụng https ở những trang log-in và những trang có dữ liệu nhạy cảm. Cách làm này vẫn tồn tại khá nhiều nguy hiểm.
Cảnh báo trước: Hiện tại, mình sử dụng Fiddler để demo ở local. Tuy nhiên, hacker có thể làm các trò này khi dùng chung LAN/WLAN với bạn. Do đó, cần hết sức cẩn thận khi dùng wifi chùa/wifi công cộng nhé.
- Mình sẽ lấy Lazada ra làm ví dụ về sự “giả cầy” này.
Phần đăng nhập của trang này dùng https, do vậy mình không thể sniff được username, password.
Tuy nhiên, các trang khác của lazada vẫn dùng http. Khi người dùng vào các trang này mình có thể chôm được cookie, sử dụng cookie này để đăng nhập như thường.
Ngày xưa, khi Facebook chưa dùng https, tụi mình cũng dùng cách này để sniff và đăng nhập account facebook của người khác.
2. Lần này mình sẽ lấy trang web của Ngân hàng ACB ra làm ví dụ. Trang này có sử dụng HTTPS cho trang giao dịch, nhưng trang chủ vẫn là HTTP.
Mình có thể sửa packet để dẫn người dùng tới trang lừa đảo.
Một số trường hợp khác, trang web dùng HTTPS nhưng vẫn tải hình ảnh, java_script, css qua http. Hacker vẫn có thể dễ dàng sửa nội dung java_script, trộm cookie như thường. Do đó, Google khuyến cáo sử dụng https cho toàn bộ các trang và các link chứ đừng để kiểu giả cầy như thế này nhé.
Kết
Hiện tại Chrome cũng đang có kế hoạch thị các trang HTTP là không an toàn để cảnh báo cho người dùng. Ở những phiên bản sau, bạn sẽ thấy chữ “Not secure” trên thanh địa chỉ nếu trang web chỉ sử dụng HTTP.
Hai điều quan trọng nhất về HTTP rút ra từ bài viết:
- HTTP không an toàn hay bảo mật. Tuyệt đối không bao giờ submit thông tin quan trọng (mật khẩu, số thẻ ngân hàng) qua HTTP!
- Sử dụng http dể duyệt web cũng giống như nện gái mà không cần BCS. Nhiều khi dính bệnh chết lúc nào chẳng biết đấy!