web-dev-qa-db-fra.com

Que signifie le tilde (~) à la fin d'une extension de fichier?

Pendant que je jouais Capture the Flag (CTF), je n'ai pas pu résoudre un défi à cause de ce tilde ~. Je joue sur www.example.com/index.php mais quand j'ai ajouté (~) à la fin: www.example.com/index.php~, un fichier nommé index.php a commencé à se télécharger.

Pourriez-vous m'expliquer quel est le rôle de ce tilde (~)?

39
ReDa

Cela fait simplement partie du nom de fichier, tout comme les lettres, les chiffres et autres caractères spéciaux peuvent faire partie du nom de fichier.

Il est classique de créer des "sauvegardes" de fichiers avant de les éditer en ajoutant un tilde, donc au cas où vous gâcher quelque chose, vous avez une version précédente à restaurer. Dans Bash, cela peut être facilement fait avec cp index.php{,~} qui se développe en cp index.php index.php~.

Cela pourrait être sur le FCT parce que les gens oublient souvent ces fichiers et les laissent sans protection. En particulier, un fichier comme index.php peut contenir des informations d'identification de base de données.

En bash, un tilde au début d'un argument se développe également dans un dossier personnel: ~ se transforme en $HOME (par exemple. /home/yourusername), ou ~username se transforme en dossier de départ de cet utilisateur (par exemple ~root se développe généralement en /root). Ce n'est pas le cas ici, cependant, car ce n'est pas au début.

60
Luc

~ est un suffixe commun ajouté aux noms de fichiers pour la sauvegarde ou les copies temporaires de fichiers. Il peut s'agir d'une sauvegarde manuelle ou créée par un éditeur ou un autre outil.

Bien que la plupart des systèmes de fichiers n'aient pas de concept d '"extensions de fichier", de nombreux logiciels utilisent la partie d'un nom de fichier après le premier ou le dernier . pour déterminer le type de fichier et quoi en faire.

Dans ce cas, le serveur Web aura été configuré pour exécuter fichiers se terminant par .php, mais à servir le conten d'autres types de fichiers. Depuis .php~ semble être une "extension de fichier" différente, elle ne correspond pas à la règle à exécuter et vous recevez le code source. Cela vous permet à son tour de voir le contenu probable du script PHP qui aurait dû être exécuté (c'est-à-dire qu'il est probable que index.php~ a un contenu similaire à index.php), qui peut révéler des informations d'identification ou des indices sur d'autres exploits.

Le sysadmin hypothétique aurait dû faire deux choses pour éviter cela:

  1. Pas de fichiers de sauvegarde non conservés dans des répertoires mappés à des URL Web.
  2. Configuré le serveur Web pour répondre avec une erreur, plutôt que le contenu du fichier, pour les extensions de fichier non reconnues.
50
IMSoP

Vous avez découvert une faille de sécurité potentielle pour les applications Web.

