Inhaltsverzeichnis
Kernproblem
Was ist das Problem?
Gefahrenstufe
Sandbox-Formatierung
Zusammenfassung:
Heim Backend-Entwicklung Python-Tutorial Analyse der Schwachstellen und Lösungen im neuen String-Format von Python

Analyse der Schwachstellen und Lösungen im neuen String-Format von Python

Aug 16, 2017 pm 01:47 PM
python 字符串 漏洞

Kürzlich ist mir eine Sicherheitslücke bei der Formatierung von Zeichenfolgen aufgefallen. Ich habe eine ausführliche Analyse durchgeführt und entsprechende Sicherheitsmaßnahmen bereitgestellt.

Wenn wir str.format für nicht vertrauenswürdige Benutzereingaben verwenden, birgt dies Sicherheitsrisiken – ich kenne dieses Problem tatsächlich schon seit langem, habe aber bis heute nicht wirklich erkannt, wie schwerwiegend es ist. Da Angreifer damit die Jinja2-Sandbox umgehen können, führt dies zu ernsthaften Problemen mit Informationslecks. In der Zwischenzeit stelle ich am Ende dieses Artikels eine neue sichere Version von str.format bereit.

Es sollte daran erinnert werden, dass dies ein ziemlich ernstes Sicherheitsrisiko darstellt. Der Grund, warum ich hier einen Artikel schreibe, ist, dass die meisten Menschen wahrscheinlich nicht wissen, wie einfach es ist, es auszunutzen.

Kernproblem

Ab Python 2.6 hat Python eine neue Syntax zum Formatieren von Zeichenfolgen eingeführt, die von .NET inspiriert ist. Natürlich unterstützen neben Python auch Rust und einige andere Programmiersprachen diese Syntax. Diese Syntax kann dank der Methode .format() sowohl auf Byte- als auch auf Unicode-Strings angewendet werden (in Python 3 nur auf Unicode-Strings) und kann auch auf anpassbarere Strings abgebildet werden.

Ein Merkmal dieser Syntax besteht darin, dass sie es ermöglicht, die Positions- und Schlüsselwortargumente des String-Formats zu bestimmen und die Datenelemente jederzeit explizit neu anzuordnen. Darüber hinaus kann es sogar auf die Eigenschaften und Datenelemente des Objekts zugreifen – was hier die Hauptursache für das Sicherheitsproblem darstellt.

Insgesamt kann man dies ausnutzen, um Folgendes zu tun:

>>> 'class of {0} is {0.__class__}'.format(42)
"class of 42 is "
Nach dem Login kopieren

Im Wesentlichen hat jeder, der die Kontrolle über die Formatzeichenfolge hat, die Möglichkeit, auf verschiedene interne Eigenschaften des Objekts zuzugreifen.

Was ist das Problem?

Die erste Frage ist, wie man die Formatzeichenfolge steuert. Sie können an folgenden Stellen beginnen:

1. Nicht vertrauenswürdiger Übersetzer in der String-Datei. Wir werden wahrscheinlich damit durchkommen, da viele in mehrere Sprachen übersetzte Anwendungen diese neue Python-String-Formatierungsmethode verwenden, aber nicht jeder wird eine gründliche Überprüfung aller eingegebenen Strings durchführen.

2. Vom Benutzer bereitgestellte Konfiguration. Da einige Systembenutzer bestimmte Verhaltensweisen konfigurieren können, werden diese Konfigurationen möglicherweise in Form von Formatzeichenfolgen angezeigt. Besonders hervorzuheben ist, dass einige Benutzer Benachrichtigungs-E-Mails, Protokollnachrichtenformate oder andere grundlegende Vorlagen über die Webanwendung konfiguriert haben.

Gefahrenstufe

Wenn Sie nur das C-Interpreterobjekt an die Formatzeichenfolge übergeben, besteht keine große Gefahr, da Sie in diesem Fall höchstens einige ganzzahlige Klassen offenlegen.

Sobald jedoch ein Python-Objekt an diese Formatzeichenfolge übergeben wird, wird es problematisch. Das liegt daran, dass die Menge an Dingen, die von Python-Funktionen bereitgestellt werden können, ziemlich atemberaubend ist. Hier ist ein Szenario für eine hypothetische Webanwendung, die den Schlüssel preisgeben könnte:

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)
Nach dem Login kopieren

Wenn der Benutzer hier format_string einfügen könnte, würde er so etwas wie diese geheime Zeichenfolge finden:

{event.__init__.__globals__[CONFIG][SECRET_KEY]}
Nach dem Login kopieren

Sandbox-Formatierung

