Lab: Password reset broken logic

📌 Bài viết này thuộc chuỗi write-up quá trình tiếp cận và đáp án cho các bài lab từ Portswigger Web Academy mà mình đã làm trong thời gian thực tập tại NCSC.

Mình không thích lắm cái cách mấy idol viết write-up lab theo kiểu cứ như thể họ đã biết đáp án từ đầu – họ chẳng bao giờ đủ kiên nhẫn để giải thích cặn kẽ tại sao họ lại làm một cái gì đó. Vậy nên, write-up phong cách bạn Tiểu ra đời. Mình mong là bạn có được những câu trả lời thoả đáng qua loạt bài này. Những ý kiến góp ý, thảo luận, báo lỗi – luôn luôn được hoan nghênh dưới mục comment.

Link bài lab

Đề bài

Ngữ cảnh: Tính năng reset mật khẩu có lỗi logic ngớ ngẩn.

Mục tiêu: Đặt lại mật khẩu cho tài khoản của Carlos và đăng nhập vào trang người dùng của anh ta.

Thông tin sẵn có:

  • Tài khoản: wiener:peter
  • Username nạn nhân: carlos

Phân tích

Bài này một lần nữa là bài “gà con lon ton”, nên về cơ bản là bạn cứ dự trù là sẽ không phải làm gì quá phức tạp. Với những bài này, cách tiếp cận tôi hay làm là dạo một vòng quanh cái web xem nó làm được những gì, có gì mới mẻ/ bất thường không, và xem xét vài request gửi đi gửi lại của quá trình đó trong Burp Suite.

Chìa khoá của bài này nằm ở chỗ hệ thống không xét đến trường hợp các trường trong request đổi mật khẩu có thể bị sửa đổi bởi người dùng.

  1. Mở lab ra, vào xem form login có gì mới. À, hoá ra có tính năng quên mật khẩu như đề bài.

    2. Bấm vào “Quên mật khẩu” thì nó hỏi username hoặc email. Đề bài cho cái gì thì tôi thử cái đấy.

    • Thử username wiener hoặc email của wiener thì nó trả về email trong cái Email Server mà lab cung cấp.
    • Thử username carlos thì thấy… mình ngớ ngẩn, vì có biết email của ông Carlos ấy đâu, làm thế chẳng để làm gì cả. May mà người ta không đánh thuế những lần thử như thế này.

    3. Vào email của wiener (aka. tài khoản của mình) để check. Có email báo reset mật khẩu.

      4. Bạn có thể chọc ngoáy thêm ở đây một xíu tuỳ thích. Tôi thì tôi phát hiện ra 2 điều:

        • Thứ nhất, link này là dạng “đũa dùng 1 lần”, tức là nếu cái email mới được gửi đến thì cái cũ vô hiệu, không dùng được nữa. Chí ít là cái reset password này nó cũng biết đường đánh thời hạn cho link.
        • Thứ hai, request được khởi tạo khi bạn bấm vào link để thực hiện đổi mật khẩu có vài trường thông tin khá hay ho:

        Lời giải

        Đọc đến đây rồi thì tôi mong là bạn cũng đã nghĩ ra đáp án cho lab này:

        1. Thay đổi trường username trong request được tạo ra tương ứng với khi mình bấm vào cái link reset mật khẩu thành “carlos”.
        2. Thực hiện đổi mật khẩu. Lúc này cái form đổi mật khẩu nó sẽ ghi nhận là bạn đang đổi mật khẩu cho carlos. Có thể vào lại Proxy > HTTP Request để xác nhận.
        3. Đăng nhập vào tài khoản của carlos với mật khẩu mà chúng ta vừa đổi.