Maison >développement back-end >Tutoriel Python >Analyse des problèmes d'injection dans le moteur de template Python

Analyse des problèmes d'injection dans le moteur de template Python

高洛峰
高洛峰original
2017-02-11 13:16:221516parcourir

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)
&#39;<built-in function system>&#39;

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 = {
  &#39;SECRET_KEY&#39;: &#39;super secret key&#39;
}

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
&#39;Hello World&#39;

Et cela ne se limite pas seulement aux attributs, le code peut être exécuté.

>>> import os
>>> f"{os.system(&#39;ls&#39;)}"
bin   etc   lib   media  proc   run   srv   tmp   var
dev   home   linuxrc mnt   root   sbin   sys   usr
&#39;0&#39;

>>> f"{(lambda x: x - 10)(100)}"
&#39;90&#39;

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 !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn