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

高洛峰
Libérer: 2017-02-11 13:16:22
original
1523 Les gens l'ont consulté

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
Copier après la connexion

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;
Copier après la connexion

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)
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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 !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal