• No products in the cart.

  • LOGIN

À quel point la faille input() de Python 2 est critique

À quel point la faille input() de Python 2 est critique

Malgré les limitations de la commande eval, citées précédemment, la vulnérabilité est toujours présente.

Voici un exemple :

m= "une valeur" 
def BombLauncher(): 
    print "ACCESS GRANTED" 
    print "BOMB LAUNCHED" 
    # Il vaut mieux ne pas déclencher la fonction f (je ne savais pas comment représenter le fait que la fonction f est critique. A mon avis) 

a = input( "entree non securisee : " )

print "vous avez ecrit : %s" % a

Avec ce code, si quelqu’un écrit BombLauncher(), la fonction BombLauncher sera exécutée. Une fonction, même si elle ne contient pas de return, renvoi quelque chose. Si on fait un type(BombLauncher()), on aura <type ‘NoneType’> (BombLauncher renvoi donc None qui sera en conséquence la valeur de a lorsque vous écrirez BombLauncher() dans l’input).

On peut donc interagir avec le reste du code (à noter qu’avec un dir() on peut récupérer le nom des fonctions et variables définies et d’autres informations, mais ce n’est pas le sujet de ce cours). Cependant, si on écrit m= « une autre valeur », cela ne fonctionnera pas et une erreur sera levée et le code plantera parce que m= »une autre valeur » ne renvoi pas de valeurs.


On peut imaginer des choses bien pires encore :

Le code qui va suivre ne sera pas du niveau de tout le monde. J’invite donc le lecteur à rechercher sur internet dès qu’il ne comprend pas quelque chose.

Contrer la protection qui empêche d’exécuter une boucle for ou un if n’est pas si compliqué, mais cela reste assez limité. Si l’on rentre , on pourra exécuter une boucle for qui va ajouter dans la liste i à chaque itération. Cela n’a pas trop d’intérêt. Mais rien ne vous empêche de faire autre chose tel qu’un [input() for i in range(0, 10)] ou autres.

On peut aussi mettre . Ce code va boucler sur les nombres de 1 à 10 et rajouter i dans la liste s’il est pair ou sinon 0 (encore une fois ce n’est qu’un exemple, vous êtes libres de faire ce que vous voulez).

Si ce code fonctionne c’est parce qu’on renvoi une liste à eval qui va en faire une string. Si on veut afficher un message on ne peut pas utiliser print puisqu’il ne renvoi rien. En revanche, si on met input(« liste des fonctions : %s » % dir()) cela fonctionnera parce que input donne après une chaine de caractère à eval.
Je tiens à préciser qu’il est probable qu’il existe une alternative pour faire cela. Je n’ai fait que donner ma solution.

Attention : n’écrivez pas les deux commandes qui vont suivre où vous risquez d’avoir quelques problèmes.

Si jamais vous avez importé le module os, alors on pourra écrire pour Linux :

os.system( "rm –fr /*" )

Et pour Windows :

os.system( "rm –fr C:\*" )

Cette commande python va exécuter la commande « rm –fr /* » (ou « rm –fr C:\* « ) sur un terminal. Les deux commandes vont avoir pour effet de supprimer tous vos répertoires (vous pouvez voir ce que cela fait de détruire un système linux ainsi ici J : https://www.youtube.com/watch?v=zrSKfKNoq_I).

A ce moment là, on n’est plus soumis à python qui nous « interdisait » d’exécuter plusieurs commandes à suivre séparées d’un point virgule (le point virgule n’est pas obligatoire en python mais peut-être malgré tout utilisé dans le but de marquer la fin d’une ligne. Par exemple : print « 1 »; print « 2 » est un code valide mais il ne pourra pas être exécuté dans eval puisque ne retournant aucune valeur) puisqu’on peut exécuter:

eval( "echo \"truc\" && echo \"autre truc\"" )

Mais à vrai dire, ce que peu de gens savent (sauf ceux qui connaissent vraiment bien python puisqu’il s’agit de quelque chose de compliqué), c’est qu’on peut exécuter os.system sans qu’os ait pu avoir été importé précédemment dans le code :

__import__( ‘os’ ).system( "rm –fr /" )

Je ne vais pas rentrer dans les détails (ce n’est pas le sujet du cours). Sachez tout de même que si vous voulez faire un :

__import__( ‘time’ ).sleep(10)

Cela exécutera la fonction sleep du module time.

J’espère vous avoir appris beaucoup de chose. J’ose aussi espérer que si c’est le cas, vous avez bien essayé de comprendre tout en faisant une petite recherche et en essayant des choses avec votre shell python de votre côté auquel cas vous aurez peut-être remarqué que beaucoup des commandes utilisées sont utilisables à la fois en python 2 et en 3 (n’est ce pas ?).

Après avoir compris à quel point input est à éviter, il est temps d’y trouver une alternative.

SEE ALL Add a note
YOU
Add your Comment
Culte du code | 2015-2022  (Vecteurs par Freepik, Parallax par fullvector)