Password Reset Poisoning là kỹ thuật cho phép Hacker tự ý thay đổi đường link reset mật khẩu về máy chủ của Hacker. Từ đó cho phép chiếm quyền kiểm soát tài khoản của người dùng.
Mục lục
Chức năng Forgot Password
Hầu hết trang web có chức năng chức năng đặt lại mật khẩu – Reset Password để giúp những người trùng đãng trí có thể thiết lập lại mật khẩu của mình. Việc này thường được triển khai theo những cách sau:
- Người dùng truy cập chức năng lấy lại mật khẩu. Nhập email sau đó nhấn nút gửi để yêu cầu trang web cấp lại mật khẩu.
- Nếu email tồn tại trong hệ thống cơ sở dữ liệu. Hệ thống sẽ gửi một đường Secret Link có dạng https://website.com/password/reset?token=0a1b2c3d4e5f6g7h8i9 đến email của người dùng để đặt lại mật khẩu.
- Sau khi người dùng mở Secret Link. Hệ thống biết đây chính là chủ sở hữu tài khoản đó và cho phép họ nhập mật khẩu mới.
- Sau khi mật khẩu được thay đổi, Secret Link sẽ hết hạn và người dùng không thể truy cập lại được nữa.
Chuỗi Token ngẫu nhiên trong Secret Link sẽ dùng để định danh cho từng thời điểm mà người dùng yêu cầu cấp lại mật khẩu. Chuỗi Token này chính là thứ chúng ta cần bảo vệ và không thể để lộ cho bất cứ ai. Vì khi chúng rơi vào tay Hacker, họ có thể thực hiện đổi mật khẩu và chiếm quyền kiểm soát tài khoản của bạn.
HTTP Host Header Attacks
Trong quá trình phát triển ứng dụng, để trang web có thể dễ dàng tương thích với bất kỳ domain nào. Lập trình viên thường sử dụng giá trị Host trong HTTP Request Header hoặc ($_SERVER[‘Host’] trong PHP) để làm phần domain trong Secret Link.
<a href="https://$_SERVER['HOST']/password/reset?token=$token">Set Your Password</a>
Khi người dùng truy cập https://battle.cookiearena.org trên trình duyệt. Nó sẽ tạo ra một HTTP Request trong đó có chứa Host Header là battle.cookiearena.org như miêu tả hình dưới. Máy chủ Web của Cookie Arena sẽ biết người dùng yêu cầu truy cập tới battle.cookiearena.org và điều hướng tài nguyên (mã nguồn PHP, static file,..) phù hợp để phục vụ.
Nhưng sẽ thế nào nếu như phía server hoàn toàn tin tưởng vào Host header do người dùng cung cấp, hoặc không kiểm tra đầy đủ giá trị của các Host header? Hacker có thể lợi dụng điểm này để thực hiện các cuộc tấn công HTTP Host Header Attacks, hoặc cụ thể hơn trong trường hợp này, mở ra hướng tấn công cho kỹ thuật Password Reset Poisoning.
Trong trường hợp này, hacker có thể thay thế trường Host Header bằng một tên miền độc hại hoặc của Hacker. Khi ứng dụng nhận được yêu cầu reset mật khẩu, nó sẽ sử dụng tên miền độc hại đó để tạo Secret Link đặt lại mật khẩu và gửi cho người dùng qua email cá nhân.
Nếu người dùng nhấp Secret Link. Thay vì gọi đến trang web chính chủ, họ đang tạo một HTTP Request tới tên miền độc hại. Token sẽ vô tình lưu trong Access Logs của hacker.
Do một số Website bây giờ đều đứng sau một Web Application Firewall (WAF) hoặc Reverse Proxy để điều hướng người dùng tới nhiều máy chủ bên trong. Nên chúng ta có thể sử dụng X-Forwarded-Host Header, có nhiệm vụ tương đương với Host Header
Điều kiện tiên quyết để hacker thành công trong trường hợp này:
- Hacker phải biết email nạn nhân
- Nạn nhân phải click vào link của hacker thì mới lộ Secret Token
Writeup Password Reset – Cookie Arena
Hãy cùng áp dụng những lý thuyết khô khan bên trên vào quá trình thực hiện bài lab Password Reset trên Cookie Arena
Đây là giao diện bài lab sau khi khởi động. Trên màn hình ta thấy 3 chức năng: Register – Đăng ký, Login – Đăng nhập và mục tiêu chính của chúng ta: Forgot Password – Quên mật khẩu.
Trong chức năng Forgot Password ta thấy có 1 form yêu cầu nhập email, sau khi người dùng ấn “Submit”, 1 đường link đặt lại mật khẩu sẽ được gửi về email đó.
Dưới đây là HTTP Request được gửi đi sau khi người dùng bấm nút Submit trong màn Forgot Password.
Để mô phòng tên miền độc hại của Hacker, chúng ta sử dụng dịch vụ Request Catcher để có thể quan sát được HTTP Access Logs.
Tiếp đó, ta thêm trường X-Forwarded-Host cùng với giá trị là tên miền vừa tạo và địa chỉ email của admin
Bài lab này sẽ mô phòng việc Admin truy cập email và bấm vào Secret Link để thực hiện Reset Password. Tất nhiên là họ không thể đổi được mật khẩu vì Secret Link lúc này đã được thay bởi tên miền độc hại của Hacker. Chúng ta quan sát Access Logs và lấy được Token của admin.
Quay trở lại với trang web ban đầu, thay thế Token của Admin vào Secret Link và tự đặt lại mật khẩu cho admin. Đăng nhập thành công và lấy được FLAG!
Khủng long đi dép
Bài viết thật hay và ý nghĩa , tôi đã khóc khi đọc bài viết này
Will
bài viết rất dễ hiểu, em có góp ý là a/c có thể thêm phần “các điều kiện tiên quyết để hacker thành công”, ví dụ như bài này là “hacker phải biết email nạn nhân hoặc nạn nhân phải click vào link ,…etc” được không ạ.
Cám ơn team rất nhiều
Harry Ha
Cảm ơn góp ý của Will nhó, chúng mình đã cập nhật thêm <3