Aller au contenu

Unrestricted file upload

Téléversement de fichiers sans restriction

Description

Le téléversement de fichiers sans restriction (Unrestricted File Upload) constitue un risque majeur pour les applications, pouvant conduire à une compromission totale du système, une surcharge du système de fichiers, des attaques côté client ou une altération (defacement). Cette vulnérabilité peut être causée par une validation non sécurisée des métadonnées du fichier, telles que les champs HTTP Multi-part, ou par une validation inadéquate du contenu et de la taille, comme le téléversement de formats de fichiers non autorisés.

Recommandation

Pour atténuer les risques associés au téléversement de fichiers sans restriction, tenez compte des éléments suivants :

  • Validate File Type: Implémentez une validation côté serveur pour vous assurer que seuls les types de fichiers autorisés peuvent être téléversés. Utilisez une liste blanche (whitelist) d'extensions autorisées et rejetez tout fichier dont l'extension n'est pas permise. Évitez de vous fier uniquement à la validation côté client, car celle-ci peut être facilement contournée.
  • Check File Content: Vérifiez le contenu des fichiers téléversés pour vous assurer qu'il correspond bien au type de fichier annoncé. Par exemple, pour les téléversements d'images, utilisez des bibliothèques ou des outils pour inspecter les en-têtes de fichiers (headers) afin de confirmer qu'il s'agit bien d'images.
  • Rename Uploaded Files: Renommez les fichiers téléversés pour empêcher les attaquants de les exécuter en devinant leur nom. Utilisez une combinaison de chaînes aléatoires et d'identifiants uniques générés par le serveur pour créer de nouveaux noms pour les fichiers téléversés.
  • Store Uploaded Files in a Secure Location: Stockez les fichiers téléversés en dehors du répertoire racine web afin d'empêcher tout accès direct via des URL. Vous pouvez utiliser des compartiments S3 (S3 buckets) par exemple.
  • Scan Uploaded Files for Malware: Utilisez des scanners antivirus ou anti-malware pour analyser le contenu des fichiers téléversés à la recherche de code malveillant. Mettez en place des analyses régulières pour garantir qu'aucun fichier malveillant ne se trouve sur le serveur.
  • Monitor File Upload Activities: Implémentez des mécanismes de journalisation et de surveillance pour suivre les activités de téléversement de fichiers. Surveillez tout modèle de téléversement suspect ou inhabituel et prenez des mesures immédiates en cas de détection.
const express = require('express');
const multer = require('multer');
const path = require('path');
const { v4: uuidv4 } = require('uuid');

const app = express();

// Define storage for uploaded files
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/');
  },
  filename: function (req, file, cb) {
    const ext = path.extname(file.originalname);
    cb(null, uuidv4() + ext);
  }
});

// File filter to allow only specified file extensions
const fileFilter = (req, file, cb) => {
  const allowedExtensions = ['.jpg', '.jpeg', '.png'];
  const ext = path.extname(file.originalname).toLowerCase();
  if (allowedExtensions.includes(ext)) {
    cb(null, true);
  } else {
    cb(new Error('File type not allowed!'), false);
  }
};

// Initialize multer with storage and file filter
const upload = multer({ storage: storage, fileFilter: fileFilter });

// POST endpoint for file upload
app.post('/upload', upload.single('file'), (req, res) => {
  res.send('File uploaded successfully!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
import os
from uuid import uuid4

@require_POST
def upload_file(request):
    if request.method == 'POST' and request.FILES['file']:
        file = request.FILES['file']
        allowed_extensions = ['.jpg', '.jpeg', '.png']
        ext = os.path.splitext(file.name)[1]
        if ext.lower() not in allowed_extensions:
            return HttpResponseBadRequest('File type not allowed!')
        fs = FileSystemStorage()
        filename = fs.save(str(uuid4()) + ext, file)
        return HttpResponse('File uploaded successfully!')
    else:
        return HttpResponseBadRequest('No file found!')
<?php
$uploadDir = 'uploads/';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    $allowedExtensions = array('.jpg', '.jpeg', '.png');
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!in_array($ext, $allowedExtensions)) {
        http_response_code(400);
        echo 'File type not allowed!';
        exit;
    }

    $uploadFile = $uploadDir . uniqid() . '.' . $ext;
    if (move_uploaded_file($file['tmp_name'], $uploadFile)) {
        echo 'File uploaded successfully!';
    } else {
        http_response_code(500);
        echo 'Error uploading file.';
    }
} else {
    http_response_code(400);
    echo 'No file found!';
}
?>

Liens

Normes

  • CWE_TOP_25:
    • CWE_434
  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_6_3
    • REQ_6_4
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_6_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY221
    • SECURITY212
    • SECURITY213