Was ist, wenn Sie jemand anderen benötigen, der die Formatierungszeichenfolge bereitstellt? Tatsächlich können einige undokumentierte interne Mechanismen verwendet werden, um das Verhalten der Zeichenfolgenformatierung zu ändern.

from string import Formatter
from collections import Mapping
 
class MagicFormatMapping(Mapping):
    """This class implements a dummy wrapper to fix a bug in the Python
    standard library for string formatting.
 
    See http://bugs.python.org/issue13598 for information about why
    this is necessary.
    """
 
    def __init__(self, args, kwargs):
        self._args = args
        self._kwargs = kwargs
        self._last_index = 0
 
    def __getitem__(self, key):
        if key == '':
            idx = self._last_index
            self._last_index += 1
            try:
                return self._args[idx]
            except LookupError:
                pass
            key = str(idx)
        return self._kwargs[key]
 
    def __iter__(self):
        return iter(self._kwargs)
 
    def __len__(self):
        return len(self._kwargs)
 
# This is a necessary API but it's undocumented and moved around
# between Python releases
try:
    from _string import formatter_field_name_split
except ImportError:
    formatter_field_name_split = lambda \
        x: x._formatter_field_name_split()
{C} 
class SafeFormatter(Formatter):
 
    def get_field(self, field_name, args, kwargs):
        first, rest = formatter_field_name_split(field_name)
        obj = self.get_value(first, args, kwargs)
        for is_attr, i in rest:
            if is_attr:
                obj = safe_getattr(obj, i)
            else:
                obj = obj[i]
        return obj, first
 
def safe_getattr(obj, attr):
    # Expand the logic here.  For instance on 2.x you will also need
    # to disallow func_globals, on 3.x you will also need to hide
    # things like cr_frame and others.  So ideally have a list of
    # objects that are entirely unsafe to access.
    if attr[:1] == '_':
        raise AttributeError(attr)
    return getattr(obj, attr)
 
def safe_format(_string, *args, **kwargs):
    formatter = SafeFormatter()
    kwargs = MagicFormatMapping(args, kwargs)
    return formatter.vformat(_string, args, kwargs)
Nach dem Login kopieren

Jetzt können wir die Methode „safe_format“ verwenden, um str.format zu ersetzen:

>>> '{0.__class__}'.format(42)
""
>>> safe_format('{0.__class__}', 42)
Traceback (most recent call last):
  File "", line 1, in
AttributeError: __class__
Nach dem Login kopieren

Zusammenfassung:

In der Programmentwicklung gibt es so ein Sprichwort: „any“. Vertrauen Sie niemals Benutzereingaben! Nun scheint es, dass dieser Satz vollkommen Sinn ergibt. Also Studierende, bitte behaltet dies im Hinterkopf!

Das obige ist der detaillierte Inhalt vonAnalyse der Schwachstellen und Lösungen im neuen String-Format von Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP und Python: Code Beispiele und Vergleich PHP und Python: Code Beispiele und Vergleich Apr 15, 2025 am 12:07 AM

PHP und Python haben ihre eigenen Vor- und Nachteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1.PHP eignet sich für eine schnelle Entwicklung und Wartung großer Webanwendungen. 2. Python dominiert das Gebiet der Datenwissenschaft und des maschinellen Lernens.

Wie man ein Pytorch -Modell auf CentOS trainiert Wie man ein Pytorch -Modell auf CentOS trainiert Apr 14, 2025 pm 03:03 PM

Effizientes Training von Pytorch -Modellen auf CentOS -Systemen erfordert Schritte, und dieser Artikel bietet detaillierte Anleitungen. 1.. Es wird empfohlen, YUM oder DNF zu verwenden, um Python 3 und Upgrade PIP zu installieren: Sudoyumupdatepython3 (oder sudodnfupdatepython3), PIP3Install-upgradepip. CUDA und CUDNN (GPU -Beschleunigung): Wenn Sie Nvidiagpu verwenden, müssen Sie Cudatool installieren

Wie ist die GPU -Unterstützung für Pytorch bei CentOS? Wie ist die GPU -Unterstützung für Pytorch bei CentOS? Apr 14, 2025 pm 06:48 PM

Aktivieren Sie die Pytorch -GPU -Beschleunigung am CentOS -System erfordert die Installation von CUDA-, CUDNN- und GPU -Versionen von Pytorch. Die folgenden Schritte führen Sie durch den Prozess: Cuda und Cudnn Installation Bestimmen Sie die CUDA-Version Kompatibilität: Verwenden Sie den Befehl nvidia-smi, um die von Ihrer NVIDIA-Grafikkarte unterstützte CUDA-Version anzuzeigen. Beispielsweise kann Ihre MX450 -Grafikkarte CUDA11.1 oder höher unterstützen. Download und installieren Sie Cudatoolkit: Besuchen Sie die offizielle Website von Nvidiacudatoolkit und laden Sie die entsprechende Version gemäß der höchsten CUDA -Version herunter und installieren Sie sie, die von Ihrer Grafikkarte unterstützt wird. Installieren Sie die Cudnn -Bibliothek:

