web-dev-qa-db-fra.com

Pourquoi le fichier "Shell.php.jpg" peut-il s'exécuter en tant que fichier php mais pas "Shell.jpg"?

J'apprends les vulnérabilités de téléchargement de fichiers en utilisant DVWA .

Après avoir fait passer le niveau de sécurité du site Web à Élevé, le site Web vérifie à la fois le type de contenu et l'extension de fichier de la demande de publication, donc afin de le contourner, j'ai changé l'extension de fichier en .jpg et utilisé Burp Proxy pour changer le nom du fichier en Shell.php.jpg de Shell.jpg afin d'exécuter le Shell.

changing filename with burp

Ça marche. Ce que je ne comprends pas, c'est pourquoi cela fonctionne. J'ai lu que seul le modèle d'extension de fichier le plus à droite est traité comme l'extension de fichier, donc cela doit signifier Shell.php.jpg doit être traité comme un .jpg fichier, et il est traité comme tel - le téléchargement réussit.

Mais pourquoi puis-je exécuter ce fichier et non un Shell.jpg fichier si l'extension du fichier est restée la même et que le .php partie est juste une partie du nom de fichier?

root @ kali:~# weevely http://10.0.2.4/dvwa/hackable/uploads/Shell2.php.jpg yuval 
 
 [+] weevely 3.7.0 
 
 
 [ +] Cible: [email protected]:/var/www/dvwa/hackable/uploads 
 [+] Session: /root/.weevely/sessions/10.0.2.4/Shell2.php_0.session 
 [+] Shell: Shell système 
 
 [+] Parcourir le système de fichiers ou exécuter des commandes démarre la connexion 
 [+] À la cible. Tapez: aide pour plus d'informations. 
 
 Weevely> id 
 [-] [canal] L'exécution du script à distance déclenche une erreur 500, vérifiez l'intégrité du script et de la charge utile 
 uid = 33 (www-data) gid = 33 (www-data) groups = 33 (www-data) 
 [email protected]:/var/www/dvwa/hackable/uploads $ 

Exemple de fichier fonctionnant comme prévu nommé Shell.php.jpg.

root @ kali:~# weevely http://10.0.2.4/dvwa/hackable/uploads/Shell.jpg yuval 
 
 [+] weevely 3.7.0 
 
 [+] Cible: 10.0.2.4 
 [+] Session: /root/.weevely/sessions/10.0.2.4/Shell_1.session[.____. E5E[.____.regular[+] Parcourir le système de fichiers ou exécuter les commandes démarre la connexion 
 [+] à la cible. Tapez: aide pour plus d'informations. 
 
 Weevely> id 
 [!] [Terminal] La communication par porte dérobée a échoué, vérifiez la disponibilité de l'URL et le mot de passe 

Exemple du même fichier ne fonctionnant pas comme prévu, nommé Shell.jpg.

2
Yuval

Shell.php.jpg doit être traité comme un fichier .jpg

Vous explorez DVWA, donc tous ne devraient pas être signifie est . Si je devais deviner, le script de téléchargement vérifie correctement l'extension du fichier et l'autorise, mais le serveur Web ne la vérifie pas de la même manière et autorise l'exécution.

Vous pouvez en savoir plus en explorant les fichiers de configuration du serveur Web (nginx ou Apache), recherchez un bloc qui effectue un transfert vers l'analyseur php pour le traitement des demandes.

Clarification:

Mais pourquoi puis-je exécuter ce fichier et non un Shell.jpg fichier si l'extension du fichier est restée la même et que le .php partie est juste une partie du nom de fichier?

L'extension est juste des lettres dans un nom de fichier, elles ne déterminent pas comment le fichier est géré par le serveur Web, le serveur Web le détermine. L'un des algorithmes courants est:

If the requested file name ends with “php”
    Invoke php to handle the request
Else
    Serve the requested file like any other static file
End

Je suppose que dans votre cas requested file name ends with “php” est remplacé par requested file name contains “.php”. Vous pouvez trouver cette règle dans le fichier de configuration du serveur Web qui traite vos demandes et le découvrir par vous-même.

Mise à jour:

Il s'agit du comportement attendu et documenté d'Apache. Je suis un peu surpris, mais c'est le monde dans lequel nous vivons. Bon sang.

Dans le fichier de configuration /etc/Apache2/mods-enabled/php.conf ligne AddHandler php5-cgi .php enregistre le gestionnaire pour .php des dossiers. Tout va bien, sauf si vous lisez ce que fait AddHandler .

L'argument d'extension est insensible à la casse et peut être spécifié avec ou sans point principal. Les noms de fichiers peuvent avoir plusieurs extensions et l'argument d'extension sera comparé à chacune d'entre elles.

Sooo ... Ouais. Bien sûr, les noms de fichiers peuvent avoir plusieurs extensions. C'est le seul défaut logique.

Si vous êtes un bizarre qui s'attend à ce que le fichier ait une seule extension, Apache a la réponse pour vous :

Si vous préférez que seule la dernière partie séparée par des points du nom de fichier soit mappée à un morceau particulier de métadonnées, n'utilisez pas les directives Add *.

Ils suggèrent utilement la solution à votre souhait étrange d'une extension - utilisez simplement regex. Donc, pour exécuter uniquement les fichiers .php en php, vous devez remplacer la directive AddHandler dans php.conf par

<FilesMatch "[^.]+\.php$">
  SetHandler php5-cgi
</FilesMatch>

En conclusion:

  • le bon sens n'existe pas dans les logiciels
  • ne faites jamais confiance aux données fournies par l'utilisateur
  • stocker les noms de fichiers d'origine dans la base de données si nécessaire et les renommer après le téléchargement
  • traiter les noms de fichiers comme une bombe vivante
7
Andrew Morozko