This serves as a checklist of things to think about, some may need more research and be technology dependant, but its a good starting point

1. Entry Points

  • Identify all upload features (GUI, API, PUT, URL-based uploads)
  • Test authenticated and unauthenticated uploads
  • Send OPTIONS to detect PUT / PATCH support

2. File Type Validation

  • Upload executable files (.php, .jsp, .asp, .aspx, .py)
  • Try alternate extensions (e.g. .php5)
  • Modify Content-Type header
  • Verify server checks content, not just extension or Content-Type

3. Extension Obfuscation

  • Double extensions (shell.php.jpg)
  • Case variations (shell.pHp)
  • Trailing characters (shell.php.)
  • URL encoding / double encoding (shell%2e.php)
  • Null bytes / semicolons (shell.php%00.jpg, shell.php;.jpg)
  • Recursive stripping bypass (shell.p.phphp)

4. File Content Checks

  • Non-image content labelled as image
  • Polyglot files (image + script in metadata)

5. Filename Handling

  • Directory traversal (../, %2e%2e%2f)
  • Overwrite existing files
  • Absolute / relative path injection
  • Confirm filenames are randomised

6. Storage & Execution

  • Identify upload directory
  • Attempt upload to unexpected directories
  • Upload .htaccess / web.con

7. Size & DoS

  • Upload oversized files
  • Flood storage with multiple uploads

8. Race Conditions

  • Try to get server to access file before validation completes
  • Test temporary file locations
  • URL-based upload timing attacks
  • Brute-force predictable temp names

10. Client-Side Attacks

  • Upload HTML / SVG with JavaScript
  • Stored XSS via uploads
  • Same-origin policy validation

11. File Parsing Attacks

  • XML / Office files for XXE
  • Parser crashes or external requests

12. PUT Uploads

  • Upload files via PUT
  • Test execution and access controls