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 (~)?
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.
~
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:
Vous avez découvert une faille de sécurité potentielle pour les applications Web.
Le scénario est le suivant:
.php
des dossiers).~
) a la fin. Un tilde signifie souvent "ceci est généré par le système, ne vous en faites pas".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.
Je joue sur
www.example.com/index.php
mais quand j'ai ajouté (~) à la fin:www.example.com/index.php~
, un fichier avec le nomindex.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 .
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à.
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:
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.