Le scénario est le suivant:

  • Un serveur Web est configuré pour interpréter une certaine extension de fichier à l'aide d'un interpréteur de script (par exemple, PHP for .php des dossiers).
  • Certains éditeurs de texte stockent des copies de sauvegarde ou "de travail" du fichier que vous modifiez sous le même nom de fichier mais avec un tilde (~) a la fin. Un tilde signifie souvent "ceci est généré par le système, ne vous en faites pas".
  • Ces fichiers peuvent parfois rester une fois que vous avez terminé la modification, soit parce que l'éditeur n'est pas configuré pour les supprimer, soit si l'éditeur est tué sans se fermer correctement.
  • En ajoutant un tilde à la fin d'une URL, vous aurez peut-être la chance de tomber sur l'une de ces copies de sauvegarde qu'un webmaster a accidentellement quitté (ou téléchargée) sur son site de production en direct.
  • Le serveur Web ne l'interprétera pas à l'aide d'un interpréteur de script car l'extension est différente (par exemple, ce n'est pas ".php"), il revient donc à son comportement par défaut pour les extensions de fichier inconnues qui doit le servir de téléchargement de fichier.
  • Vous pouvez lire le code source de leur script.

Que cela soit d'une grande utilité est variable. Parfois, le code source peut contenir des éléments tels que les détails d'authentification pour les bases de données ou les services externes.

6
thomasrutter

Je joue sur www.example.com/index.php mais quand j'ai ajouté (~) à la fin: www.example.com/index.php~, un fichier avec le nom index.php a commencé le téléchargement.

Comme d'autres l'ont mentionné, de nombreux éditeurs de texte (notamment Emacs, je dirais) sauvegardent les versions antérieures des fichiers sur lesquels vous travaillez en créant un autre fichier dont le nom est le même que l'original mais avec un tilde ajouté.

Ce que les autres réponses n'ont pas suffisamment souligné, cependant, c'est que le fait que vous puissiez accéder à un tel fichier est la conséquence d'un mélange de contrôle de version incorrect ou construction et déploiement incorrects .

Contrôle de version incorrect (négligence des fichiers "ignorer")

Les systèmes de contrôle de version (VCS) ont des mécanismes pour configurer un référentiel afin que les noms de fichiers VCS qui correspondent aux modèles spécifiés soient ignorés. Le système de contrôle de version le plus populaire aujourd'hui est Git, et son mécanisme est fichiers spéciaux nommés .gitignore . La plupart des référentiels Git de code source devraient avoir un niveau supérieur .gitignore fichier contenant cette ligne:

*~

C'est un modèle qui dit à Git d'ignorer tous les fichiers dont le nom se termine par un tilde. Une erreur courante chez les développeurs est de ne pas maintenir ces fichiers avec diligence ou de les ignorer complètement. Par exemple, de nombreux IDE afficheront un avertissement lorsqu'ils trouveront des fichiers non suivis dans votre arborescence source et vous donneront la possibilité de dire à IDE de les ignorer. Vous ne devriez presque jamais utiliser cette option; à la place , déterminez ce qu'il faut mettre dans le fichier "ignorer" du dépôt afin que tout le monde qui le vérifie automatiquement soit configuré pour ne jamais archiver ces fichiers.

Une utilisation disciplinée de ces fichiers "ignorés" contribue grandement à vous protéger de nombreux autres problèmes de sécurité. Par exemple, ils peuvent vous aider à vous protéger contre le problème courant des développeurs qui archivent accidentellement des informations d'identification secrètes. Une pratique que j'ai trouvée utile consiste à adopter une disposition standard dans laquelle vos projets ont un répertoire désigné pour que les développeurs placent de tels fichiers. Vous pouvez ensuite configurer votre référentiel VCS de sorte que les fichiers de ce répertoire soient ignorés et concevoir votre application de sorte que les builds de développement obtiennent leur configuration à partir de là.

Processus de construction et de déploiement incorrects

L'autre élément susceptible de provoquer des problèmes comme celui-ci est les processus de génération et de déploiement qui propagent de manière incorrecte des fichiers tels que index.php~ Dans la question.

Quelques pratiques qui devraient être adoptées pour éviter cela:

  • Obtenez votre système de contrôle de version pour ignorer les fichiers en premier lieu, comme mentionné ci-dessus.
  • Avoir un système de construction automatisé qui vérifie périodiquement votre projet à partir du contrôle de code source, le construit et le conditionne pour le déploiement.
  • Ne modifiez jamais de fichiers dans le répertoire de travail du système de génération, afin que sa copie du référentiel source soit toujours propre. Respectez toujours la discipline selon laquelle les environnements de développement sont séparés des environnements de génération automatisés.
  • Ne créez jamais de versions à partir des environnements des développeurs.

Une autre astuce importante consiste à utiliser des outils de construction testés au combat pour créer vos projets, qui appliquent une disposition de projet rationnelle et ont une bonne histoire sur la façon d'identifier les fichiers qui doivent être empaquetés et ceux qui ne le sont pas. Les outils de construction pour de nombreuses langues, par exemple, au lieu de simplement archiver aveuglément tout dans votre référentiel source, copieront sélectivement les fichiers de celui-ci dans un répertoire temporaire, puis l'archiveront, de sorte que seuls les fichiers que l'outil sélectionné explicitement pour l'inclusion obtiennent inclus.

3
Luis Casillas