I. Giới thiệu
Khi thiết kế ứng dụng web, do đặc tính HTTP là Stateless protocol nên việc cần thiết là làm thế nào giữ kết nối giữa Client và Server. Để làm công việc này các nhà lập trình dùng phương thức đưa các giá trị về cho User và kiểm tra lại khi cần thiết, giá trị được đưa xuống thường bằng một số cách: cookie, encode URL và HTTP Form hidden field.
Việc sử dụng form hidden field thường được sử dụng vì có thể chứa nhiều dữ liệu, nhưng đây là một phương thức không an toàn nếu chứa các dữ liệu nhạy cảm.
Vd sau minh họa một Form với hidden field:
Form trên HTML:
Trích:
<Form action=http://congty.com/shop.php method=POST>
...
<input type=hidden name=price value="99.99">
...
</Form>
Khi sử dụng hidden field người dùng cuối sẽ không thấy các giá trị này được truyền xuống nhưng một Attacker chỉ cần đơn giản mở source code ra xem là sẽ thấy được các thông tin này và việc chỉnh sửa có thể thực hiện bằng cách save trang web hoặc dùng công cụ hỗ trợ như proxy sẽ thay đổi toàn bộ dữ liệu truyền lên Server:
Request lúc gửi lên Server:
Trích:
POST /shop.php HTTP/1.0
....
price=99.99
Request đã bị chỉnh sửa:
Trích:
POST /shop.php HTTP/1.0
....
price=0.99
Đoạn code trên minh họa một Attacker thay đổi trường giá được đưa xuống máy anh ta thông qua HTTP Form.
Một cách để hạn chế sự khai thác này là kiểm tra lại trang trước đó bằng trường HTTP_REFERER. Tuy nhiên, nếu một người biết lập trình sẽ dễ dàng thay đổi được các trường này trong HTTP header.
Hãy xem sự nguy hiểm của các khai thác này qua đoạn minh họa sau:
1. Tí muốn tìm việc làm nên đăng ký vào một trang web:
Click this bar to view the full image.
2. Tí đăng nhập vào:
Click this bar to view the full image.
3. Tí muốn chỉnh sửa hồ sơ mình nên vào mục chỉnh sửa:
Click this bar to view the full image.
Click this bar to view the full image.
4. Tí xem thử source code:
Click this bar to view the full image.
..và thấy một hidden field nghi ngờ: user_id!
Click this bar to view the full image.
Nghĩ đây có thể là id của user truyền lên Server để update thông tin, Tí thử thay đổi thông tin email của user_id trước đó bằng email của mình (id của Tí: 51369, id sửa: 51368). Tí làm với công cụ hỗ trợ Burpsuite:
Click this bar to view the full image.
Xong.
5. Tí vào mục "quên mật khẩu" để reset lại mật khẩu user này:
Click this bar to view the full image.
Click this bar to view the full image.
Click this bar to view the full image.
Click this bar to view the full image.
Click this bar to view the full image.
Click this bar to view the full image.
Click this bar to view the full image.
Click this bar to view the full image.
6. Tí đăng nhập với email và mật khẩu mới:
Click this bar to view the full image.
Thành công. Tí lúc này có thể xem hồ sơ user này:
Click this bar to view the full image.
Với cách làm này Tí có thể đánh cắp được bất kỳ account nào.
Lỗi đã được gửi đến Quản trị website.
III. Hướng khắc phục:
- Không nên lưu các dữ liệu quan trọng tại Client.
- Sử dụng các phương thức encrypt session như SSL để encrypt cookie hay input data
- Dùng các giải thuật hash trên các dữ liệu.
__________________
RefLink: http://nhatnghe.com/forum/showthread.php?t=31182