Web - Upload File via URL + Remote File Inclusion (RFI/LFI)

Wasssssup anh em! Chào mừng các bạn đến bài viết về File Inclusion. Do là hai thử thách thách này có một vài điểm giống nhau nên mình gộp cả hai bài làm một cho các bạn dễ xem. Hai thử thách này cũng khá là hay, rất tốt để chúng ta có thể thêm một vài kiến thức cở bản về File Inclusion. Cho 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 các 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:

  • Các thử thách cùng PHP Wrapper - file://
  • Các flags có format như sau: flagXXXX.txt
  • Khi đọc file (dùng cat), các bạn chú ý directory của mình là gì nhé. Có cần phải cd đi chỗ nào khác hay không cần làm gì cả :P.
  • Payloads hữu ích nè nhen - PayloadsAllTheThingsHackTricks
  • Burp Suite sẽ rất hữu ích luôn

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

Upload File via URL :file_folder: :open_file_folder:

Challenge này mình nghĩ các bạn sẽ tìm ra flag rất nhanh. Như mình đã gợi ý ở trên, thì các bạn sẽ dùng file:// để tìm ra flag. Vì challenge thứ hai sẽ khá dài nên mình sẽ giải nhanh phẩn này. :fast_forward: :fast_forward:

Đây là page chính của challenge nè

image

Sau một vài lần thử chức năng Upload thì nếu không phải định dạng URL (có chứa ://) thì mình nhận đuợc “Invalid URL.”

image

Khó quá thì mình vào PayloadsAllTheThings hay HackTricks mà tìm nè :rofl:. Mình tìm ra payload này:

  • Payload file:///etc/passwd

Nhập thẳng vào luôn xem coi mình được gì nhe

image

Result:

image

Check Burp Suite cái nà! Ô chồi ôi, đọc đuợc /etc/passwd luôn. Quá đã !!! :100: :100:

Vậy là chúng ta biết được nếu dùng file:// sẽ đọc được nội dung của các files khác. Vậy mình đọc thử flag.txt xem sao. :thinking: :thinking:

image

Ôi giồi! Tìm ra luôn flag nè nhe mấy ông mấy bà :sunglasses: :grimacing: :rofl:

Lesson :closed_book: :green_book: :blue_book: :orange_book:

Cách này mình sẽ gọi là dùng PHP wrappers (file://) để đọc file nhe (Access local filesystem). Thường thì các app hiện nay ít có trường hợp này lắm. Với lại, khi dùng PHP thì các developers cũng tắt (disable) hết mấy cái chức năng như allow_url_includeallow_url_open.

Challege 2 thôi các ông ạ! À, nếu mấy ông có cách này hay hơn thì chỉ tui nhe. Giấu tui giận! :grimacing:

Remote File Inclusion :file_folder: :open_file_folder:

Thử thách này mình cho là khá là hay vì mình phải thử rất nhiều payloads để tìm ra cái thích hợp. Nếu các bạn có payloads nào hay hơn thì comment chỉ mình.

Flag ở thử thách này có dạng flagxxxx.txt nên chúng ta khó mà cat trực tiếp flag.txt. Nên là phải dùng vài lệnh OS Commands để tìm flag. Thôi, không dông dài nữa, vào thôi anh em ạ!

Đây là page chính của challenge nè

image

Nếu truy cập vào các trang khác thì các bạn để ý cái URL. Vì là challenge về File Inclusion thì mình phải để ý mấy các URL có chứa các từ như là page hoặc file.

image

Theo gợi ý thì sẽ có một trang phpinfo(). Tuỳ vào challange mà các trang PHP info sẽ là phpinfo.php hoặc info.php. Để xác định chính xác thì các bạn chỉ cần dùng FUZZ hoặc GOBUSTER để thực hiện directory enum là sẽ tìm ra ngay.

Mình dùng gobuster như sau:

  • gobuster dir -u http://{IP_challenge}/ -w /usr/share/wordlists/SectLists/Discovery/Web-Content/common.txt
  • -w (word list) : thì các bạn dùng wordlist nào cũng đuợc
  • Nếu có lỗi thì các bạn dùng --exclude-length để khắc phục nhe

Tìm ra là info.php :clap: :clap: :clap:

image

Lesson :closed_book: :green_book: :blue_book: :orange_book:

php info có chức rất nhiều thông tin quan trọng về application. Chúng ta sẽ kiểm tra xem những commands nào sẽ dùng được hoặc những tính năng nào sẽ bị khoá. Mình chủ yếu check allow_url_include . Nó ON nhen. KE KE KE!

Một số challenges khác thì bạn nhớ check thằng file_uploads. Nếu nó ON thì mình có thể dùng phpinfo() để tiến hành RCE. Ở challenge này thì chức năng file_uploads bị OFF rồi.

Kế đến mình biết được nếu dùng PHP wrappers như challenge trên, nhập vào thằng ?file= thì cơ hội thành công khá cao. Thử xem nào!

Ây cha, trúng số rồi các ông. Đọc được /etc/passwd luôn nè.

Đến đây, thì chúng ta tìm ra cách đọc file rồi. Nhưng mà chúng ta không biết flag sẽ có format như thế nào và nó ở đâu. :thinking: :thinking: :thinking: :thinking:

:bulb: Và để tìm ra flag, chúng ta sẽ dùng một PHP wrapper khác, đó chính là data://

Với data://, thì chúng ta có thể chạy các lệnh OS để tìm ra flag. Sau một hồi dài mò mẫn thì mình tìm ra payload này.

  • Payload: data://text/plain;base64,PD9waHAgZWNobyBgaWRgOyA/Pg==
  • PD9waHAgZWNobyBgaWRgOyA/Pg== được base64 encoded nhe. Các bạn có thể dùng CyberChef để decode ra, sẽ là <?php echo `id`; ?>

image

Vậy chúng ta đã thành công sử dụng lệnh id rồi. Bây giờ là dùng các lệnh cơ bản như là cdls để tìm ra tên của flag.

  • Payload: data://text/plain;base64,PD9waHAgZWNobyBgY2QgLi47bHMgLWxhYDsgPz4=
  • Nếu dùng CyberChef thì sẽ là <?php echo `cd ..;ls -la`; ?>

Nếu dùng Burp Suite, thì sẽ dễ thấy hơn nhiều nhe các ông

image

Rồi, dùng lệnh file:// rồi đọc flag thôi :triangular_flag_on_post: :triangular_flag_on_post: :triangular_flag_on_post:

  • Payload: file:///flagwl8Il.txt

image

Ú oà, vậy là xong 2 challenges rồi các ông ơi :100: :100: :100: :100:

Lesson :closed_book: :green_book: :blue_book: :orange_book:

PHP wrappers có rất nhiều loại, tuỳ tình huống mà chúng ta sử dụng. Quan trọng là mình cứ thử hết rồi sẽ có kinh nghiệm. Mấy ông tìm hiểu thêm phpinfo để biết nhiều hơn về các tính năng của PHP. Bây giờ tuy là ít sử dụng hoặc nếu có thì cách PHP pages được configred khá là an toàn. GOOD LUCK mấy ông!

Cám ơn mọi người đã xem hết write-up của mình. Có cách hay thì chỉ tuiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!
:clap: :clap: :clap: :clap: