Maison >développement back-end >Tutoriel Python >Analyse des problèmes d'injection dans le moteur de template Python
Cet article parle principalement de l'analyse du problème d'injection du moteur de template Python, ainsi que de la manière de l'éviter et de ce à quoi il faut prêter attention. Les amis dans le besoin peuvent s'y référer
A. Une vulnérabilité relativement populaire ces dernières années est Dans l'injection de moteurs de modèles tels que jinjia2, nous savons que la vulnérabilité existe en injectant certains formats d'instructions spécifiques du moteur de modèles, tels que {{1 1}} et en renvoyant 2. En fait, des problèmes similaires existent dans les chaînes natives Python, en particulier après l'ajout de la nouvelle chaîne f dans Python 3.6. Bien que l'utilisation ne soit pas encore claire, il convient de le noter.
Le % d'origine
userdata = {"user" : "jdoe", "password" : "secret" } passwd = raw_input("Password: ") if passwd != userdata["password"]: print ("Password " + passwd + " is wrong for user %(user)s") % userdata
Si l'utilisateur saisit %(mot de passe)s, il peut être obtenu le vrai mot de passe.
méthode de formatage liée
https://docs.python.org/3/library/functions.html#format
En plus de réécrire la charge utile ci-dessus sous forme d'impression ("Le mot de passe " passwd " est incorrect pour l'utilisateur {user}").format(**userdata), vous pouvez également
>>> import os >>> '{0.system}'.format(os) '<built-in function system>'
remplacera d'abord 0 par les paramètres au format, puis continuera à obtenir les attributs associés.
Mais il semble que je ne puisse obtenir que des attributs, mais pas exécuter des méthodes ? Mais certaines informations sensibles peuvent également être obtenues.
Exemple : http://www.php.cn/
CONFIG = { 'SECRET_KEY': 'super secret key' } class Event(object): def __init__(self, id, level, message): self.id = id self.level = level self.message = message def format_event(format_string, event): return format_string.format(event=event)
Si format_string est {event.__init__.__globals__[CONFIG ][SECRET_KEY]} peut divulguer des informations sensibles.
La chaîne f dans Python 3.6
Cette chaîne est très puissante, similaire à la chaîne modèle dans Javascript ES6, avec la possibilité d'obtenir des variables dans le contexte actuel.
https://docs.python.org/3/reference/lexical_analysis.html#f-strings
>>> a = "Hello" >>> b = f"{a} World" >>> b 'Hello World'
Et cela ne se limite pas seulement aux attributs, le code peut être exécuté.
>>> import os >>> f"{os.system('ls')}" bin etc lib media proc run srv tmp var dev home linuxrc mnt root sbin sys usr '0' >>> f"{(lambda x: x - 10)(100)}" '90'
Mais il ne semble y avoir aucun moyen de convertir une chaîne ordinaire en f-string, ce qui signifie que l'utilisateur ne pourra peut-être pas contrôler une f-string. Elle n'est peut-être pas disponible, vous devez donc continuer à vérifier.
Pour plus d'articles liés à l'analyse des problèmes d'injection du moteur de modèles Python, veuillez faire attention au site Web PHP chinois !