Lab: Information disclosure in version control history

📌 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ắt đầu bài này, bạn nên có kiến thức cơ bản về Lịch sử quản lý phiên bản (Version Control History) và Git.

Version Control History là gì?

Lịch sử quản lý phiên bản (Version Control History) là một công cụ quan trọng giúp lưu trữ các thay đổi của mã nguồn qua thời gian. Điều này giúp chúng ta có thể xem lại, so sánh và khôi phục lại bất kỳ phiên bản nào từ quá khứ.

Nguồn: Abstract
Thế còn Git?

Git là một hệ thống quản lý phiên bản phân tán, cho phép nhiều người làm việc cùng một lúc trên cùng một dự án. Các thay đổi được theo dõi và lưu trong Git.

Tuy nhiên, Git cũng có thể trở thành con dao hai lưỡi nếu không được sử dụng đúng cách. Đôi khi, những thông tin nhạy cảm như mật khẩu, khóa bí mật, hoặc dữ liệu cá nhân có thể bị thêm vào kho lưu trữ Git và trở thành một phần của lịch sử phiên bản. Khi điều này xảy ra, những thông tin nhạy cảm đó có thể bị tiết lộ cho bất kỳ ai có quyền truy cập vào Git.

Bạn có thể sử dụng Git như một ứng dụng local, hoặc các giải pháp quản lý phiên bản nổi tiếng hiện nay, ví dụ như GitHub.

Ngoài GitHub, có rất nhiều những hệ thống quản lý phiên bản (Version Control System – VCS) khác. Nguồn: Stackademic

Đề bài

Ngữ cảnh: Lab này để lộ những thông tin nhạy cảm qua lịch sử quản lý phiên bản (version control history).

Mục tiêu: Lấy được mật khẩu cho tài khoản administrator, đăng nhập, và xoá người dùng carlos.

Phân tích

Nghe “version control history” là nghĩ ngay đến Git, vì nó là thứ rất phổ biến. Câu chuyện là tôi cũng chưa nghĩ ra truy cập vào git của một trang web kiểu gì nên tôi phải Google để tìm.

Hoá ra là nó… giống y hệt những gì sẽ có nếu tôi làm web trên máy mình. Bạn hãy nghĩ về tên folder mặc định của Git – nó sẽ là gì nào?

Tìm được rồi thì câu chuyện còn lại là:

  1. Khảo sát, lượn quanh cái folder git xem nó có gì hay ho.
  2. Tìm cách lấy được thông tin ta cần (mật khẩu của quản trị viên) từ đây.

Lời giải

Phần 1: Đào bới Git

  1. Thư mục mặc định của Git cho website là ./git. Ta truy cập vào là xem được luôn:

2. Bạn cứ lượn xem thoải mái. Nhưng gợi ý đầu tiên đến từ COMMIT_EDITMSG:

    COMMIT_EDITMSG là nơi lưu commit message của commit hiện tại. Ở đây, tên dev ất ơ viết “Gỡ bỏ mật khẩu của admin từ config”, nên ta đoán là commit liền trước commit này sẽ có một file config gì đó, và trong file này có mật khẩu của admin.

    3. Vào HEAD để xem lịch sử commit thì hoá ra chỉ có 2 cái:

      Lịch sử commit sẽ được lưu trong thư mục logs. Trong logs sẽ có refs, chứa các con trỏ tới nhiều nơi trong git. Ở đây, tôi quan tâm đến heads/master, vì nó là con trỏ đến “đầu” của repo.

      4. Vậy là đã có thông tin về cái git này. Tự nhủ rằng mình cần phải làm sao đó để revert cả cái repo git này về commit trước đó. Nhưng làm sao? Một vòng Google cho tôi vài kiến thức:

        • Nếu trên web có CLI (command line interface) trực tiếp, nơi bạn có thể gõ dòng lệnh git thì bạn hãy sử dụng trực tiếp.
        • Nếu không có – và đây là trường hợp của lab này – ta sẽ cần phải tải nó về máy.

        Phần 2: Tải .git

        1. Làm sao để tải được .git? Tôi vật vã mãi không tìm ra lời giải, đành phải vứt hết liêm sỉ để ngó cái đáp án lab. Nó bảo dùng wget.
        Giới thiệu về Wget

        Wget là một công cụ miễn phí giúp người dùng tải về nội dung từ internet. Nó hỗ trợ tải về thông qua các giao thức HTTP, HTTPS và FTP, và có thể tải về các trang web hoàn chỉnh, giúp bạn xem offline.

        Dùng Wget, bạn có thể tải về toàn bộ thư mục .git từ máy chủ từ xa. Đây là một cách hiệu quả để kiểm tra lịch sử commit và tìm ra những thông tin quan trọng mà người khác có thể đã chủ ý xóa đi.

        Câu chuyện ở đây là wget có thể tải trong một nốt nhạc trên các máy Linux/ UNIX (Mac). Còn nếu bạn dùng Windows thì phải nghiên cứu thêm một chút – tìm “wget cho Windows”, hoặc sử dụng môi trường Linux trên máy Windows

        2. Tải wget về. Tôi dùng Mac nên xài Homebrew để lấy em nó chỉ với một câu lệnh:

          brew install wget

          3. Dùng wget, tải thư mục .git về. Câu lệnh sẽ như thế này:

            wget -r <git_link>
            Xin lỗi vì đống tiếng Nhật. Tôi cũng không ngờ nó xuất hiện cả trong terminal…

            Có vẻ cái folder .git này cũng nhiều thứ dã man. wget chạy mãi.

            4. Mở ra để xem xem thư mục nó có gì.

            5. Có vẻ ổn rồi. Bây giờ tìm cách quay ngược trở về commit cũ. Có nhiều cách để làm điều này, nhưng tôi chọn cách an toàn là sử dụng chế độ “detached HEAD”: Thay đổi HEAD để nó trỏ tới commit cũ, trong khi không làm mất dấu commit trước đó.

              Tôi dùng:

              git checkout <commit_hash>

              Trong đó commit_hash là hash tương ứng với commit mà tôi muốn đến, trong trường hợp này là commit đầu tiên.

              6. Tìm thấy file admin.conf. Mở ra để xem mật khẩu:

                7. Phần còn lại thì quá dễ rồi.