Detaillierte Erklärung des Docker -Prinzips Detaillierte Erklärung des Docker -Prinzips Apr 14, 2025 pm 11:57 PM

Docker verwendet Linux -Kernel -Funktionen, um eine effiziente und isolierte Anwendungsumgebung zu bieten. Sein Arbeitsprinzip lautet wie folgt: 1. Der Spiegel wird als schreibgeschützte Vorlage verwendet, die alles enthält, was Sie für die Ausführung der Anwendung benötigen. 2. Das Union File System (UnionFS) stapelt mehrere Dateisysteme, speichert nur die Unterschiede, speichert Platz und beschleunigt. 3. Der Daemon verwaltet die Spiegel und Container, und der Kunde verwendet sie für die Interaktion. 4. Namespaces und CGroups implementieren Container -Isolation und Ressourcenbeschränkungen; 5. Mehrere Netzwerkmodi unterstützen die Containerverbindung. Nur wenn Sie diese Kernkonzepte verstehen, können Sie Docker besser nutzen.

Python gegen JavaScript: Community, Bibliotheken und Ressourcen Python gegen JavaScript: Community, Bibliotheken und Ressourcen Apr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

So wählen Sie die Pytorch -Version unter CentOS aus So wählen Sie die Pytorch -Version unter CentOS aus Apr 14, 2025 pm 02:51 PM

Bei der Auswahl einer Pytorch -Version unter CentOS müssen die folgenden Schlüsselfaktoren berücksichtigt werden: 1. Cuda -Version Kompatibilität GPU -Unterstützung: Wenn Sie NVIDIA -GPU haben und die GPU -Beschleunigung verwenden möchten, müssen Sie Pytorch auswählen, der die entsprechende CUDA -Version unterstützt. Sie können die CUDA-Version anzeigen, die unterstützt wird, indem Sie den Befehl nvidia-smi ausführen. CPU -Version: Wenn Sie keine GPU haben oder keine GPU verwenden möchten, können Sie eine CPU -Version von Pytorch auswählen. 2. Python Version Pytorch

Wie man eine verteilte Schulung von Pytorch auf CentOS betreibt Wie man eine verteilte Schulung von Pytorch auf CentOS betreibt Apr 14, 2025 pm 06:36 PM

Pytorch Distributed Training on CentOS -System erfordert die folgenden Schritte: Pytorch -Installation: Die Prämisse ist, dass Python und PIP im CentOS -System installiert sind. Nehmen Sie abhängig von Ihrer CUDA -Version den entsprechenden Installationsbefehl von der offiziellen Pytorch -Website ab. Für CPU-Schulungen können Sie den folgenden Befehl verwenden: PipinstallTorChTorChVisionTorChaudio Wenn Sie GPU-Unterstützung benötigen, stellen Sie sicher, dass die entsprechende Version von CUDA und CUDNN installiert ist und die entsprechende Pytorch-Version für die Installation verwenden. Konfiguration der verteilten Umgebung: Verteiltes Training erfordert in der Regel mehrere Maschinen oder mehrere Maschinen-Mehrfach-GPUs. Ort

So installieren Sie Nginx in CentOS So installieren Sie Nginx in CentOS Apr 14, 2025 pm 08:06 PM

Die Installation von CentOS-Installationen erfordert die folgenden Schritte: Installieren von Abhängigkeiten wie Entwicklungstools, PCRE-Devel und OpenSSL-Devel. Laden Sie das Nginx -Quellcode -Paket herunter, entpacken Sie es, kompilieren Sie es und installieren Sie es und geben Sie den Installationspfad als/usr/local/nginx an. Erstellen Sie NGINX -Benutzer und Benutzergruppen und setzen Sie Berechtigungen. Ändern Sie die Konfigurationsdatei nginx.conf und konfigurieren Sie den Hörport und den Domänennamen/die IP -Adresse. Starten Sie den Nginx -Dienst. Häufige Fehler müssen beachtet werden, z. B. Abhängigkeitsprobleme, Portkonflikte und Konfigurationsdateifehler. Die Leistungsoptimierung muss entsprechend der spezifischen Situation angepasst werden, z. B. das Einschalten des Cache und die Anpassung der Anzahl der Arbeitsprozesse.

See all articles