📌 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.
Đề bài
Ngữ cảnh: Lab này không kiểm tra kỹ càng thông tin mà người dùng nhập vào. Bạn có thể khai thác một lỗi logic trong quy trình mua hàng để mua những món đồ với một giá khác.
Mục tiêu: Mua một cái áo “Lightweight l33t leather jacket”
Thông tin sẵn có: Tài khoản quen thuộc wiener:peter
Phân tích
Những nhà phát triển hay mắc phải cái lỗi kinh điển: Tin người dùng. Tin rằng họ sẽ đi theo đúng user flow mà đội đã thiết kế. Tin rằng họ chẳng làm gì khác ngoài tương tác trên chính trang web của mình. Tin rằng họ sẽ nhập những giá trị hợp lý. Và rất nhiều cái tin khác…
Tôi nghĩ rằng niềm tin ấy nên được dẹp chỗ cho những quy trình kiểm tra input nghiêm ngặt hơn.
Vì sửa đổi mấy input này dễ lắm các bạn ạ. Không làm được trên trang web không có nghĩa là sẽ hoàn toàn không thể làm được.
Bài này bạn cần dùng Burp Suite hoặc một công cụ tương tự, intercept lấy cái request rồi sau đó mày mò sửa đổi vài giá trị là xong.
Trong tài khoản lab cho, tôi chỉ có 100 đô mà cái áo dở hơi kia hơn 1300 đô. Rõ ràng là cần thay đổi một hoặc nhiều giá trị để khiến cho tổng tiền cuối cùng là một con số nhỏ hơn số tiền mà tôi có.
- Như thường lệ, tôi lại xem xét xem request có những gì và có gì giá trị hay không:

Không giống như bài lab “Excessive trust in client side control”, lần này không có trường về giá cả (price
). Thử thì đúng là không được:

2. Đi một vòng, khám phá vài chỗ khác. Có vẻ cũng không có gì đặc biệt lắm ở phần đặt hàng, mã giảm giá…

3. Thử xoá món đồ ra khỏi giỏ hàng, ta thấy request như sau:

Đến đây là rất gần với lời giải rồi. Bạn hãy cố gắng tự làm nốt đi nhé.
Lời giải
Như đã nói ở trên, chúng ta thấy ứng dụng chấp nhận số lượng là -1
khi ta xoá khỏi giỏ hàng. Vậy nếu ta sửa đổi yêu cầu thêm vào giỏ hàng với trường quantity
thay đổi đi một xíu thì sao?
- Thử
quantity
là một giá trị thập phân. Không được.

2. Nhưng một giá trị nguyên âm thì được chấp nhận:

3. Ứng dụng không cho phép tổng tiền nhỏ hơn 0. Vậy nên ta cần phải suy tính đến chuyện mua những món đồ khác với số lượng âm (!) để tổng tiền nhỏ hơn 100 đô ta có:

Lưu ý: Để lab này được ghi nhận, bạn phải mua cái áo dở hơi với số lượng là 1 – chứ không phải số lượng âm nhé. Tôi mắc cái lỗi ngớ ngẩn ấy, cứ nghĩ đã checkout được rồi là đã giải được bài.

Một nhắc nhở nữa là bạn hãy cẩn thận trong từng bước thử của mình, vì ở thời điểm của tôi, mấy cái lab Portswigger này lưu lại “tàn tích” sau những lần thử nghiệm của bạn. Tức là lỡ bạn phạm sai lầm, trong 100 đô bạn bị trừ gần hết chả còn xu nào, mà vẫn chưa giải được bài thì sẽ hơi khoai… Tắt đi mở lại lab với ID mới nhưng số tiền tôi có vẫn không hề được đưa về 100 đô…
Như sau lần “mua ngu” trên đây là tôi còn có vài đồng, hoảng hốt đi sửa params lẹ để giải bài.
4. Mua tạm thêm cái gì đó với số lượng âm. Shopping thế này có vẻ kinh tế quá nhỉ.
