File Upload Vulnerabilities Writeup
PortSwigger
Last updated
PortSwigger
Last updated
Pham Quoc Trung
BurpSuite
This lab contains a vulnerable image upload function. It doesn't perform any validation on the files users upload before storing them on the server's filesystem.
To solve the lab, upload a basic PHP web shell and use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Sau khi đăng nhập với thông tin bài cho, mình thấy có một form upload avatar cho người dùng
Mình thử up một số loại file khác nhau lên thì thấy đều được. Có vẻ không có filter gì cho file truyền vào. Mình sẽ thử up một file php với nội dung như sau để đọc được file /home/carlos/secret
Khi upload thành công, quay lại trang account, mình thấy có một request trong BurpSuite để get avatar.
Đoạn mã kia có vẻ là nội dung của file /home/carlos/secret
. Thử submit và mình hoàn thành bài lab
Nếu không bắt được request trên thì vào Proxy -> HTTP History. Ấn vào thanh filter để vào Filter settings. Ở dưới Filter by MIME type, check vào image
This lab contains a vulnerable image upload function. It attempts to prevent users from uploading unexpected file types, but relies on checking user-controllable input to verify this.
To solve the lab, upload a basic PHP web shell and use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Ở bài này, yêu cầu vẫn gióng bài trước nhưng khi mình up file php lên thì sẽ gặp lỗi như này
Mình sẽ thử đổi nó thành image/jpeg
. Nếu cơ chế bảo mật của chương trình này không tốt thì mình có thể dễ dàng bypass
Và như thấy trên ảnh, mình đã thành công tải file php lên. Nhìn vào trong các request của BurpSuite, mình thấy request GET avatar và đây là nội dung của nó
Kia chính là nội dung file /home/carlos/secret
, giờ chỉ cần submit để hoàn thành bài lab
Danh sách các loại
Content-Type
phổ biến được sử dụng trong HTTP để chỉ định loại nội dung của tài nguyên được truyền qua mạng. Dưới đây là một sốContent-Type
phổ biến:
Text
text/plain
- Văn bản không định dạng.
text/html
- Tài liệu HTML.
text/css
- Cascading Style Sheets.
text/javascript
- Mã JavaScript.
Image
image/gif
- Định dạng ảnh GIF.
image/jpeg
- Định dạng ảnh JPEG.
image/png
- Định dạng ảnh PNG.
image/svg+xml
- Định dạng ảnh SVG.
image/webp
- Định dạng ảnh WebP.
Audio/Video
audio/mpeg
- Âm thanh MP3.
audio/ogg
- Âm thanh Ogg.
video/mp4
- Video MP4.
video/ogg
- Video Ogg.
video/webm
- Video WebM.
Application
application/octet-stream
- Bất kỳ loại dữ liệu nào, thường được sử dụng cho các tệp nhị phân.
application/json
- Định dạng JSON.
application/xml
- Định dạng XML.
application/zip
- Tệp nén ZIP.
application/pdf
- Tài liệu PDF.
application/sql
- Mã SQL.
application/graphql
- Truy vấn GraphQL.
application/ld+json
- JSON-LD (Linked Data).
application/msword
(đối với tệp .doc) vàapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
(đối với tệp .docx) - Tài liệu Microsoft Word.
application/vnd.ms-excel
(đối với tệp .xls) vàapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
(đối với tệp .xlsx) - Bảng tính Microsoft Excel.
application/vnd.ms-powerpoint
(đối với tệp .ppt) vàapplication/vnd.openxmlformats-officedocument.presentationml.presentation
(đối với tệp .pptx) - Bản trình bày Microsoft PowerPoint.
Multipart
multipart/form-data
- Sử dụng cho các biểu mẫu HTML gửi tệp.
Message
message/http
- Thông điệp HTTP (trong các tình huống như bắt và truyền tiếp HTTP).Đây không phải là danh sách đầy đủ; có nhiều loại
Content-Type
khác được sử dụng cho các mục đích cụ thể. Đối với các loại nội dung cụ thể hoặc các ứng dụng cụ thể, có thể có các loạiContent-Type
được định nghĩa riêng.
This lab contains a vulnerable image upload function. The server is configured to prevent execution of user-supplied files, but this restriction can be bypassed by exploiting a secondary vulnerability.
To solve the lab, upload a basic PHP web shell and use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Với bài này thì mình có thể upload file vô tư, tuy nhiên khi mở file thì nó chỉ hiện ra nội dung plaintext của file chứ không thực thi file này
Khả năng là các file nằm trong thư mục /files/avatars/
sẽ không có quyền thực thi. Vậy chỉ cần tìm cách lưu file này ở một nơi nào khác ngoài thư mục này thì khả năng sẽ thực thi được. Mình thử nhìn vào request lúc up file
Ở đây mình thấy trường filename
sẽ quy định vị trí file được lưu. Mặc định nếu như trong hình thì nó sẽ được lưu vào /files/avatars/
. Vậy nếu sử dụng path traversal thì sao nhỉ? Mình sẽ thử thay thành ../../lab01.php
xem sao.
Xem chừng cách này đã bị strip mất. Mình thử dùng một số cách bypass thì có cách này là thực hiện được
Giờ mình sẽ thử truy cập vào file trên xem sao
Như thấy trên hình, file này giờ đây đã được thực thi và mình đã có được nội dung của file /home/carlos/secret
. Submit và mình hoàn thành bài lab
This lab contains a vulnerable image upload function. Certain file extensions are blacklisted, but this defense can be bypassed due to a fundamental flaw in the configuration of this blacklist.
To solve the lab, upload a basic PHP web shell, then use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Ở bài này thì khi up file lên mình thấy rằng file php đã bị chặn. Các cách từ lab trước cũng không còn khả dụng
Để ý thì server sử dụng Apache2. Mình sẽ thử up một file .htaccess
vào thư mục này với nội dung như sau
Nếu mình up được file này lên, các file có đuôi .xlr8
sẽ được chạy bằng php. Thử áp dụng:
Có vẻ file .htaccess
đã được up lên. Giờ mình sẽ thử đổi tên file lab01.php
thành lab01.xlr8
và up lên
Khi truy cập vào file này, mình thấy đoạn mã PHP đã được thực thi thành công
Submit và hoàn thành bài lab
This lab contains a vulnerable image upload function. Certain file extensions are blacklisted, but this defense can be bypassed using a classic obfuscation technique.
To solve the lab, upload a basic PHP web shell, then use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Ở lab này, ta chỉ được quyền up file PNG hoặc JPG. Tuy nhiên cách từ lab đầu tiên sẽ không hoạt động
Ở đây mình sẽ thử thêm .jpg
vào sau file php của mình
Upload thành công, tuy nhiên file này sẽ không thực thi mã php
Mình sẽ thử bằng cách thêm null bytes. Nếu function chạy phía server sử dụng ngôn ngữ bậc thấp, có thể cách này sẽ khả thi
Và đúng là mình đã up được file php lên. Truy cập vào file này, mình thấy được nội dung file /home/carlos/secret
.
Submit và hoàn thành bài lab
This lab contains a vulnerable image upload function. Although it checks the contents of the file to verify that it is a genuine image, it is still possible to upload and execute server-side code.
To solve the lab, upload a basic PHP web shell, then use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Bài này lại bắt chúng ta phải up lên file ảnh, và đương nhiên các cách trước không khả thi nữa vì server sẽ check hẳn nội dung của file
Để bypass, mình sẽ sử dụng Exiftool để chèn mã php vào file ảnh sử dụng lệnh sau (Windows)
Mình sẽ thử up file này lên
Có thể thấy file php đã được up lên thành công. Thử truy cập vào nó
Dựa trên header file ảnh, mình có thể thấy được nội dung file /home/carlos/secret
là hHEuNZwSKEUCDiKhJckTM8z8wrEv67LQ
. Submit và mình đã hoàn thành bài lab này
This lab contains a vulnerable image upload function. Although it performs robust validation on any files that are uploaded, it is possible to bypass this validation entirely by exploiting a race condition in the way it processes them.
To solve the lab, upload a basic PHP web shell, then use it to exfiltrate the contents of the file /home/carlos/secret
. Submit this secret using the button provided in the lab banner.
You can log in to your own account using the following credentials: wiener:peter
Với bài này, cách của bài trước lại bị filter mất
Lần này mình được đề bài cấp cho đoạn code của chức năng upload
Có thể thấy, file sau khi được up lên sẽ được lưu tạm để check virus. File này sẽ bị xóa đi khi check virus và check fie type ra lỗi. Nếu vậy, ta hoàn toàn có thể chạy file này trong lúc nó đang được check. Ở đây mình sẽ sử dụng Turbo Intruder
Tiến hành tấn công và mình đã thấy được nội dung file /home/carlos/secret
.
Submit và hoàn thành bài lab
© 2024,Pham Quoc Trung. All rights reserved.
Có thể thấy rằng chương trình chỉ chấp nhận cho up file loại image/jpeg
hoặc image/png
. Thử nhìn vào request khi up file, mình thấy của mình đang là application/octet-stream
.