Web - Filter Madness

Xin chào mọi người …
Không vòng vo nữa vào thẳng vấn đề luôn :))

Dưới đây là source code:

Nhìn qua thì có thể hiểu nó lấy input của mình ( $madness ) để truyền vào trong $file và kết quả của file_get_contents($file) = $result. Cái khó của bài này là làm thế nào để $result === ‘zombies for the flag’ mà resource=/etc/passwd .

Sau một hồi tra gg thì mình tìm được bài writeups khá hay: WolvCTF-2023-Challenges-Public/web/filter-madness/solver-for-filter-madness.py at main · WolvSec/WolvCTF-2023-Challenges-Public · GitHub

Về cơ bản thì người này sử dụng dechunk để lược bỏ đi “/etc/passwd” đồng thời tạo được dữ liệu trả về đúng với yêu cầu đề bài.

Trước hết, dechunk là gì ? dechunk là một method từ php://filter wrapper, nó không được nói cụ thể trong php document nhưng mục đích là để xử lí chunked transfer encoding. Mỗi chunk được chia thành 2 phần: chunk lengthchunk data.

dechunk thường được kết hợp với một vài kĩ thuật khác để đọc file with error-based oracle nhưng trong bài này mình sẽ không đi sâu vào.

Ví dụ sử dụng dechunk:

  • Giá trị 8 ở đây là độ dài (hex) tương ứng với dữ liệu e15-hust
  • Giá trị 0 để chỉ kết thúc của data

Một điều thú vị là khi chúng ta thêm data sau chunk cuối cùng

Chuỗi ‘cookie’ mà ta thêm vào không được ghi ra do khi gặp chunk có độ dài là 0 thì dechunk sẽ dừng lại (nó hiểu đó là chunk cuối cùng và mặc định nghĩ rằng không còn dữ liệu nữa). Tức là ta có thể lược bỏ đi phần đằng sau đồng thời cũng có thể trả về đúng dữ liệu mà ta cần. Nice, một công đôi việc :))

Giờ thì chỉ việc viết payload khéo lại là được: