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.
Ç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
.
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: