🗂️PortSwigger Lab Writeup: Web Shell Upload via Content-Type Restriction Bypass

🎯 Objective
The objective of this lab is to exploit a file upload vulnerability where the app has a vulnerable image upload function which relies on Content-type header for validation before storing them. The goal is to upload a basic web shell and exfiltrate the contents of file /home/carlos/secret
- Lab URL:
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-content-type-restriction-bypass - Category: File Upload
- Difficulty: Apprentice
🧪 Exploitation Steps
🕵️Step 1: Observe the Website
- Firstly open the lab URL in your browser, and observe what it is about and how it works.


- At first glance, the website seems to be a blogging website with a login page. In the lab description, it is mentioned that we need to exfiltrate the secret of
carlos.
📝Step 2: Upload the payload
- First login with the given credentials -
wiener:peterto access file upload function.
- Now, we can see the file upload function where we can upload an avatar of the user.

- Make basic php web shell named
payload.phpwith the given code:<?php echo file_get_contents('/home/carlos/secret'); ?> - Now, Upload this payload.

- However, our upload request is rejected by server for wrong file type.
- Now, Open the HTTP History in Burpsuite and send the
POST /my-account/avatarrequest to Repeater tab.
- Change the value of
Content-typeheader fromapplication/x-phptoimage/pngand sent the request.
- Hence, our web shell is successfully uploaded to the server.
🧑💼Step 3: Access the Secret
- Open the uploaded web shell at
/files/avatars/payload.php
- Hence, our web shell executed successfully and returned the secret of carlos.
- Now, Copy and submit it to complete the lab.

- And Finally, the Lab is solved.
🧠 Conclusion
- This lab demonstrated how Content-Type validation alone is insufficient for file upload security. By modifying the MIME type header from
application/x-phptoimage/png, we bypassed the validation and executed arbitrary code. - The impact is critical — attackers can bypass client-side and weak server-side file type checks by manipulating HTTP headers.
- Fix: validate file contents (magic bytes/file signatures) server-side, use allowlists for allowed file types, store uploads outside web root, and disable script execution in upload directories.